Конвертировать из даты и времени в Excel в ZonedDateTime - PullRequest
0 голосов
/ 14 марта 2019

Дата и время в Excel сохраняются как количество дней, прошедших с 1900-01-01 (+1, как он считает, 1900-02-29 произошло). Дробь в числе - это временной сдвиг в дне.

Этот номер не имеет понятия часовых поясов. Таким образом, 12.5 - это 1900-01-12T12: 00: 00 в часовом поясе, в котором вы открыли свою электронную таблицу. Откройте ее в Колорадо, и она показывает полдень. Откройте его в Германии, и он показывает полдень. Это не мгновение, это LocalDateTime.

Для нашей системы, в которой мы храним все как OffsetDateTime или ZonedDateTime (в зависимости от того, как нам было передано время-дата), логично, я думаю, создать из этого ZonedDateTime.

Что приводит к вопросу, как мне создать ZonedDateTime, установленный на этот номер даты-времени Excel, в местном часовом поясе?

1 Ответ

0 голосов
/ 15 марта 2019
    LocalDate msBaseDate = LocalDate.of(1899, Month.DECEMBER, 31);

    double dateFromExcel = 12.5;
    long nanosSinceBase = Math.round(dateFromExcel * TimeUnit.DAYS.toNanos(1));
    ZonedDateTime dateTime = msBaseDate.atStartOfDay()
            .plusNanos(nanosSinceBase)
            .atZone(ZoneId.systemDefault());

    System.out.println(dateTime);

На моем компьютере вывод:

1900-01-12T12: 00 + 01: 00 [Европа / Копенгаген]

Поскольку java.time использует только целые числа, я использую его тончайшую гранулярность, наносекунды. Это превысит long в 2192 году, поэтому для будущего решения вы можете подумать о добавлении целых дней отдельно и только преобразовании дроби в нано.

...