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};
   }
}

  

 

######################

posted @ 2022-09-09 12:44  西北逍遥  阅读(55)  评论(0编辑  收藏  举报