Используя время Joda, чтобы получить текущее время стены для данного часового пояса

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

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

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

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

Update: Это на самом деле было оскорблением от моего имени. У меня было рассчитанное смещение 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

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

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

Ответ 1

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

DateTime(DateTimeZone zone) 

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

Ответ 2

Как насчет:

DateTime utc = new DateTime(DateTimeZone.UTC);
DateTimeZone tz = DateTimeZone.forID("America/Los_Angeles");
DateTime losAngelesDateTime = utc.toDateTime(tz);

Ответ 3

Самый чистый метод

Я считаю, что это самый чистый метод.

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

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

Использование System TimeZone

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

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