Преобразование даты из UTC в PST на Java - PullRequest
5 голосов
/ 20 мая 2011

Мне нужно преобразовать дату из часового пояса локального сервера Google App Engine в тихоокеанское время в Java.

Я пытался использовать

Calendar calstart =
Calendar.getInstance();

calstart.setTimeZone(TimeZone.getTimeZone("PST"));
//calstart.setTimeZone(TimeZone.getTimeZone("America/Los_Angeles"));

Date startTime = calstart.getTime();

, но это дает мне неправильное время (около 4 вечера, когда фактическое время PST - 10 вечера). Также пробовал закомментированную строку America/Los_Angeles, но выдает неверное время на сервере GAE.

Есть мысли / советы?

Ответы [ 3 ]

6 голосов
/ 20 мая 2011

Используя Joda Time , все, что вам нужно, это DateTime.withZone метод.Пример ниже:

public static Date convertJodaTimezone(LocalDateTime date, String srcTz, String destTz) {
    DateTime srcDateTime = date.toDateTime(DateTimeZone.forID(srcTz));
    DateTime dstDateTime = srcDateTime.withZone(DateTimeZone.forID(destTz));
    return dstDateTime.toLocalDateTime().toDateTime().toDate();
}

Совет: никогда не используйте API по умолчанию для вычислений, связанных со временем.Это просто ужасно.Joda, кажется, лучший API замены.

2 голосов
/ 21 мая 2011

Если вам не нужно делать какие-либо вычисления, то есть вы хотите отформатировать эту дату для отображения ее конечному пользователю, вы можете просто использовать DateFormat:

Date startTime = new Date(); // current date time
TimeZone pstTimeZone = TimeZone.getTimeZone("America/Los_Angeles");
DateFormat formatter = DateFormat.getDateInstance(); // just date, you might want something else
formatter.setTimeZone(pstTimeZone);
String formattedDate = formatter.format(startTime);

Однако, если вам действительно нужно преобразовать даты (что действительно редко), вы можете использовать следующий фрагмент кода:

TimeZone pacificTimeZone = TimeZone.getTimeZone("America/Los_Angeles");
long currentTime = new Date().getTime();
long convertedTime = currentTime +
    pacificTimeZone.getOffset(currentTime);

Это даст вам количество миллисекунд, прошедших с 1 января 1970 года в PST TimeZone. Вы можете легко создать объект Date с этой информацией.
Если вам нужно выполнять вычисления даты довольно часто, вы можете использовать DateUtils Apache Commons Lang . Или переключитесь на JodaTime, как предложено mdrg .

0 голосов
/ 20 января 2017

Никогда не зависит от часового пояса сервера

Никогда не полагайтесь и не полагайтесь на текущий часовой пояс JVM по умолчанию на сервере или хосте.

Всегда явно указывайте желаемый / ожидаемый часовой пояс, передаваемый в качестве необязательного аргумента.

java.time

Класс java.util.Calendar теперь унаследован, заменен классами java.time.

Получить текущий момент в UTC. Класс Instant представляет момент на временной шкале в UTC с разрешением наносекунд (до девяти (9) цифр десятичной дроби).

Instant instant = Instant.now();

instant.toString (): 2017-01-19T22: 01: 21,321Z

Если вы хотите просмотреть этот момент через объектив времени настенных часов определенного региона , примените ZoneId, чтобы получить ZonedDateTime.

Укажите собственное имя часового пояса в формате continent/region, например America/Montreal, Africa/Casablanca или Pacific/Auckland. Никогда не используйте 3-4-буквенное сокращение, например EST или PST или IST, так как они не истинные часовые пояса, не стандартизированы и даже не уникальны (!).

ZoneId z = ZoneId.of( "America/Los_Angeles" );
ZonedDateTime zdt = instant.atZone( z );

zdt.toString (): 2017-01-19T14: 01: 21.321-08: 00 [America / Los_Angeles]


О java.time

Фреймворк java.time встроен в Java 8 и более поздние версии. Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на классы java.time .

Чтобы узнать больше, см. Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .

Где взять классы java.time?

  • Java SE 8 и SE 9 и более поздние
    • Встроенный.
    • Часть стандартного Java API со встроенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и SE 7
    • Большая часть функциональности java.time перенесена на Java 6 и 7 в ThreeTen-Backport .
  • Android

Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти некоторые полезные классы, такие как Interval, YearWeek, YearQuarter и more .

...