Java:Files.getLastModifiedTime中的时区不正确

时间:2019-01-14 12:07:51

标签: java datetime

我正在尝试打印文件的最后修改时间。某种程度上,返回的时间戳不正确,并且与系统时间不同。

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

打印 2019-01-14T11:48:47.312493Z

实际上是系统时间:

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

如何解决此问题并使getLastModifiedTime返回本地时区的时间?

2 个答案:

答案 0 :(得分:2)

顾名思义,

LocalDateTime local 的日期和时间。这取决于机器上配置的时区。该计算机可能以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一起使用,因为那样您就不会意外地比较来自不同时间戳的日期时间,并且可以避免由于代码运行于不同环境而导致的错误。

答案 1 :(得分:1)

似乎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());