用于处理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); }