【问题标题】:Java 7 NIO.2 Files.getLastModifiedTime time zoneJava 7 NIO.2 Files.getLastModifiedTime 时区
【发布时间】:2013-08-28 13:43:42
【问题描述】:

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

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

但是,我感觉我做错了,因为DateTime(long) 构造函数明确提到DateTime 实例将使用默认时区创建。但是,FileTime docs 并没有在任何地方提及其时区。我查看了FileTime 代码;它看起来很简单,它的toString() 方法表明它正在使用UTC 时区(它在UTC 时区创建一个Calendar 并直接设置它的毫秒数)。

那么,FileTime 使用 UTC 还是本地时间?将FileTime 转换为DateTime 的正确方法是什么?

【问题讨论】:

    标签: java date datetime jodatime nio2


    【解决方案1】:

    Java 毫秒时间戳是 UTC 时间戳。这是FileTime.toMillis() 返回的,也是DateTime 构造函数所期望的。这同样适用于其他 Java API 方法;例如System.currentTimeMillis() 方法、java.util.Date 构造函数等等。

    它们都以相同的方式工作。事实上,其他编程语言中的其他 Unix / Linux / OSX 库方法也是如此。

    这种中断的唯一情况是有人错误地配置/设置了系统时钟。

    【讨论】:

    • 谢谢,现在我明白了。出于某种原因,我认为 DateTime 构造函数期望本地时区的时间戳,但是,正如您所说,时间戳始终采用 UTC。然后在另一个DateTime 构造函数中的DateTimeZone 参数只是定义了如何查看这个时间戳。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-09
      • 1970-01-01
      • 2011-07-28
      • 1970-01-01
      • 2014-10-21
      • 2014-03-16
      • 1970-01-01
      • 2015-02-16
      相关资源
      最近更新 更多