Как преобразовать строку ввода даты и времени с дополнительным временем в UNIX время, используя java .time - PullRequest
2 голосов
/ 29 апреля 2020

Я использую java .time для преобразования времени даты в unix время, но результат не всегда корректен, когда у меня разные входные форматы. В приведенном ниже коде вывод не верен. Он конвертирует «2016-06-21-10-19-22» в 2016-06-21T00: 00: 00 + 00: 00.

Если введено «28.04.2016», «ММ / ДД / ГГГГ», результат верный.

Я хочу знать, как написать функцию, которая может преобразовывать оба дата с временем и дата без времени на правильное время в секундах?

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(
                "yyyy-MM-dd-HH-mm-ss");
        String dateTimeString = "2016-06-21-10-19-22";
        LocalDate date = LocalDate.parse(dateTimeString, formatter);

        ZonedDateTime resultado = date.atStartOfDay(ZoneId.of("UTC"));

        Instant i = resultado.toInstant();
        long timeInSeconds = i.getEpochSecond();
        int nanoAdjustment = i.getNano();

        System.out.println("" + timeInSeconds + " seconds " + nanoAdjustment + " nanoseconds");//1466467200 seconds 0 nanoseconds

enter image description here

1 Ответ

2 голосов
/ 29 апреля 2020

В вашем коде несколько проблем, позвольте мне попробовать перечислить одну за другой

  1. Вы всегда анализируете входную строку в LocalDate , даже если она представляет со временем
LocalDate date = LocalDate.parse("2016-06-21-10-19-22", formatter);  //2016-06-21 

LocalDate date = LocalDate.parse("2016-06-21", formatter);  //2016-06-21
После разбора входной строки в LocalDate вы всегда конвертируете ее в ZoneDateTime со временем начала дня, равным 00:00:00
 ZonedDateTime resultado = date.atStartOfDay(ZoneId.of("UTC"));   //2016-06-21T00:00Z[UTC]
И, наконец, вы конвертируете один и тот же ZonedDateTime в Мгновенный независимо от времени на входе, поэтому вы всегда получаете один и тот же результат
Instant i = resultado.toInstant().getEpochSecond();  //1466467200

Лучше всего Для решения этой проблемы будет использоваться DateTimeFormatter с необязательным представлением времени в форматере и использование parseBest

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd[-HH-mm-ss]");

TemporalAccessor dt = parser.parseBest(dateTimeString, LocalDateTime::from, LocalDate::from);

if (dt instanceof LocalDateTime) {
       (LocalDateTime) dt).atOffset(ZoneOffset.UTC).toInstant();
  } else {
       (LocalDate) dt).atStartOfDay(ZoneOffset.UTC).toInstant();
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...