Java 7 NIO.2 Files.getLastModifiedTime的时区

8

我正在编写一个程序,需要确定文件/目录的最后修改时间。我想使用Joda Time来处理这个时间,并且我正在使用Java 7 NIO.2类Files来获取文件的最后修改时间。它的getLastModifiedTime()方法返回FileTime类的一个实例,该实例具有方便的方法toMillis(),我将其结果传递给Joda Time DateTime类的构造函数:

new DateTime(Files.getLastModifiedTime(path).toMillis());

然而,我感觉自己做错了,因为DateTime(long)构造函数明确提到将使用默认时区创建DateTime实例。然而,FileTime文档中没有任何地方提到其时区。我查看了FileTime代码;它似乎非常简单,并且它的toString()方法表明它正在使用UTC时区(它在UTC时区创建一个Calendar并直接设置毫秒数)。
那么,FileTime是使用UTC还是本地时间?将FileTime转换为DateTime的正确方法是什么?
2个回答

6
一个Java毫秒级时间戳是一个UTC时间戳。这就是FileTime.toMillis()返回的值,也是DateTime构造函数所需的值。其他Java API方法也是如此,例如System.currentTimeMillis()方法,java.util.Date构造函数等等。它们都是以相同的方式工作的。实际上,在其他编程语言中,Unix / Linux / OSX库方法也是如此。唯一破坏这种方式的情况是如果有人错误地配置/设置了系统时钟。

谢谢,现在我明白了。出于某种原因,我以为 DateTime 构造函数期望的是本地时区的时间戳,但正如你所说,时间戳始终是 UTC 时间。那么另一个 DateTime 构造函数中的 DateTimeZone 参数只是定义了如何查看此时间戳。 - Vladimir Matveev

1

FileTime.toMillis() API表示返回自1970年01月01日T00:00:00Z以来的毫秒值。 new DateTime(millis)创建一个DateTime实例,它保存了从Java纪元1970-01-01T00:00:00Z起的毫秒时间和时区的Chronology,这确定了如何将毫秒值转换为日期时间字段。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接