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 * |