src/java.base/share/classes/java/util/zip/ZipUtils.java
changeset 47331 39d1de71faca
parent 47216 71c04702a3d5
child 49834 99644c75eaed
equal deleted inserted replaced
47330:eb010905ccb7 47331:39d1de71faca
    26 package java.util.zip;
    26 package java.util.zip;
    27 
    27 
    28 import java.nio.file.attribute.FileTime;
    28 import java.nio.file.attribute.FileTime;
    29 import java.security.AccessController;
    29 import java.security.AccessController;
    30 import java.security.PrivilegedAction;
    30 import java.security.PrivilegedAction;
       
    31 import java.time.DateTimeException;
    31 import java.time.Instant;
    32 import java.time.Instant;
    32 import java.time.LocalDateTime;
    33 import java.time.LocalDateTime;
    33 import java.time.ZoneId;
    34 import java.time.ZoneId;
       
    35 import java.util.Date;
    34 import java.util.concurrent.TimeUnit;
    36 import java.util.concurrent.TimeUnit;
    35 
    37 
    36 import static java.util.zip.ZipConstants.ENDHDR;
    38 import static java.util.zip.ZipConstants.ENDHDR;
    37 
    39 
    38 class ZipUtils {
    40 class ZipUtils {
    76     public static final long fileTimeToUnixTime(FileTime ftime) {
    78     public static final long fileTimeToUnixTime(FileTime ftime) {
    77         return ftime.to(TimeUnit.SECONDS);
    79         return ftime.to(TimeUnit.SECONDS);
    78     }
    80     }
    79 
    81 
    80     /**
    82     /**
       
    83      /*
    81      * Converts DOS time to Java time (number of milliseconds since epoch).
    84      * Converts DOS time to Java time (number of milliseconds since epoch).
    82      */
    85      */
    83     public static long dosToJavaTime(long dtime) {
    86     public static long dosToJavaTime(long dtime) {
    84         int year;
    87         int year = (int) (((dtime >> 25) & 0x7f) + 1980);
    85         int month;
    88         int month = (int) ((dtime >> 21) & 0x0f);
    86         int day;
    89         int day = (int) ((dtime >> 16) & 0x1f);
    87         int hour = (int) ((dtime >> 11) & 0x1f);
    90         int hour = (int) ((dtime >> 11) & 0x1f);
    88         int minute = (int) ((dtime >> 5) & 0x3f);
    91         int minute = (int) ((dtime >> 5) & 0x3f);
    89         int second = (int) ((dtime << 1) & 0x3e);
    92         int second = (int) ((dtime << 1) & 0x3e);
    90         if ((dtime >> 16) == 0) {
    93 
    91             // Interpret the 0 DOS date as 1979-11-30 for compatibility with
    94         if (month > 0 && month < 13 && day > 0 && hour < 24 && minute < 60 && second < 60) {
    92             // other implementations.
    95             try {
    93             year = 1979;
    96                 LocalDateTime ldt = LocalDateTime.of(year, month, day, hour, minute, second);
    94             month = 11;
    97                 return TimeUnit.MILLISECONDS.convert(ldt.toEpochSecond(
    95             day = 30;
    98                         ZoneId.systemDefault().getRules().getOffset(ldt)), TimeUnit.SECONDS);
    96         } else {
    99             } catch (DateTimeException dte) {
    97             year = (int) (((dtime >> 25) & 0x7f) + 1980);
   100                 // ignore
    98             month = (int) ((dtime >> 21) & 0x0f);
   101             }
    99             day = (int) ((dtime >> 16) & 0x1f);
   102         }
   100         }
   103         return overflowDosToJavaTime(year, month, day, hour, minute, second);
   101         LocalDateTime ldt = LocalDateTime.of(year, month, day, hour, minute, second);
   104     }
   102         return TimeUnit.MILLISECONDS.convert(ldt.toEpochSecond(
   105 
   103                 ZoneId.systemDefault().getRules().getOffset(ldt)), TimeUnit.SECONDS);
   106     /*
   104     }
   107      * Deal with corner cases where an arguably mal-formed DOS time is used
       
   108      */
       
   109     @SuppressWarnings("deprecation") // Use of Date constructor
       
   110     private static long overflowDosToJavaTime(int year, int month, int day,
       
   111                                               int hour, int minute, int second) {
       
   112         return new Date(year - 1900, month - 1, day, hour, minute, second).getTime();
       
   113     }
       
   114 
   105 
   115 
   106     /**
   116     /**
   107      * Converts extended DOS time to Java time, where up to 1999 milliseconds
   117      * Converts extended DOS time to Java time, where up to 1999 milliseconds
   108      * might be encoded into the upper half of the returned long.
   118      * might be encoded into the upper half of the returned long.
   109      *
   119      *