我需要确定文件在NTFS文件系统上的持续时间。
我可以读取文件创建时间,系统时间以毫秒为单位,但两者不加。他们已经离开了好几年。 NTFS Epoc是1月1601年1月160日UTC时间,而Java Epoc是1970年1月1日。此外,NTFS时间以100纳秒为单位。
考虑到所有这些因素,它仍然没有加起来。我哪里错了?
public static final double secondsPerJulianYear = 316880878;
public static final double minutesPerJulianYear = 5281347.966666667;
public static final double secondsPerMinute = 60.0;
public static final double millisPerSecond = 1000.0;
public static final double yearsJavaTimeAhead = 369.0;
public static long ntfsFileCreationTime(final File file) {
FileTime fileCreationTime = null;
try {
Path filePath = Paths.get(file.toURI());
if (Files.exists(filePath)) {
BasicFileAttributes attributes = Files.readAttributes(filePath, BasicFileAttributes.class);
fileCreationTime = attributes.creationTime();
}
} catch (IOException ex) {
ex.printStackTrace();
}
return getJavaMillisFromNtfsTime(fileCreationTime.toMillis());
}
public static long getJavaMillisFromNtfsTime(final long ntfsTime) {
double ntfsNanos = ntfsTime * 100; // An NTFS time unit is equal to 100 nanoseconds
double ntfsMillis = (ntfsNanos / 10E6); // There are 10e6 nanoseconds in a millisecond
double millisJavaEpocAhead = yearsJavaTimeAhead * minutesPerJulianYear * secondsPerMinute * millisPerSecond;
return (long) (ntfsMillis - millisJavaEpocAhead);
}
According to Windows 7, the creation date is: 1/6/2016
This is the console output of one of the files:
System.currentTimeMillis(): 1454896412295
fileCreationTime(fileName): -116929029460761
file age: 118383925873056
答案 0 :(得分:3)
来自FileTime
的Javadocpublic static FileTime fromMillis(long value)
返回
表示给定值的FileTime,以毫秒为单位。
参数:
价值 - 自纪元以来的价值(以毫秒为单位)(1970-01-01T00:00:00Z);可 negative返回:表示给定值的FileTime
注意,那个纪元是相同的,时间是毫秒。
所以你的方法应该是
public static long getJavaMillisFromNtfsTime(final long ntfsTime) {
return ntfsTime;
}
注意:当您收到例外情况时,您无法继续并假装它没有发生。在您的情况下,您将获得NullPointerException。我建议您不要捕获IOException或返回一个明显无效的值,如Long.MIN_VALUE