трехбуквенные коды часового пояса
Избегайте использования кодов трехбуквенные часового пояса. Они не являются ни стандартизированными, ни уникальными. Например, IST
означает и индийское стандартное время и Ирландское стандартное время. Кроме того, коды предназначены для различения летнего времени (DST), но это только путает вопросы.
Используйте правильный descriptive time zone names для извлечения объекта часового пояса, который включает в себя DST и другие проблемы.
Joda времени
В java.util.Date & Календарь классы в комплекте с 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.время
Такая же идея использует классы java.time, которые вытесняют Joda-Time.
Класс Instant
представляет собой момент на временной шкале в UTC с разрешением nanoseconds (до девяти (9) цифр десятичной дроби).
Instant instant = Instant.now();
Применение часового пояса.
ZoneId z = ZoneId.of("America/Montreal");
ZonedDateTime zdt = instant.atZone(z);
instant
и zdt
представляют собой один и тот же момент, ту же точку на временной шкале. Каждый из них просматривается через объектив другого региона wall-clock time.
Создайте строку, указав шаблон форматирования или давая java.time автоматически локализовать.
Для локализации, указать:
FormatStyle
, чтобы определить, как долго или сокращенно должна быть строка.
Locale
определить (а) человеческий язык для перевода имени дня, названия месяца и т. Д. И (b) культурные нормы, определяющие вопросы сокращения, капитализации, пунктуации и т. Д.
Пример:
Locale l = Locale.CANADA_FRENCH ;
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL).withLocale(l);
String output = zdt.format(f);
Не могли бы вы просто использовать [Joda Time] (http://joda-time.sourceforge.net/)? –