Java Datetime с форматом Timezone (от часового пояса до неизвестного локального) - PullRequest
0 голосов
/ 25 апреля 2018

Я хотел бы конвертировать: 2018-06-04T21: 00: 00.000-07: 00 это к 2018-06-05, которая является датой для правильного часового пояса (я не знаю, какой правильный часовой пояс имеет только это -07: 00).

Ответы [ 3 ]

0 голосов
/ 25 апреля 2018

Если вы используете Java8, вы можете использовать класс ZonedDateTime, например:

String d = "2018-06-04T21:00:00.000-07:00";

DateTimeFormatter parser = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");

ZonedDateTime zonedDateTime = ZonedDateTime.parse(d, parser);

// Convert here to any other timezone you want...
System.out.println(zonedDateTime.withZoneSameInstant(ZoneOffset.UTC));
0 голосов
/ 25 апреля 2018

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

Строка, подобная вашей, соответствует формату ISO 8601 для даты и времени смещения, то есть даты и времени со смещением UTC (но без часового пояса). Поэтому единственное, что нужно сделать, это разобрать в OffsetDateTime:

    String dateTimeString = "2018-03-04T03:45:00.000-07:00";
    OffsetDateTime dateTime = OffsetDateTime.parse(dateTimeString);
    System.out.println(dateTime);

Выход:

2018-03-04T03: 45-07: 00

Синтаксический анализ работает без какого-либо явного средства форматирования, поскольку OffsetDateTime и другие классы даты и времени java.time анализируют формат ISO 8601 как их значение по умолчанию (а также печатают ISO 8601 обратно в их toString методах). java.time - современный API даты и времени Java. (Я специально выбрал другую дату и время, чтобы указать следующий момент.)

Чтобы преобразовать его в дату, часовой пояс имеет решающее значение . Давайте попробуем с тремя разными часовыми поясами:

    System.out.println(dateTime.atZoneSameInstant(ZoneId.of("Pacific/Apia")).toLocalDate());
    System.out.println(dateTime.atZoneSameInstant(ZoneId.of("Pacific/Pago_Pago")).toLocalDate());
    System.out.println(dateTime.atZoneSameInstant(ZoneId.of("Asia/Kamchatka")).toLocalDate());

Выход:

2018-03-05
2018-03-03
2018-03-04

У нас три разные даты, 3, 4 и 5 марта. Потому что на земле никогда не бывает одной и той же даты. Сделай свой выбор. : -)

Возможно, будет нормально использовать настройку часового пояса вашей JVM. Если это так, используйте ZoneId.systemDefault() в качестве аргумента atZoneSameInstant(). Однако настройку часового пояса можно изменить в любое время из другой части вашей программы или из другой программы, работающей в той же JVM.

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

Да, java.time требует как минимум Java 6 .

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

Ссылки

0 голосов
/ 25 апреля 2018

Попробуйте это.

        String date = "2018-06-04T21:00:00.000-07:00";
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); 
        System.out.println(dateFormat.parseObject(date));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...