import java.time.*; import java.time.temporal.*; import java.util.*; import java.util.concurrent.TimeUnit; import java.nio.file.attribute.FileTime; public class TestFileTime { public static void main(String[] args) throws Throwable { test(20000, TimeUnit.SECONDS, 2000000); test(20000, TimeUnit.MILLISECONDS, 2000000); test(20000, TimeUnit.MILLISECONDS, 2000); test(20000, TimeUnit.NANOSECONDS, 200); //testExtra(20000); } private static void test(int N, TimeUnit UNIT, int year) { final int NANOS_PER_SECOND = 1000_000_000; Random r = new Random(); for (int i = 0; i < N; i++) { long years = r.nextInt(year); long days = (years * 365L + r.nextInt(365)) * (r.nextBoolean()? 1 : -1); long secs = days * 86400L + r.nextInt(86400); long millis = secs * 1000 + r.nextInt(1000); int nanosPerSec = r.nextInt(NANOS_PER_SECOND); long VALUE = 0L; if (UNIT == TimeUnit.SECONDS) { VALUE = secs; } else if (UNIT == TimeUnit.MILLISECONDS) { VALUE = millis; } else if (UNIT == TimeUnit.NANOSECONDS) { VALUE = secs * NANOS_PER_SECOND + nanosPerSec; } else { return; } for (TimeUnit unit : EnumSet.allOf(TimeUnit.class)) { long value = unit.convert(VALUE, UNIT); FileTime ft = FileTime.from(value, unit); FileTimeOLD ftOLD = FileTimeOLD.from(value, unit); if (!ft.toString().equals(ftOLD.toString())) { System.out.println("NEW: [" + ft.toString() + "]"); System.out.println("OLD: [" + ftOLD.toString() + "]"); throw new RuntimeException("FAILED"); } } if (UNIT == TimeUnit.NANOSECONDS) { FileTimeOLD ftOLD = FileTimeOLD.from(VALUE, UNIT); Instant ins = Instant.ofEpochSecond(secs, nanosPerSec); FileTime ft = FileTime.from(ins); if (!ft.toString().equals(ftOLD.toString())) { System.out.println("-------------------------------"); System.out.println(" years=" + years); System.out.println(" days=" + days); System.out.println(" secs=" + secs); System.out.println("millis=" + millis); System.out.println(" nanos=" + nanosPerSec); System.out.println(" value=" + VALUE); System.out.println(" ins.d=" + LocalDateTime.ofInstant(ins, ZoneOffset.UTC) .getLong(ChronoField.EPOCH_DAY)); System.out.println(" ins.s=" + ins.getLong(ChronoField.INSTANT_SECONDS)); System.out.println(" ins.n=" + ins.getNano()); System.out.println("INS: " + ins); System.out.println("NEW: " + ft); System.out.println("OLD: " + ftOLD); throw new RuntimeException("FAILED"); } } } } private static void testExtra(int N) { Random r = new Random(); for (TimeUnit unit : EnumSet.allOf(TimeUnit.class)) { if (unit.compareTo(TimeUnit.SECONDS) <= 0) { continue; } for (int i = 0; i < 10; i++) { long value = Math.abs(r.nextInt(1000_000_000)) + unit.convert(Instant.MAX.getEpochSecond(), TimeUnit.SECONDS); FileTime ft = FileTime.from(value, unit); FileTimeOLD ftOLD = FileTimeOLD.from(value, unit); if (!ft.toString().equals(ftOLD.toString())) { System.out.println("------------------------"); System.out.println("TestValue=" + value + ", unit=" + unit); System.out.println(" NEW: [" + ft.toString() + "]"); System.out.println(" OLD: [" + ftOLD.toString() + "]"); //throw new RuntimeException("FAILED"); } } } } }