package org.openjdk; import org.openjdk.jmh.annotations.*; import java.util.*; import java.util.concurrent.*; import java.time.*; @State(Scope.Benchmark) public class ZipUtilsMixed { @Param("677456332112") public long dosTime; @Param("0") public long dosTime2; @Setup public void setup() { long dtime = dosTime; int year = (int) (((dtime >> 25) & 0x7f) + 1980); int month = (int) ((dtime >> 21) & 0x0f); int day = (int) ((dtime >> 16) & 0x1f); int hour = (int) ((dtime >> 11) & 0x1f); int minute = (int) ((dtime >> 5) & 0x3f); int second = (int) ((dtime << 1) & 0x3e); System.out.println(year + "-" + month + "-" + day + " " + hour + ":" + minute + ":" + second); } @Benchmark public long dosToJavaTime8Bench() { return dosToJavaTime8(dosTime) + dosToJavaTime8(dosTime2); } public static long dosToJavaTime8(long dtime) { Date d = new Date((int)(((dtime >> 25) & 0x7f) + 80), (int)(((dtime >> 21) & 0x0f) - 1), (int)((dtime >> 16) & 0x1f), (int)((dtime >> 11) & 0x1f), (int)((dtime >> 5) & 0x3f), (int)((dtime << 1) & 0x3e)); return d.getTime(); } @Benchmark public long dosToJavaTime9Bench() { return dosToJavaTime9(dosTime) + dosToJavaTime9(dosTime); } public static long dosToJavaTime9(long dtime) { int year = (int) (((dtime >> 25) & 0x7f) + 1980); int month = (int) ((dtime >> 21) & 0x0f); int day = (int) ((dtime >> 16) & 0x1f); int hour = (int) ((dtime >> 11) & 0x1f); int minute = (int) ((dtime >> 5) & 0x3f); int second = (int) ((dtime << 1) & 0x3e); try { LocalDateTime ldt = LocalDateTime.of(year, month, day, hour, minute, second); return TimeUnit.MILLISECONDS.convert(ldt.toEpochSecond( ZoneId.systemDefault().getRules().getOffset(ldt)), TimeUnit.SECONDS); } catch (DateTimeException dte) { return overflowDosToJavaTime(year, month, day, hour, minute, second); } } @SuppressWarnings("deprecation") // Use of date constructor private static long overflowDosToJavaTime(int year, int month, int day, int hour, int minute, int second) { return new Date(year - 1900, month - 1, day, hour, minute, second).getTime(); } @Benchmark public long dosToJavaTime9Bench2() { return dosToJavaTime92(dosTime) + dosToJavaTime92(dosTime2); } public static long dosToJavaTime92(long dtime) { int year = (int) (((dtime >> 25) & 0x7f) + 1980); int month = (int) ((dtime >> 21) & 0x0f); int day = (int) ((dtime >> 16) & 0x1f); int hour = (int) ((dtime >> 11) & 0x1f); int minute = (int) ((dtime >> 5) & 0x3f); int second = (int) ((dtime << 1) & 0x3e); if (month >= 1 && day >= 0 && second < 60 && minute < 60 && hour < 24) { try { LocalDateTime ldt = LocalDateTime.of(year, month, day, hour, minute, second); return TimeUnit.MILLISECONDS.convert(ldt.toEpochSecond( ZoneId.systemDefault().getRules().getOffset(ldt)), TimeUnit.SECONDS); } catch (DateTimeException dte) { // ignore } } return overflowDosToJavaTime(year, month, day, hour, minute, second); } public ZipUtilsMixed() { } }