从Java获得毫秒分辨率的文件mtime

时间:2014-07-17 13:14:15

标签: java file last-modified

当我使用mtime从Java读取文件的Files.getLastModifiedTime时,返回值将被截断为整秒。我知道这可以在其他系统上使用毫秒分辨率的mtimes,那么我的可能有什么不同呢?

这是一个完整的独立测试,可以编译和运行:

import java.nio.file.attribute.FileTime;
import java.nio.file.Files;
import java.nio.file.Paths;
public class Test {
  public static void main(String[] args) throws java.io.IOException {
    FileTime timestamp = Files.getLastModifiedTime(Paths.get("/tmp/test"));
    System.out.println(timestamp.toMillis());
  }
}

输出(使用我的特定测试文件)1405602038000,而ls显示:

$ ls --full-time /tmp/test                                                                                                                                                                                                    
-rw-rw-r-- 1 daniel daniel 0 2014-07-17 16:00:38.413008992 +0300 /tmp/test

我希望Java输出为1405602038413

我使用ext4在Linux上运行。我尝试了openjdk 1.7和Oracle jdk 1.8。

4 个答案:

答案 0 :(得分:8)

{8}在Java 8中添加了在* nix系统上以更高精度获取文件时间戳的能力,但是,在本机方面,它需要符合POSIX 2008标准:

#if (_POSIX_C_SOURCE >= 200809L) || defined(__solaris__)
    (*env)->SetLongField(env, attrs, attrs_st_atime_nsec, (jlong)buf->st_atim.tv_nsec);
    (*env)->SetLongField(env, attrs, attrs_st_mtime_nsec, (jlong)buf->st_mtim.tv_nsec);
    (*env)->SetLongField(env, attrs, attrs_st_ctime_nsec, (jlong)buf->st_ctim.tv_nsec);
#endif

显然,你正在使用的Java版本没有设置它,所以时间戳的纳秒部分不可用并保持为零。

答案 1 :(得分:3)

我查看了源代码:

在Java 7的情况下,该方法给出了最后修改的时间戳,精度为1秒:

在Java 8的情况下,看起来像它应该给出微秒精度:

但在任何一种情况下,代码似乎都没有提供一种方法来获得具有不同精度的时间戳。

答案 2 :(得分:1)

似乎在java 9中修复了

  • Oracle jdk 9.0.4 - Files.getLastModifiedTime提供毫秒级分辨率
  • Oracle jdk 1.8.162 - Files.getLastModifiedTime给出第二个解决方案

答案 3 :(得分:-4)

您可以使用简单日期格式显示时间是毫秒:

java.nio.file.attribute.FileTime time = java.nio.file.Files.getLastModifiedTime(java.nio.file.Paths.get("/tmp/test"))
java.text.SimpleDateFormat dateformat = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
System.out.println(dateformat.format(time.toMillis()));