DateTime ("2019-02-16T10: 00: 00 + 08: 00") преобразование в местное время даты со значением смещения - PullRequest
0 голосов
/ 01 марта 2019

Я получаю содержимое даты и времени в приведенном ниже строковом формате со значением времени смещения из исходной системы.

2019-02-16T10: 00: 00 + 08: 00

Где я хочу преобразовать это в местное время, используя значение смещения. Я попробовал следующее, но не получил ожидаемый результат.

DateTime date = new DateTime("2019-02-16T10:00:00+08:00");

-> output == 2019-02-16T02: 00: 00.000Z (время уменьшается, а не увеличивается)

DateTime date = new DateTime("2019-02-16T10:00:00-08:00");

-> output == 2019-02-16T18: 00: 00.000Z (час увеличивается, а не уменьшается).

Есть ли простой способ получения ожидаемого результата?Примечание: я использую Java 1.7

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Другой способ сделать это:

String dt =  "2019-02-16T10:00:00+08:00";
ZonedDateTime zd = ZonedDateTime.parse("2019-02-16T10:00:00+08:00");
System.out.println(zd.toLocalDateTime().plusSeconds(zd.getOffset().getTotalSeconds()));

Вывод

2019-02-16T18:00
0 голосов
/ 01 марта 2019

То, что вы делаете, правильно.Чтобы узнать время в вашем местном часовом поясе:

    DateTime date = new DateTime("2019-02-16T10:00:00+08:00");
    DateTime dateTimeInLocalTimeZone = date.withZone(DateTimeZone.getDefault());
    System.out.println(dateTimeInLocalTimeZone);

На моем компьютере в часовом поясе Европы / Копенгагена я получил

2019-02-16T03: 00: 00.000 + 01: 00

Как было сказано в комментариях, +08:00 - это смещение, которое уже было добавлено по сравнению с временем UTC.Итак, ваша строка обозначена в тот же момент времени как 2019-02-16T02:00:00+00:00.Он также может быть записан как 2019-02-16T02:00:00Z, поскольку Z (произносится «Зулу») означает UTC.

java.time и ThreeTen Backport

Если вы еще не привязаны к Joda-TimeВы можете предпочесть использовать java.time, современный API даты и времени Java.Код похож:

    OffsetDateTime sourceDateTime = OffsetDateTime.parse("2019-02-16T10:00:00+08:00");
    ZonedDateTime dateTimeInLocalTimeZone = sourceDateTime.atZoneSameInstant(ZoneId.systemDefault());

2019-02-16T03: 00 + 01: 00 [Европа / Копенгаген]

Вопрос: Могу ли я использовать java.timeна Java 1.7?

Примечание: я использую Java 1.7

Никаких больших проблем, java.time просто требует как минимум Java 6 .Я запустил приведенный выше код на jdk1.7.0_79.

  • В Java 8 и более поздних версиях и на более новых устройствах Android (от уровня API 26) современный API поставляется встроенным.
  • В Java 6 и 7 получите ThreeTen Backport, бэкпорт современных классов (ThreeTen для JSR 310; см. Ссылки внизу).
  • На (более старых) Android используется версия Android ThreeTen Backport для Android.Это называется ThreeTenABP.И убедитесь, что вы импортируете классы даты и времени из org.threeten.bp с подпакетами.

Ссылки

...