Установка временной зоны для java.util.Date в Java
Быстрый ответ
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
sdf.setTimeZone(TimeZone.getTimeZone("America/New_York"));
Date now = new Date();
String nyTime = sdf.format(now);
System.out.println(nyTime);
Не забывайте: java.util.Date
хранит время в UTC, мы лишь форматируем его для отображения в нужной временной зоне.
Разбор дат: подаем под правильным соусом
Для корректного чтения строкового представления даты нам потребуется надежный парсер:
String input = "2023-04-05 10:30:00";
SimpleDateFormat parser = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
parser.setTimeZone(TimeZone.getTimeZone("Europe/London"));
try {
Date parsedDate = parser.parse(input);
} catch (ParseException e) {
e.printStackTrace();
}
Отображение дат в разных временных зонах: настало время представления!
Мы можем преобразовать и показать дату в выбранной временной зоне:
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
formatter.setTimeZone(TimeZone.getTimeZone("Asia/Tokyo"));
String tokyoTime = formatter.format(parsedDate);
Современный API для работы с датами: управление временем стало проще
Для работы с датами удобнее использовать новый модуль java.time
:
import java.time.*;
LocalDateTime ldt = LocalDateTime.parse(input, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
ZonedDateTime zdt = ldt.atZone(ZoneId.of("Europe/London"));
ZonedDateTime converted = zdt.withZoneSameInstant(ZoneId.of("Asia/Tokyo"));
Путешествие с препятствиями
Системная временная зона: незаметный управляющий
Системная временная зона влияет на обработку времени в приложении. Изменение ее через TimeZone.setDefault()
может повлечь непредсказуемые последствия.
Названия временных зон: Бал имен нашей эры
"EST" может обозначать разные временные зоны. Чтобы избежать путаницы, используйте полные идентификаторы временных зон.
Летнее время: плавающий песок
Учтите измение времени при переходе на летнее и зимнее время, когда работаете с датами.
Проверка формата даты
Сверьте формат строки с ожидаемым перед ее разбором.
Визуализация
Отношение между java.util.Date
и временными зонами можно представить как отношение между снимком и его фоном:
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
Дата (📷) | Временная зона (Фон) | Полное отображение |
---|---|---|
Текущий момент времени | GMT | "2023-04-05 10:20:30" |
Текущий момент времени | EST | "2023-04-05 05:20:30" |
Альтернативы и методы: выберите свой инструмент
Joda-Time: предтеча java.time
До появления java.time
широкое распространение имел Joda-Time:
import org.joda.time.*;
DateTime dt = new DateTime(input, DateTimeZone.forID("Europe/London"));
DateTime convertedDt = dt.withZone(DateTimeZone.forID("Asia/Tokyo"));
Установка временной зоны JVM: сила требует осторожности
Используйте с осторожностью параметр -Duser.timezone="TimeZoneID"
при запуске JVM, это может иметь глобальное влияние.
Ручное преобразование временных зон: к звездам через тернии
Вы можете производить преобразования временных зон вручную, но будьте готовы к трудностям, особенно при учете летнего времени.
Полезные материалы
- Date (Java Platform SE 8) — Обзор класса Date.
- How to set time zone of a java.util.Date? – Stack Overflow — Обсуждение реального случая.
- Calendar (Java Platform SE 7) — Устаревший способ работы с датами.
- TimeZone (Java Platform SE 8) — Детали о классе TimeZone.
- Java.util.TimeZone Class – Tutorialspoint — Руководство по работе с временными зонами для начинающих.
- SimpleDateFormat (Java Platform SE 8) — Как форматировать дату в строку.