Java library for dealing with win32 FILETIME?

前端 未结 3 738
鱼传尺愫
鱼传尺愫 2021-02-06 11:28

Are there any Java libraries around for dealing with the win32 FILETIME/ time intervals ? It\'s basically a 64 bit timestamp in 100ns intervals since January 1, 1601.

(

相关标签:
3条回答
  • 2021-02-06 11:37

    Last time I solved this using JNI... (Although not on Windows, this was unix)

    That is, a piece of C++ code that called the native OS functions, and then called that code using Java Native Interface.

    A bit clunky, but it was the only way I could find (Also needed the i-node).

    EDIT: Assuming the values are already obtained from some other source, Date4J can handle seconds with 9 decimals, but it is not as feature rich as Joda.

    0 讨论(0)
  • 2021-02-06 11:44

    If you are fine with millisecond resolution, this would work:

    /** 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;
    }
    

    At this point, converting from ms to a Date object is quite straightforward.

    0 讨论(0)
  • 2021-02-06 11:50

    Here's a Java 8+ java.time based solution that keeps 100-nanosecond precision:

    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);
    }
    
    0 讨论(0)
提交回复
热议问题