2016-12-13 6 views
0

я получаю форму времени сервера в следующем формате:Fetching часового пояса с даты сервера

«2016-12-13T03: 03: 49.572-08: 00», это не в формате UCT. Мне нужно преобразовать его в мой местный часовой пояс. Если я добавлю TimeZone.getTimeZone («America/Los_Angeles») явно и сделаю преобразование, чем это происходит хорошо, но я не хочу, чтобы этот жесткий код выглядел так, как может измениться местоположение сервера. Есть ли способ конвертировать дату в формате строки в UCT, а затем преобразовать в местный часовой пояс? или как преобразовать в местный формат времени для этого конкретного случая. (В JAVA)

+0

См. Это http://stackoverflow.com/questions/22091107/get-date-object-in-utc-format-in-java. Вы можете использовать TimeZone.getDefault() для получения локального часового пояса – pringi

+3

Непонятно, что вы здесь задаете. Что вы подразумеваете под «форматом UCT»? Если вы имеете в виду UTC, а не UCT, вам нужно отделить часовые пояса (и смещения) от строковых форматов - они не совпадают. Вы можете легко конвертировать «2016-12-13T03: 03: 49.572-08: 00» в «Date» или «Instant», а затем конвертировать их в любой часовой пояс, который вы хотите. –

+0

Приятно, если вы отправите дату в https://en.wikipedia.org/wiki/ISO_8601 с информацией о часовом поясе, тогда проще перейти на LocalTimeZone. ИЛИ вы получаете информацию о часовом поясе сервера в качестве другого источника? – Nagaraddi

ответ

1

Вы можете разобрать строку с этим миром кода:

Date d = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX") 
      .parse("2016-12-13T03:03:49.572-08:00"); 

Затем вы можете распечатать полученную дату с этим миром кода во временной зоне текущей виртуальной машины (которая является то, что из «сервер», если код работает на «сервер»):

System.out.println(
      new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX") 
       .format(d)); 

на моем компьютере в результате Выход

2016-12-13T12:03:49.572+01:00 

с тех пор, как я живу в Германии.

Конечно, вы можете сделать Формат вывода по своему усмотрению, если вы измените для него строку формата. Для этого прочитайте класс javadoc для SimpleDateFormat. . вы можете использовать

System.out.println(
      new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS") 
       .format(d)); 

, чтобы получить более читаемый человеком вывод.

Если ваш код не работает на сервере, вы где-то должны знать часовой пояс. Затем вы можете написать, например.

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); 
    format.setTimeZone(TimeZone.getTimeZone("America/Los_Angeles")); 
    System.out.println(format.format(d)); 
+0

FYI, старые классы времени, такие как ['java.util.Date'] (https://docs.oracle.com/javase/8/docs/api/java/util/Date.html), [' java.util.Calendar'] (https://docs.oracle.com/javase/8/docs/api/java/util/Date.html), а 'java.text.SimpleTextFormat' теперь [legacy] (https : //en.wikipedia.org/wiki/Legacy_system), вытесненный [java.time] (https://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html). –

1

Т.Л., д-р

OffsetDateTime.parse("2016-12-13T03:03:49.572-08:00") 
       .toZoneSameInstant(ZoneId.of("Pacific/Auckland")) 

UTC

Я предполагаю, что вы имели в виду UTC, а не UCT.

Смещение против зоны

offset-from-UTC An является количество часов, минут & & секунд. Пример: -08:00 на восемь часов меньше UTC, например, на большей части западного побережья Северной Америки (и в других местах).

Часовой пояс - это смещение plus набор правил для обработки аномалий, таких как переход на летнее время (DST). Укажите proper time zone name в формате continent/region, например America/Montreal, Africa/Casablanca или Pacific/Auckland. Никогда не используйте аббревиатуру 3-4 буквы, такую ​​как EST или IST, так как они не настоящие часовые пояса, не стандартизированные, и даже не уникальные (!).

Вы не можете вывести зону из смещения. Вы можете угадать, но это было бы неразумно. Если вы хотите знать предполагаемый часовой пояс, вы должны спросить и быть проинформированы явно.

Именно поэтому метод ZonedDateTime::toString разумно расширяет стандартный ISO 8601 формат YYYY-MM-DDTHH:MM:SS.S…Z, чтобы добавить название зоны в квадратных скобках. Например, 2016-12-13T03:03:49.572-08:00[America/Los_Angeles].

OffsetDateTime & ZonedDateTime

Ваша входная строка отсутствует какая-либо информация о зоне, только смещение. Итак, мы анализируем как OffsetDateTime.

OffsetDateTime odt = OffsetDateTime.parse("2016-12-13T03:03:49.572-08:00"); 

Если вы хотите увидеть, что в режиме настенных часов в любой конкретной зоне отрегулируйте.

ZoneId zLosAngeles = ZoneId.of("America/Los_Angeles"); 
ZonedDateTime zdtLosAngeles = odt.atZoneSameInstant(zLosAngeles); 

Вы можете настроить любую зону.

ZoneId zAuckland = ZoneId.of("Pacific/Auckland"); 
ZonedDateTime zdtAuckland = odt.atZoneSameInstant(zAuckland); 

Вы всегда можете извлечь основную ценность в UTC, Instant. Все три из этих toInstant вызовов приводят к тому же значению, указанному выше.

Instant instant = odt.toInstant(); 
Instant instant = zdtLosAngeles.toInstant(); 
Instant instant = zdtAuckland.toInstant(); 

Советы:

  • Обычно лучше всего работать в UTC. Храните и обменивайтесь данными в UTC, и думайте в UTC. Подумайте о UTC как о «Едином истинном времени», все смещения и зоны - всего лишь variations on the theme.
  • При сериализации значений даты и времени для текста используйте стандартные форматы ISO 8601. Это их цель, и они хорошо разработаны: недвусмысленны, интуитивно понятны в разных культурах и легко разбираются.

О java.time

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

Проект Joda-Time, в настоящее время в maintenance mode, советует перейти на классы java.time.

Чтобы узнать больше, см. Oracle Tutorial. И поиск Stack Overflow для многих примеров и объяснений. Спецификация: 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
    • Проект ThreeTenABP адаптирует ThreeTen-Backport (как упоминалось выше) для Android специально.
    • См. How to use….

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

Смежные вопросы