ZoneInfoFile
ZoneInfoFile
package sun.util.calendar;
import java.io.ByteArrayInputStream;
import java.io.DataInput;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.StreamCorruptedException;
import java.security.AccessController;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import sun.security.action.GetPropertyAction;
import sun.util.calendar.ZoneInfo;
import sun.util.calendar.ZoneInfoFile.1;
import sun.util.calendar.ZoneInfoFile.Checksum;
import sun.util.calendar.ZoneInfoFile.ZoneOffsetTransitionRule;
public final class ZoneInfoFile {
private static String versionId;
private static final Map<String, ZoneInfo> zones = new ConcurrentHashMap();
private static Map<String, String> aliases = new HashMap();
private static byte[][] ruleArray;
private static String[] regions;
private static int[] indices;
private static final boolean USE_OLDMAPPING;
private static String[][] oldMappings = new String[][]{{"ACT", "Australia/Darwin"}, {"AET", "Australia/Sydney"},
{"AGT", "America/Argentina/Buenos_Aires"}, {"ART", "Africa/Cairo"}, {"AST", "America/Anchorage"},
{"BET", "America/Sao_Paulo"}, {"BST", "Asia/Dhaka"}, {"CAT", "Africa/Harare"}, {"CNT", "America/St_Johns"},
{"CST", "America/Chicago"}, {"CTT", "Asia/Shanghai"}, {"EAT", "Africa/Addis_Ababa"},
{"ECT", "Europe/Paris"}, {"IET", "America/Indiana/Indianapolis"}, {"IST", "Asia/Kolkata"},
{"JST", "Asia/Tokyo"}, {"MIT", "Pacific/Apia"}, {"NET", "Asia/Yerevan"}, {"NST", "Pacific/Auckland"},
{"PLT", "Asia/Karachi"}, {"PNT", "America/Phoenix"}, {"PRT", "America/Puerto_Rico"},
{"PST", "America/Los_Angeles"}, {"SST", "Pacific/Guadalcanal"}, {"VST", "Asia/Ho_Chi_Minh"}};
private static final long UTC1900 = -2208988800L;
private static final long UTC2037 = 2145916799L;
private static final long LDT2037 = 2114380800L;
private static final long CURRT;
static final int SECONDS_PER_DAY = 86400;
static final int DAYS_PER_CYCLE = 146097;
static final long DAYS_0000_TO_1970 = 719528L;
private static final int[] toCalendarDOW;
private static final int[] toSTZTime;
private static final long OFFSET_MASK = 15L;
private static final long DST_MASK = 240L;
private static final int DST_NSHIFT = 4;
private static final int TRANSITION_NSHIFT = 12;
private static final int LASTYEAR = 2037;
public static String[] getZoneIds() {
int arg = regions.length + oldMappings.length;
if (!USE_OLDMAPPING) {
arg += 3;
}
String[] arg0 = (String[]) Arrays.copyOf(regions, arg);
int arg1 = regions.length;
if (!USE_OLDMAPPING) {
arg0[arg1++] = "EST";
arg0[arg1++] = "HST";
arg0[arg1++] = "MST";
}
for (int arg2 = 0; arg2 < oldMappings.length; ++arg2) {
arg0[arg1++] = oldMappings[arg2][0];
}
return arg0;
}
public static String[] getZoneIds(int arg) {
ArrayList arg0 = new ArrayList();
String[] arg1 = getZoneIds();
int arg2 = arg1.length;
for (int arg3 = 0; arg3 < arg2; ++arg3) {
String arg4 = arg1[arg3];
ZoneInfo arg5 = getZoneInfo(arg4);
if (arg5.getRawOffset() == arg) {
arg0.add(arg4);
}
}
arg1 = (String[]) arg0.toArray(new String[arg0.size()]);
Arrays.sort(arg1);
return arg1;
}
public static ZoneInfo getZoneInfo(String arg) {
if (arg == null) {
return null;
} else {
ZoneInfo arg0 = getZoneInfo0(arg);
if (arg0 != null) {
arg0 = (ZoneInfo) arg0.clone();
arg0.setID(arg);
}
return arg0;
}
}
private static ZoneInfo getZoneInfo0(String arg) {
try {
ZoneInfo arg0 = (ZoneInfo) zones.get(arg);
if (arg0 != null) {
return arg0;
} else {
String arg1 = arg;
if (aliases.containsKey(arg)) {
arg1 = (String) aliases.get(arg);
}
int arg2 = Arrays.binarySearch(regions, arg1);
if (arg2 < 0) {
return null;
} else {
byte[] arg3 = ruleArray[indices[arg2]];
DataInputStream arg4 = new DataInputStream(new ByteArrayInputStream(arg3));
arg0 = getZoneInfo(arg4, arg1);
zones.put(arg, arg0);
return arg0;
}
}
} catch (Exception arg5) {
throw new RuntimeException("Invalid binary time-zone data: TZDB:" + arg + ", version: " + versionId, arg5);
}
}
public static Map<String, String> getAliasMap() {
return Collections.unmodifiableMap(aliases);
}
public static String getVersion() {
return versionId;
}
public static ZoneInfo getCustomTimeZone(String arg, int arg0) {
String arg1 = toCustomID(arg0);
return new ZoneInfo(arg1, arg0);
}
public static String toCustomID(int arg) {
int arg1 = arg / '';
char arg0;
if (arg1 >= 0) {
arg0 = 43;
} else {
arg0 = 45;
arg1 = -arg1;
}
int arg2 = arg1 / 60;
int arg3 = arg1 % 60;
char[] arg4 = new char[]{'G', 'M', 'T', arg0, '0', '0', ':', '0', '0'};
if (arg2 >= 10) {
arg4[4] = (char) (arg4[4] + arg2 / 10);
}
arg4[5] = (char) (arg4[5] + arg2 % 10);
if (arg3 != 0) {
arg4[7] = (char) (arg4[7] + arg3 / 10);
arg4[8] = (char) (arg4[8] + arg3 % 10);
}
return new String(arg4);
}
private static void addOldMapping() {
String[][] arg = oldMappings;
int arg0 = arg.length;
for (int arg1 = 0; arg1 < arg0; ++arg1) {
String[] arg2 = arg[arg1];
aliases.put(arg2[0], arg2[1]);
}
if (USE_OLDMAPPING) {
aliases.put("EST", "America/New_York");
aliases.put("MST", "America/Denver");
aliases.put("HST", "Pacific/Honolulu");
} else {
zones.put("EST", new ZoneInfo("EST", -18000000));
zones.put("MST", new ZoneInfo("MST", -25200000));
zones.put("HST", new ZoneInfo("HST", -36000000));
}
}
public static boolean useOldMapping() {
return USE_OLDMAPPING;
}
private static void load(DataInputStream arg) throws ClassNotFoundException, IOException {
if (arg.readByte() != 1) {
throw new StreamCorruptedException("File format not recognised");
} else {
String arg0 = arg.readUTF();
if (!"TZDB".equals(arg0)) {
throw new StreamCorruptedException("File format not recognised");
} else {
short arg1 = arg.readShort();
for (int arg2 = 0; arg2 < arg1; ++arg2) {
versionId = arg.readUTF();
}
short arg10 = arg.readShort();
String[] arg3 = new String[arg10];
for (int arg4 = 0; arg4 < arg10; ++arg4) {
arg3[arg4] = arg.readUTF();
}
short arg11 = arg.readShort();
ruleArray = new byte[arg11][];
int arg5;
for (arg5 = 0; arg5 < arg11; ++arg5) {
byte[] arg6 = new byte[arg.readShort()];
arg.readFully(arg6);
ruleArray[arg5] = arg6;
}
for (arg5 = 0; arg5 < arg1; ++arg5) {
arg10 = arg.readShort();
regions = new String[arg10];
indices = new int[arg10];
for (int arg12 = 0; arg12 < arg10; ++arg12) {
regions[arg12] = arg3[arg.readShort()];
indices[arg12] = arg.readShort();
}
}
zones.remove("ROC");
for (arg5 = 0; arg5 < arg1; ++arg5) {
short arg13 = arg.readShort();
aliases.clear();
for (int arg7 = 0; arg7 < arg13; ++arg7) {
String arg8 = arg3[arg.readShort()];
String arg9 = arg3[arg.readShort()];
aliases.put(arg8, arg9);
}
}
addOldMapping();
}
}
}
public static ZoneInfo getZoneInfo(DataInput arg, String arg0) throws Exception {
byte arg1 = arg.readByte();
int arg2 = arg.readInt();
long[] arg3 = new long[arg2];
for (int arg4 = 0; arg4 < arg2; ++arg4) {
arg3[arg4] = readEpochSec(arg);
}
int[] arg11 = new int[arg2 + 1];
int arg5;
for (arg5 = 0; arg5 < arg11.length; ++arg5) {
arg11[arg5] = readOffset(arg);
}
arg5 = arg.readInt();
long[] arg6 = new long[arg5];
for (int arg7 = 0; arg7 < arg5; ++arg7) {
arg6[arg7] = readEpochSec(arg);
}
int[] arg12 = new int[arg5 + 1];
for (int arg8 = 0; arg8 < arg12.length; ++arg8) {
arg12[arg8] = readOffset(arg);
}
byte arg13 = arg.readByte();
ZoneOffsetTransitionRule[] arg9 = new ZoneOffsetTransitionRule[arg13];
for (int arg10 = 0; arg10 < arg13; ++arg10) {
arg9[arg10] = new ZoneOffsetTransitionRule(arg);
}
return getZoneInfo(arg0, arg3, arg11, arg6, arg12, arg9);
}
public static int readOffset(DataInput arg) throws IOException {
byte arg0 = arg.readByte();
return arg0 == 127 ? arg.readInt() : arg0 * 900;
}
static long readEpochSec(DataInput arg) throws IOException {
int arg0 = arg.readByte() & 255;
if (arg0 == 255) {
return arg.readLong();
} else {
int arg1 = arg.readByte() & 255;
int arg2 = arg.readByte() & 255;
long arg3 = (long) ((arg0 << 16) + (arg1 << 8) + arg2);
return arg3 * 900L - 4575744000L;
}
}
private static ZoneInfo getZoneInfo(String arg, long[] arg0, int[] arg1, long[] arg2, int[] arg3, ZoneOffsetTransitionRule[] arg4) {
boolean arg5 = false;
int arg6 = 0;
int arg7 = 0;
int[] arg8 = null;
boolean arg9 = false;
int arg31;
if(arg0.length > 0) {
arg31 = arg1[arg1.length - 1] * 1000;
arg9 = arg0[arg0.length - 1] > CURRT;
} else {
arg31 = arg1[0] * 1000;
}
long[] arg10 = null;
int[] arg11 = null;
int arg12 = 0;
int arg13 = 0;
if(arg2.length != 0) {
arg10 = new long[250];
arg11 = new int[100];
int arg14 = getYear(arg2[arg2.length - 1], arg3[arg2.length - 1]);
int arg15 = 0;
int arg16;
for(arg16 = 1; arg15 < arg2.length && arg2[arg15] < -2208988800L; ++arg15) {
;
}
if(arg15 < arg2.length) {
if(arg15 < arg2.length) {
arg11[0] = arg1[arg1.length - 1] * 1000;
arg12 = 1;
}
arg12 = addTrans(arg10, arg13++, arg11, arg12, -2208988800L, arg3[arg15], getStandardOffset(arg0, arg1, -2208988800L));
}
long arg17;
while(arg15 < arg2.length) {
arg17 = arg2[arg15];
if(arg17 > 2145916799L) {
arg14 = 2037;
break;
}
for(; arg16 < arg0.length; ++arg16) {
long arg19 = arg0[arg16];
if(arg19 >= -2208988800L) {
if(arg19 > arg17) {
break;
}
if(arg19 < arg17) {
if(arg12 + 2 >= arg11.length) {
arg11 = Arrays.copyOf(arg11, arg11.length + 100);
}
if(arg13 + 1 >= arg10.length) {
arg10 = Arrays.copyOf(arg10, arg10.length + 100);
}
arg12 = addTrans(arg10, arg13++, arg11, arg12, arg19, arg3[arg15], arg1[arg16 + 1]);
}
}
}
if(arg12 + 2 >= arg11.length) {
arg11 = Arrays.copyOf(arg11, arg11.length + 100);
}
if(arg13 + 1 >= arg10.length) {
arg10 = Arrays.copyOf(arg10, arg10.length + 100);
}
arg12 = addTrans(arg10, arg13++, arg11, arg12, arg17, arg3[arg15 + 1], getStandardOffset(arg0, arg1, arg17));
++arg15;
}
int arg20;
int arg35;
for(; arg16 < arg0.length; ++arg16) {
arg17 = arg0[arg16];
if(arg17 >= -2208988800L) {
arg35 = arg3[arg15];
arg20 = indexOf(arg11, 0, arg12, arg35);
if(arg20 == arg12) {
++arg12;
}
arg10[arg13++] = arg17 * 1000L << 12 | (long)arg20 & 15L;
}
}
long arg37;
if(arg4.length <= 1) {
if(arg13 > 0) {
if(arg14 < 2037) {
arg17 = 2114380800L - (long)(arg31 / 1000);
arg35 = indexOf(arg11, 0, arg12, arg31 / 1000);
if(arg35 == arg12) {
++arg12;
}
arg10[arg13++] = arg17 * 1000L << 12 | (long)arg35 & 15L;
} else if(arg2.length > 2) {
int arg36 = arg2.length;
arg37 = arg2[arg36 - 2];
arg20 = arg3[arg36 - 2 + 1];
int arg42 = getStandardOffset(arg0, arg1, arg37);
long arg22 = arg2[arg36 - 1];
int arg24 = arg3[arg36 - 1 + 1];
int arg25 = getStandardOffset(arg0, arg1, arg22);
if(arg20 > arg42 && arg24 == arg25) {
arg36 = arg2.length - 2;
ZoneOffset arg26 = ZoneOffset.ofTotalSeconds(arg3[arg36]);
ZoneOffset arg27 = ZoneOffset.ofTotalSeconds(arg3[arg36 + 1]);
LocalDateTime arg28 = LocalDateTime.ofEpochSecond(arg2[arg36], 0, arg26);
LocalDateTime arg29;
if(arg27.getTotalSeconds() > arg26.getTotalSeconds()) {
arg29 = arg28;
} else {
arg29 = arg28.plusSeconds((long)(arg3[arg36 + 1] - arg3[arg36]));
}
arg36 = arg2.length - 1;
arg26 = ZoneOffset.ofTotalSeconds(arg3[arg36]);
arg27 = ZoneOffset.ofTotalSeconds(arg3[arg36 + 1]);
arg28 = LocalDateTime.ofEpochSecond(arg2[arg36], 0, arg26);
LocalDateTime arg30;
if(arg27.getTotalSeconds() > arg26.getTotalSeconds()) {
arg30 = arg28.plusSeconds((long)(arg3[arg36 + 1] - arg3[arg36]));
} else {
arg30 = arg28;
}
arg8 = new int[]{arg29.getMonthValue() - 1, arg29.getDayOfMonth(), 0, arg29.toLocalTime().toSecondOfDay() * 1000, 0, arg30.getMonthValue() - 1, arg30.getDayOfMonth(), 0, arg30.toLocalTime().toSecondOfDay() * 1000, 0};
arg6 = (arg20 - arg42) * 1000;
}
}
}
} else {
while(true) {
if(arg14++ >= 2037) {
ZoneOffsetTransitionRule arg33 = arg4[arg4.length - 2];
ZoneOffsetTransitionRule arg34 = arg4[arg4.length - 1];
arg8 = new int[10];
if(ZoneOffsetTransitionRule.access$100(arg33) - ZoneOffsetTransitionRule.access$300(arg33) < 0 && ZoneOffsetTransitionRule.access$100(arg34) - ZoneOffsetTransitionRule.access$300(arg34) > 0) {
ZoneOffsetTransitionRule arg38 = arg33;
arg33 = arg34;
arg34 = arg38;
}
arg8[0] = ZoneOffsetTransitionRule.access$400(arg33) - 1;
byte arg41 = ZoneOffsetTransitionRule.access$500(arg33);
arg20 = ZoneOffsetTransitionRule.access$600(arg33);
if(arg20 == -1) {
arg8[1] = arg41;
arg8[2] = 0;
} else if(arg41 >= 0 && arg41 < 24) {
arg8[1] = arg41;
arg8[2] = -toCalendarDOW[arg20];
} else {
arg8[1] = -1;
arg8[2] = toCalendarDOW[arg20];
}
arg8[3] = ZoneOffsetTransitionRule.access$700(arg33) * 1000;
arg8[4] = toSTZTime[ZoneOffsetTransitionRule.access$800(arg33)];
arg8[5] = ZoneOffsetTransitionRule.access$400(arg34) - 1;
arg41 = ZoneOffsetTransitionRule.access$500(arg34);
arg20 = ZoneOffsetTransitionRule.access$600(arg34);
if(arg20 == -1) {
arg8[6] = arg41;
arg8[7] = 0;
} else if(arg41 >= 0 && arg41 < 24) {
arg8[6] = arg41;
arg8[7] = -toCalendarDOW[arg20];
} else {
arg8[6] = -1;
arg8[7] = toCalendarDOW[arg20];
}
arg8[8] = ZoneOffsetTransitionRule.access$700(arg34) * 1000;
arg8[9] = toSTZTime[ZoneOffsetTransitionRule.access$800(arg34)];
arg6 = (ZoneOffsetTransitionRule.access$100(arg33) - ZoneOffsetTransitionRule.access$300(arg33)) * 1000;
if(arg8[2] == 6 && arg8[3] == 0 && (arg.equals("Asia/Amman") || arg.equals("Asia/Gaza") || arg.equals("Asia/Hebron"))) {
arg8[2] = 5;
arg8[3] = 86400000;
}
if(arg8[2] == 7 && arg8[3] == 0 && (arg.equals("Asia/Amman") || arg.equals("Asia/Gaza") || arg.equals("Asia/Hebron"))) {
arg8[2] = 6;
arg8[3] = 86400000;
}
if(arg8[7] == 6 && arg8[8] == 0 && arg.equals("Africa/Cairo")) {
arg8[7] = 5;
arg8[8] = 86400000;
}
break;
}
ZoneOffsetTransitionRule[] arg32 = arg4;
int arg18 = arg4.length;
for(arg35 = 0; arg35 < arg18; ++arg35) {
ZoneOffsetTransitionRule arg39 = arg32[arg35];
long arg21 = arg39.getTransitionEpochSecond(arg14);
if(arg12 + 2 >= arg11.length) {
arg11 = Arrays.copyOf(arg11, arg11.length + 100);
}
if(arg13 + 1 >= arg10.length) {
arg10 = Arrays.copyOf(arg10, arg10.length + 100);
}
arg12 = addTrans(arg10, arg13++, arg11, arg12, arg21, ZoneOffsetTransitionRule.access$100(arg39), ZoneOffsetTransitionRule.access$200(arg39));
}
}
}
if(arg10 != null && arg10.length != arg13) {
if(arg13 == 0) {
arg10 = null;
} else {
arg10 = Arrays.copyOf(arg10, arg13);
}
}
if(arg11 != null && arg11.length != arg12) {
if(arg12 == 0) {
arg11 = null;
} else {
arg11 = Arrays.copyOf(arg11, arg12);
}
}
if(arg10 != null) {
Checksum arg40 = new Checksum((1)null);
for(arg15 = 0; arg15 < arg10.length; ++arg15) {
arg37 = arg10[arg15];
arg20 = (int)(arg37 >>> 4 & 15L);
int arg9999;
if(arg20 == 0) {
boolean arg45 = false;
} else {
arg9999 = arg11[arg20];
}
int arg43 = (int)(arg37 & 15L);
arg9999 = arg11[arg43];
long arg44 = arg37 >> 12;
arg40.update(arg44 + (long)arg43);
arg40.update(arg43);
arg40.update(arg20 == 0?-1:arg20);
}
arg7 = (int)arg40.getValue();
}
}
return new ZoneInfo(arg, arg31, arg6, arg7, arg10, arg11, arg8, arg9);
}
private static int getStandardOffset(long[] arg, int[] arg0, long arg1) {
int arg3;
for (arg3 = 0; arg3 < arg.length && arg1 >= arg[arg3]; ++arg3) {
;
}
return arg0[arg3];
}
private static int getYear(long arg, int arg1) {
long arg2 = arg + (long) arg1;
long arg4 = Math.floorDiv(arg2, 86400L);
long arg6 = arg4 + 719528L;
arg6 -= 60L;
long arg8 = 0L;
long arg10;
if (arg6 < 0L) {
arg10 = (arg6 + 1L) / 146097L - 1L;
arg8 = arg10 * 400L;
arg6 += -arg10 * 146097L;
}
arg10 = (400L * arg6 + 591L) / 146097L;
long arg12 = arg6 - (365L * arg10 + arg10 / 4L - arg10 / 100L + arg10 / 400L);
if (arg12 < 0L) {
--arg10;
arg12 = arg6 - (365L * arg10 + arg10 / 4L - arg10 / 100L + arg10 / 400L);
}
arg10 += arg8;
int arg14 = (int) arg12;
int arg15 = (arg14 * 5 + 2) / 153;
int arg16 = (arg15 + 2) % 12 + 1;
int arg17 = arg14 - (arg15 * 306 + 5) / 10 + 1;
arg10 += (long) (arg15 / 10);
return (int) arg10;
}
private static int indexOf(int[] arg, int arg0, int arg1, int arg2) {
for (arg2 *= 1000; arg0 < arg1; ++arg0) {
if (arg[arg0] == arg2) {
return arg0;
}
}
arg[arg0] = arg2;
return arg0;
}
private static int addTrans(long[] arg, int arg0, int[] arg1, int arg2, long arg3, int arg5, int arg6) {
int arg7 = indexOf(arg1, 0, arg2, arg5);
if (arg7 == arg2) {
++arg2;
}
int arg8 = 0;
if (arg5 != arg6) {
arg8 = indexOf(arg1, 1, arg2, arg5 - arg6);
if (arg8 == arg2) {
++arg2;
}
}
arg[arg0] = arg3 * 1000L << 12 | (long) (arg8 << 4) & 240L | (long) arg7 & 15L;
return arg2;
}
static {
String arg = ((String)AccessController.doPrivileged(new GetPropertyAction("sun.timezone.ids.oldmapping", "false"))).toLowerCase(Locale.ROOT);
USE_OLDMAPPING = arg.equals("yes") || arg.equals("true");
AccessController.doPrivileged(new 1());
CURRT = System.currentTimeMillis() / 1000L;
toCalendarDOW = new int[]{-1, 2, 3, 4, 5, 6, 7, 1};
toSTZTime = new int[]{2, 0, 1};
}
}
######################
QQ 3087438119

浙公网安备 33010602011771号