Различия Java в проанализированных метках времени игнорируются - PullRequest
0 голосов
/ 06 февраля 2019

В следующих примерах мне удалось проанализировать временные метки в формате yyMMddHHmmss (+ -) HHss (дата плюс или минус некоторый временной сдвиг).

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

Например, возьмем дату и время: 190219010000 (19 февраля 2019, 01:00 [AM]), мы можем добавить 2 часа (время будет 03:00)или вычтите 2 часа (время будет 23:00, а дата - 18 февраля) - то есть проанализированный объект должен иметь разницу в 4 часа.

В следующем примере выполнения сдвиг по времени равенигнорируются.Я могу написать любое число, и вывод всегда будет «19 февраля 2019, 01:00».

//Input timestamps: "190219010000+0200" "190219010000-0200"
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class HelloWorld
{
  public static void main(String[] args)
  { //parsing "19th of February 2019, 01:00 [AM]" +- 2hours
    LocalDateTime ldt1 = LocalDateTime.parse("190219010000+0200", DateTimeFormatter.ofPattern("yyMMddHHmmssx"));
    LocalDateTime ldt2 = LocalDateTime.parse("190219010000-0200", DateTimeFormatter.ofPattern("yyMMddHHmmssx"));
    System.out.println("190219010000+0200: " +ldt1);
    System.out.println("190219010000-0200: "+ ldt2);
  }
}

РЕАЛЬНЫЙ вывод: в обоих случаях вывод одинаков, но ввод был другим: /

190219010000+0200: 2019-02-19T01:00
190219010000-0200: 2019-02-19T01:00

Ожидаемый результат:

190219010000+0200: 2019-02-19T03:00
190219010000-0200: 2019-02-18T23:00

Может быть, я должен использовать что-то другое вместо х в шаблоне?Или LocalDateTimeFormatter (который не существует) вместо DateTimeFormatter?

Спасибо

Ответы [ 3 ]

0 голосов
/ 06 февраля 2019

LocalDateTime не имеет информации о часовом поясе и не хранит или не представляет часовой пояс.Следовательно, в вашем случае, ldt1 и ldt2 представляют одно и то же местное время.

0 голосов
/ 06 февраля 2019

Как уже говорили другие, вы неправильно поняли.В вашем коде LocalDateTime.parse ведет себя как задумано.

Вы правы, что 190219010000+0200 является однозначным моментом времени (учитывая, что мы знаем, что формат yyMMddHHmmssx).LocalDateTime.parse дает вам местную дату и время в строке.Другими словами, локальная дата и время по смещению +02: 00.

Если вы хотите преобразование, например, в UTC, вам нужно указать это явно:

    OffsetDateTime odt1 = OffsetDateTime.parse("190219010000+0200", 
            DateTimeFormatter.ofPattern("yyMMddHHmmssx"));
    LocalDateTime ldt1 = odt1.withOffsetSameInstant(ZoneOffset.UTC)
            .toLocalDateTime();

    System.out.println("190219010000+0200: " + ldt1);

Сейчасрезультат тот, который вы ожидали.Почти.

190219010000 + 0200: 2019-02-18T23: 00

Как уже сказал Джон Скит +0200 обычно означает, что смещение UTC +02: 00 было применено к дате и времени.Таким образом, 01:00 в +02: 00 - это тот же момент времени, что и 23:00 в предыдущий день в UTC (если ваши строки очень особенные и применяют противоположное соглашение для смещений, это тоже можно решить, но требует немногобольше ручной работы).

0 голосов
/ 06 февраля 2019

В следующем работающем примере временное смещение игнорируется.

Да, меня это не удивляет.Вы анализируете представленное значение local - это значение LocalDateTime.

Строка "190219010000 + 0200" означает "19 февраля 2019 года, 1:00 по местному времени, ссмещение UTC на 2 часа ".Местное время этого составляет 2019-02-19T01: 00.Если вы не хотите получать локальную дату и время, представленные вашим текстом, LocalDateTime - это неправильный тип для использования.

Похоже, что вы действительно хотите указать UTCвремя, в этом случае вы должны проанализировать значение как OffsetDateTime, а затем, вероятно, преобразовать в Instant.Я ожидаю, что результаты будут в противоположном от вас направлении, хотя: +0200 обычно означает «местное время на два часа впереди от UTC», делая значение UTC 11 вечера предыдущего дня - это несумма, которую нужно добавить к получить к UTC.

...