用于处理win32 FILETIME的Java库?

时间:2011-03-22 22:18:39

标签: java

是否有任何Java库来处理win32 FILETIME/时间间隔? 它自1601年1月1日起以100ns的间隔基本上是64位时间戳。

(根据我的特殊需要,转换为/从java.util.Date转换或适当的joda时间等效,但我需要访问至少微秒的分辨率 - 这似乎都没有提供。)

3 个答案:

答案 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那样功能丰富。

相关问题