< prev index next >

src/java.base/windows/classes/sun/nio/fs/WindowsFileAttributes.java

Print this page

        

@@ -1,7 +1,7 @@
 /*
- * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 2019, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License version 2 only, as
  * published by the Free Software Foundation.  Oracle designates this

@@ -106,12 +106,12 @@
     private static final short OFFSETOF_FIND_DATA_LASTWRITETIME = 20;
     private static final short OFFSETOF_FIND_DATA_SIZEHIGH = 28;
     private static final short OFFSETOF_FIND_DATA_SIZELOW = 32;
     private static final short OFFSETOF_FIND_DATA_RESERVED0 = 36;
 
-    // used to adjust values between Windows and java epoch
-    private static final long WINDOWS_EPOCH_IN_MICROSECONDS = -11644473600000000L;
+    // used to adjust values between Windows and java epochs
+    private static final long WINDOWS_EPOCH_IN_100NS = -116444736000000000L;
 
     // indicates if accurate metadata is required (interesting on NTFS only)
     private static final boolean ensureAccurateMetadata;
     static {
         String propValue = GetPropertyAction.privilegedGetProperty(

@@ -135,27 +135,28 @@
     /**
      * Convert 64-bit value representing the number of 100-nanosecond intervals
      * since January 1, 1601 to a FileTime.
      */
     static FileTime toFileTime(long time) {
-        // 100ns -> us
-        time /= 10L;
-        // adjust to java epoch
-        time += WINDOWS_EPOCH_IN_MICROSECONDS;
-        return FileTime.from(time, TimeUnit.MICROSECONDS);
+        // adjust to java epoch retaining 100ns precision
+        time += WINDOWS_EPOCH_IN_100NS;
+        // 100ns -> ns
+        time *= 100L;
+        return FileTime.from(time, TimeUnit.NANOSECONDS);
     }
 
     /**
-     * Convert FileTime to 64-bit value representing the number of 100-nanosecond
-     * intervals since January 1, 1601.
+     * Convert FileTime to 64-bit value representing the number of
+     * 100-nanosecond intervals since January 1, 1601.
      */
     static long toWindowsTime(FileTime time) {
-        long value = time.to(TimeUnit.MICROSECONDS);
-        // adjust to Windows epoch+= 11644473600000000L;
-        value -= WINDOWS_EPOCH_IN_MICROSECONDS;
-        // us -> 100ns
-        value *= 10L;
+        // FileTime -> ns
+        long value = time.to(TimeUnit.NANOSECONDS);
+        // ns -> 100ns
+        value /= 100L;
+        // adjust to Windows epoch += 116444736000000000L;
+        value -= WINDOWS_EPOCH_IN_100NS;
         return value;
     }
 
     /**
      * Initialize a new instance of this class
< prev index next >