Использование времени Joda для получения текущего времени стены для данного часового пояса - PullRequest
14 голосов
/ 08 февраля 2012

Требуется просто получить текущее время стены (, включая правильную настройку DST ) для данного часового пояса.

Похоже, что в SO есть несколько вопросов, связанных с этим, но я не могу найти прямого ответа (в SO, Joda doco или googling) с низким трением, чтобы получить время на стене. Кажется, что с данными входами (текущее время UTC и желаемая TZ) я должен быть в состоянии соединить несколько методов из библиотеки Joda Time, чтобы достичь того, чего я хочу, но в указанных примерах, похоже, есть желание оценить + обработать смещения / переходы в коде приложения - я хочу избежать этого, если это возможно, и просто приложить все усилия Jodas на основе набора статических доступных правил TZ.

Для целей этого вопроса давайте предположим, что я не буду использовать какие-либо сторонние сервисы (сетевые или другие двоичные файлы), только те, которые доступны из библиотеки JDK и JodaTime.

Любые указатели оценены.

Обновление: Это был на самом деле оплошность от моего имени. У меня было вычисленное смещение UTC на основе долготы запросов, хотя это работает, очевидно, вам все еще нужна региональная информация, чтобы получить правильную настройку DST ..

double aucklandLatitude = 174.730423;
int utcOffset = (int) Math.round((aucklandLatitude * DateTimeConstants.HOURS_PER_DAY) / 360);
System.out.println("Offset: " + utcOffset);

DateTimeZone calculatedDateTimeZone = DateTimeZone.forOffsetHours(utcOffset);
System.out.println("Calculated DTZ: " + calculatedDateTimeZone);
System.out.println("Calculated Date: " + new DateTime(calculatedDateTimeZone));
System.out.println();
DateTimeZone aucklandDateTimeZone = DateTimeZone.forID("Pacific/Auckland");
System.out.println("Auckland DTZ: " +  aucklandDateTimeZone);
System.out.println("Auckland Date: " + new DateTime(aucklandDateTimeZone));

печать

Offset: 12
Calculated DTZ: +12:00
Calculated Date: 2012-02-08T11:20:04.741+12:00

Auckland DTZ: Pacific/Auckland
Auckland Date: 2012-02-08T12:20:04.803+13:00

Так что здесь, в солнечном Окленде, Новая Зеландия мы +12, но +13 в период летнего времени.

Мой плохой. Спасибо за ответы, тем не менее, заставил меня увидеть мою ошибку.

Ответы [ 3 ]

18 голосов
/ 08 февраля 2012

Вы смотрели на конструктор DateTime:

DateTime(DateTimeZone zone) 

Это создает DateTime, представляющее текущее время в указанном часовом поясе.

14 голосов
/ 08 февраля 2012

Как насчет:

DateTime utc = new DateTime(DateTimeZone.UTC);
DateTimeZone tz = DateTimeZone.forID("America/Los_Angeles");
DateTime losAngelesDateTime = utc.toDateTime(tz);
10 голосов
/ 22 января 2014

Чистый метод

Я считаю, что следующий метод является самым чистым.

DateTime currentTime = DateTime.now( DateTimeZone.UTC );

Это возвращает вам текущее время в UTC , но это значение можно преобразоватьна другой DateTimeZone или вы можете заменить DateTimeZone.UTC другим DateTimeZone.

Использование системной временной зоны

Если вы хотите установить системный часовой пояс, вы можете использовать эту:

DateTime currentTime = DateTime.now( DateTimeZone.getDefault() );
...