从Java获得毫秒分辨率的文件mtime
当我使用Files.getLastModifiedTime
从Java读取文件的mtime
时,返回值被截断为整秒。 我知道这可以在其他系统上运行,以获得毫秒级的分辨率,那么我的可能有什么不同呢?
这是一个完整的独立测试,可以编译和运行:
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。
通过此提交在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构建没有设置它,因此时间戳的纳秒部分不可用并且保持为零。
我查看了源代码:
在Java 7的情况下,该方法给出了最后修改的时间戳,精度为1秒:
在Java 8的情况下,它看起来应该给出微秒精度:
但在任何一种情况下,代码似乎都没有提供一种方法来获得具有不同精度的时间戳。
它似乎在java 9中得到修复
- Oracle jdk 9.0.4 –
Files.getLastModifiedTime
提供毫秒级的分辨率 - Oracle jdk 1.8.162 –
Files.getLastModifiedTime
给出了第二个分辨率
您可以使用简单日期格式显示时间是毫秒:
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()));