我正在尝试打印文件的最后修改时间。某种程度上,返回的时间戳不正确,并且与系统时间不同。
Files.getLastModifiedTime(Paths.get(directory, filename))
打印
2019-01-14T11:48:47.312493Z
实际上是系统时间:
LocalDateTime.now() <- 2019-01-14T19:48:50.495242600
如何解决此问题并使getLastModifiedTime
返回本地时区的时间?
答案 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());