трехбуквенные коды часовых поясов
Избегайте использования трехбуквенных кодов часовых поясов. Они не стандартизированы и не уникальны. Например, IST
означает и стандартное время Индии и ирландское стандартное время. Кроме того, коды предназначены для различения летнего времени (DST), но это только сбивает с толку.
Используйте правильные описательные имена часовых поясов , чтобы извлечь объект часового пояса, который охватывает DST и другие проблемы.
Joda-Time
Классы java.util.Date и Calendar в комплекте с Java, как известно, доставляют много хлопот. Избежать их. Используйте Joda-Time или новый пакет java.time. * В комплекте с Java 8.
В JodaTime объект DateTime действительно знает свой собственный часовой пояс (в отличие от java.util.Date). Обычно мы используем неизменяемые классы в Joda-Time. Таким образом, вместо изменения часового пояса в объекте DateTime, мы создаем новый новый DateTime объект, основанный на старом, но с указанной разницей. Разница может быть в другом часовом поясе.
Вот пример кода.
DateTimeZone timeZone_India = DateTimeZone.forID( "Asia/Kolkata" );
DateTimeZone timeZone_Ireland = DateTimeZone.forID( "Europe/Dublin" );
DateTimeZone timeZone_US_West_Coast = DateTimeZone.forID( "America/Los_Angeles" );
DateTime now = new DateTime( timeZone_India );
System.out.println( "now in India: " + now );
System.out.println( "now in Ireland: " + now.withZone( timeZone_Ireland ) );
System.out.println( "now in US West Coast: " + now.withZone( timeZone_US_West_Coast ) );
System.out.println( "now in UTC/GMT: " + now.withZone( DateTimeZone.UTC ) );
При запуске…
now in India: 2014-02-10T13:52:27.875+05:30
now in Ireland: 2014-02-10T08:22:27.875Z
now in US West Coast: 2014-02-10T00:22:27.875-08:00
now in UTC/GMT: 2014-02-10T08:22:27.875Z
java.time
Та же идея с использованием классов java.time, которые вытесняют Joda-Time.
Класс Instant
представляет момент на временной шкале в UTC с разрешением наносекунд (до девяти (9) цифр десятичного знака) фракция).
Instant instant = Instant.now();
Применение часового пояса.
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );
instant
и zdt
представляют один и тот же момент, одну и ту же точку на временной шкале. Каждый виден сквозь линзу времени настенного времени другого региона .
Создайте строку, указав шаблон форматирования или позволив java.time автоматически локализоваться.
Для локализации укажите:
FormatStyle
для определения длины или сокращения строки.
Locale
для определения (а) человеческого языка для перевода названия дня, названия месяца и т. Д. И (б) культурных норм, решающих вопросы сокращения, капитализации, пунктуации, и такие.
Пример:
Locale l = Locale.CANADA_FRENCH ;
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.FULL ).withLocale( l );
String output = zdt.format( f );