Да, вы должны использовать либо Joda-Time, либо новый пакет java.time в Java 8 (вдохновленный Joda-Time).
Смещение - это число часов и минут от UTC (GMT), которое представлено определенным значением даты-времени. Западное побережье - -08: 00 (игнорирование ловкости летнего времени), что составляет 8 часов меньше, чем в UTC.
Остерегайтесь того, что java.time в своем первоначальном выпуске имеет небольшую ошибку, где он не может обрабатывать смещение всего часов (например, +08
) без минут (например, +08:00
).
time zone является смещением плюса правил о летнем время (DST), история изменений ДСТА, а также информации о других аномалиях.
Использовать надлежащим образом time zone names (в основном на континенте). Избегайте 3 или 4 буквенных кодов, таких как EST, которые не являются ни стандартизированными, ни уникальными.
У java.util.Date нет часового пояса, в то время как Joda-Time DateTime.
Чтобы получить часовой пояс веб-браузера, см. this question. Но часто это плохо работает. Как вы, наверное, видели, многие веб-сайты просят пользователя выбрать часовой пояс.
Ваш конкретный прецедент запутан. Как правило, наилучшим подходом является использование дат-времени для UTC, а затем, при необходимости, приспосабливаться к местному времени пользователя. Обычно лучше всего для вашего программного обеспечения работать и хранить даты-время в формате UTC. Затем укажите локальный дата-время, скорректированный в соответствии с требованиями пользователя. Другими словами, думайте по всему миру (UTC), находясь локально (локальный часовой пояс настроен).
Обычно системные администраторы сохраняют свои серверные компьютеры в UTC (без смещения часового пояса). Если ваша ОС (например, Mac OS X) не предлагает UTC, используйте Reykjavik
, так как Исландия использует UTC круглый год без летнего времени. Аналогично, базы данных почти всегда конвертируют значения даты и времени в UTC для хранения.
Joda-Time предлагает класс LocalDate, если вам действительно не нравится часовой пояс или время. Но часто лучше использовать дату-дату (экземпляр DateTime) и форматировать строку даты только по мере необходимости.
Пример кода в Joda-Time 2.3.
DateTimeZone timeZoneChina = DateTimeZone.forID("Asia/Shanghai");
DateTime dateTimeChina = new DateTime(2013, 8, 29, 17, 45, 00, timeZoneChina);
DateTime dateTimeUtc = dateTimeChina.withZone(DateTimeZone.UTC);
DateTime dateTimeParis = dateTimeChina.withZone(DateTimeZone.forID("Europe/Paris"));
DateTimeZone timeZoneUsWestCoast = DateTimeZone.forID("America/Los_Angeles");
DateTime dateTimeUnitedStatesWestCoast = dateTimeChina.withZone(timeZoneUsWestCoast);
DateTimeFormatter formatter = ISODateTimeFormat.date();
String outputDateOnlyForUnitedStatesWestCoast = formatter.withZone(timeZoneUsWestCoast).print(dateTimeUtc);
самосвала утешать ...
System.out.println("dateTimeChina: " + dateTimeChina);
System.out.println("dateTimeUtc: " + dateTimeUtc);
System.out.println("dateTimeParis: " + dateTimeParis);
System.out.println("dateTimeUnitedStatesWestCoast: " + dateTimeUnitedStatesWestCoast);
System.out.println("outputDateOnlyForUnitedStatesWestCoast: " + outputDateOnlyForUnitedStatesWestCoast);
При запуске ...
dateTimeChina: 2013-08-29T17:45:00.000+08:00
dateTimeUtc: 2013-08-29T09:45:00.000Z
dateTimeParis: 2013-08-29T11:45:00.000+02:00
dateTimeUnitedStatesWestCoast: 2013-08-29T02:45:00.000-07:00
outputDateOnlyForUnitedStatesWestCoast: 2013-08-29
Да, я слышал Joda это очень мощный инструмент, но вы можете сказать мне более конкретные вещи? Например, как использовать joda процесс моего дела? – Chailie