Java: неверный часовой пояс в Files.getLastModifiedTime - PullRequest
0 голосов
/ 14 января 2019

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

Files.getLastModifiedTime(Paths.get(directory, filename))

который печатает 2019-01-14T11:48:47.312493Z

Системное время на самом деле:

LocalDateTime.now()  <- 2019-01-14T19:48:50.495242600

Как я могу преодолеть эту проблему и заставить getLastModifiedTime вернуть время в моем местном часовом поясе?

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Кажется FileTime#toString() возвращает строку даты и времени в UTC, вот фрагмент ее исходного кода:

ldt = LocalDateTime.ofEpochSecond(lo - SECONDS_0000_TO_1970, nanos, ZoneOffset.UTC);

Вы можете получить Instant из FileTime, а затем преобразовать его в LocalDateTime с часовым поясом системы:

FileTime fileTime = Files.getLastModifiedTime(Paths.get(directory, filename));
LocalDateTime localDateTime = LocalDateTime.ofInstant(fileTime.toInstant(), ZoneId.systemDefault());
0 голосов
/ 14 января 2019

LocalDateTime - это, как следует из названия, локальная дата и время. Это зависит от часового пояса, настроенного на машине. Машина, вероятно, работает в UTC + 8. Чтобы получить дату и время без часового пояса, например getLastModifiedTime(), используйте Instant.now() вместо LocalDateTime.now().

В качестве альтернативы вы можете преобразовать Instant, возвращаемое getLastModifiedTime(...).toInstant(), в ваше местное время:

Instant modified = Files
    .getLastModifiedTime(Paths.get(directory, filename))
    .toInstant();
LocalDateTime modifiedDateTime = modified
    .atZone(ZoneId.systemDefault())
    .toLocalDateTime();

, где ZoneId.systemDefault() - это настроенный по умолчанию часовой пояс системы. Вы также можете использовать фиксированный часовой пояс, например ZoneId.of("CST") для стандартного времени Китая. Но я настоятельно рекомендую всегда работать с Instant, где это возможно, потому что тогда вы не сможете случайно сравнить даты и времени с разных временных отметок и избежать ошибок из-за разных сред, в которых выполняется код.

...