是否有任何Java库来处理win32 FILETIME/时间间隔? 它自1601年1月1日起以100ns的间隔基本上是64位时间戳。
(根据我的特殊需要,转换为/从java.util.Date转换或适当的joda时间等效,但我需要访问至少微秒的分辨率 - 这似乎都没有提供。)
答案 0 :(得分:8)
如果你的毫秒级分辨率很好,那就行了:
/** Difference between Filetime epoch and Unix epoch (in ms). */
private static final long FILETIME_EPOCH_DIFF = 11644473600000L;
/** One millisecond expressed in units of 100s of nanoseconds. */
private static final long FILETIME_ONE_MILLISECOND = 10 * 1000;
public static long filetimeToMillis(final long filetime) {
return (filetime / FILETIME_ONE_MILLISECOND) - FILETIME_EPOCH_DIFF;
}
public static long millisToFiletime(final long millis) {
return (millis + FILETIME_EPOCH_DIFF) * FILETIME_ONE_MILLISECOND;
}
此时,从ms转换为Date对象非常简单。
答案 1 :(得分:1)
这是一个基于Java 8+ java.time
的解决方案,可以保持100纳秒的精度:
public static final Instant ZERO = Instant.parse("1601-01-01T00:00:00Z");
public static long fromInstant(Instant instant) {
Duration duration = Duration.between(ZERO, instant);
return duration.getSeconds() * 10_000_000 + duration.getNano() / 100;
}
public static Instant toInstant(long fileTime) {
Duration duration = Duration.of(fileTime / 10, ChronoUnit.MICROS).plus(fileTime % 10 * 100, ChronoUnit.NANOS);
return ZERO.plus(duration);
}
答案 2 :(得分:0)
上次我使用JNI解决了这个问题...(虽然不是在Windows上,但这是unix)
也就是说,一段调用本机OS函数的C ++代码,然后使用Java Native Interface调用该代码。
有点笨重,但这是我能找到的唯一方法(也需要i节点)。
编辑:假设这些值已经从其他来源获得,Date4J可以处理9位小数秒,但它不像Joda那样功能丰富。