Menu
CoddyTech

Работа с часовыми поясами

Часть раздела Логика и управление потоком путешествия по Java на Coddy. Урок 59 из 59.

ZonedDateTime в Java представляет дату и время с часовым поясом. Это полезно при работе с разными часовыми поясами или при преобразовании между ними.

Создайте время в определённой зоне:

ZonedDateTime tokyo = ZonedDateTime.now(ZoneId.of("Asia/Tokyo"));

Вы также можете создать ZonedDateTime из LocalDateTime с помощью .atZone():

LocalDateTime localDT = LocalDateTime.of(2024, 3, 15, 10, 30);
ZonedDateTime tokyo = localDT.atZone(ZoneId.of("Asia/Tokyo"));

Преобразуйте время между часовыми поясами:

ZonedDateTime newYork = tokyo.withZoneSameInstant(ZoneId.of("America/New_York"));

После выполнения приведённого выше кода newYork содержит тот же момент времени, что и tokyo, но в часовом поясе Нью-Йорка:

2024-03-15T10:30-04:00[America/New_York]
// Пример вывода

Чтобы отформатировать ZonedDateTime, используйте DateTimeFormatter. Добавьте смещение с помощью шаблона xxx: он выводит +09:00 или -04:00, а нулевое смещение — как +00:00 (вместо этого заглавный XXX выводит Z для нулевого смещения):

// Без смещения
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
// Со смещением (например, +09:00 или -04:00)
DateTimeFormatter fmtWithOffset = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm xxx");
String result = newYork.format(fmtWithOffset);
// Пример: 2024-03-15 10:30 -04:00
challenge icon

Задание

Легко

Создай метод с именем convertTime, который принимает четыре аргумента:

  1. String (dateTimeStr) в формате "yyyy-MM-dd HH:mm"
  2. String (sourceZone) — идентификатор исходного часового пояса
  3. String (targetZone) — идентификатор целевого часового пояса
  4. boolean (showOffset) — нужно ли включать смещение часового пояса в вывод

Метод должен:

  1. Разобрать входные дату и время в исходном часовом поясе
  2. Преобразовать их в целевой часовой пояс
  3. Вернуть отформатированную информацию об обоих значениях времени

Возвращаемые сообщения должны быть следующими:

  • Если дата и время некорректны: вернуть "Invalid datetime format"
  • Если часовой пояс некорректен: вернуть "Invalid time zone"
  • Если showOffset имеет значение true: включить смещение в вывод, отформатировав его с помощью шаблона xxx, чтобы нулевое смещение выводилось как +00:00
  • Формат: "Source: [time1], Target: [time2]"

Попробуйте сами

import java.util.Scanner;
import java.time.*;
import java.time.format.*;

public class Main {
    public static String convertTime(String dateTimeStr, String sourceZone, 
                                   String targetZone, boolean showOffset) {
        // Напишите свой код здесь
    }
    
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String dateTimeStr = scanner.nextLine();
        String sourceZone = scanner.nextLine();
        String targetZone = scanner.nextLine();
        boolean showOffset = Boolean.parseBoolean(scanner.nextLine());
        
        System.out.println(convertTime(dateTimeStr, sourceZone, targetZone, showOffset));
    }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и управление потоком

Потренируйтесь самостоятельно: Онлайн-компилятор Java