Menu
Coddy logo textTech

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

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

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

Создайте время в конкретной временной зоне:

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

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

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

.atZone() прикрепляет часовой пояс к существующему локальному дата-времени, создавая ZonedDateTime.

Преобразование времени между зонами:

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

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

2024-03-15T10:30-04:00[America/New_York]
// Example output

Для форматирования ZonedDateTime используйте DateTimeFormatter. Буква шаблона Z или xxx форматирует смещение UTC (напр. +09:00), а VV форматирует идентификатор зоны (напр. Asia/Tokyo):

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm xxx");
String formatted = tokyo.format(formatter);
// Example: 2024-03-15 10:30 +09:00
challenge icon

Задание

Легко

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

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

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

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

Сообщения возврата должны быть:

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

Шпаргалка

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

Создайте время в конкретном часовом поясе:

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

Преобразуйте LocalDateTime в ZonedDateTime с помощью .atZone():

LocalDateTime local = LocalDateTime.now();
ZonedDateTime zoned = local.atZone(ZoneId.of("Asia/Tokyo"));

Преобразование времени между поясами:

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

Форматируйте ZonedDateTime, включая смещение UTC, с помощью шаблонов Z или xxx:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm xxx");
String formatted = zoned.format(formatter);
// Example: 2024-03-15 10:30 +09:00

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

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Проверьте себя

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

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