用于处理win32 FILETIME的Java库?

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

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

如果你没有毫秒级的分辨率,这将有效:

/** 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对象非常简单。

上次我用JNI解决了这个问题…(虽然不是在Windows上,但这是unix)

也就是说,一段C ++代码调用本机OS函数,然后使用Java Native Interface调用该代码。

有点笨重,但这是我能找到的唯一方法(也需要i-node)。

编辑:假设已经从其他一些来源获得了值,Date4J可以处理9位小数秒,但它不像Joda那样function丰富。

这是一个基于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); }