794 adjust = adjustCycles * 400; 795 zeroDay += -adjustCycles * DAYS_PER_CYCLE; 796 } 797 long yearEst = (400 * zeroDay + 591) / DAYS_PER_CYCLE; 798 long doyEst = zeroDay - (365 * yearEst + yearEst / 4 - yearEst / 100 + yearEst / 400); 799 if (doyEst < 0) { 800 // fix estimate 801 yearEst--; 802 doyEst = zeroDay - (365 * yearEst + yearEst / 4 - yearEst / 100 + yearEst / 400); 803 } 804 yearEst += adjust; // reset any negative year 805 int marchDoy0 = (int) doyEst; 806 // convert march-based values back to january-based 807 int marchMonth0 = (marchDoy0 * 5 + 2) / 153; 808 int month = (marchMonth0 + 2) % 12 + 1; 809 int dom = marchDoy0 - (marchMonth0 * 306 + 5) / 10 + 1; 810 yearEst += marchMonth0 / 10; 811 return (int)yearEst; 812 } 813 814 private static final int toCalendarDOW[] = new int[] { 815 -1, 816 Calendar.MONDAY, 817 Calendar.TUESDAY, 818 Calendar.WEDNESDAY, 819 Calendar.THURSDAY, 820 Calendar.FRIDAY, 821 Calendar.SATURDAY, 822 Calendar.SUNDAY 823 }; 824 825 private static final int toSTZTime[] = new int[] { 826 SimpleTimeZone.UTC_TIME, 827 SimpleTimeZone.WALL_TIME, 828 SimpleTimeZone.STANDARD_TIME, 829 }; 830 831 private static final long OFFSET_MASK = 0x0fL; 832 private static final long DST_MASK = 0xf0L; 833 private static final int DST_NSHIFT = 4; 834 private static final int TRANSITION_NSHIFT = 12; 835 private static final int LASTYEAR = 2037; 836 837 // from: 0 for offset lookup, 1 for dstsvings lookup 838 private static int indexOf(int[] offsets, int from, int nOffsets, int offset) { 839 offset *= 1000; 840 for (; from < nOffsets; from++) { 841 if (offsets[from] == offset) 842 return from; 843 } 844 offsets[from] = offset; 845 return from; 846 } 847 848 // return updated nOffsets 849 private static int addTrans(long transitions[], int nTrans, 850 int offsets[], int nOffsets, 851 long trans, int offset, int stdOffset) { 852 int offsetIndex = indexOf(offsets, 0, nOffsets, offset); 853 if (offsetIndex == nOffsets) 854 nOffsets++; 855 int dstIndex = 0; 856 if (offset != stdOffset) { 857 dstIndex = indexOf(offsets, 1, nOffsets, offset - stdOffset); 858 if (dstIndex == nOffsets) 859 nOffsets++; 860 } 861 transitions[nTrans] = ((trans * 1000) << TRANSITION_NSHIFT) | 862 ((dstIndex << DST_NSHIFT) & DST_MASK) | 863 (offsetIndex & OFFSET_MASK); 864 return nOffsets; 865 } 866 867 // ZoneInfo checksum, copy/pasted from javazic 868 private static class Checksum extends CRC32 { 869 public void update(int val) { 870 byte[] b = new byte[4]; | 794 adjust = adjustCycles * 400; 795 zeroDay += -adjustCycles * DAYS_PER_CYCLE; 796 } 797 long yearEst = (400 * zeroDay + 591) / DAYS_PER_CYCLE; 798 long doyEst = zeroDay - (365 * yearEst + yearEst / 4 - yearEst / 100 + yearEst / 400); 799 if (doyEst < 0) { 800 // fix estimate 801 yearEst--; 802 doyEst = zeroDay - (365 * yearEst + yearEst / 4 - yearEst / 100 + yearEst / 400); 803 } 804 yearEst += adjust; // reset any negative year 805 int marchDoy0 = (int) doyEst; 806 // convert march-based values back to january-based 807 int marchMonth0 = (marchDoy0 * 5 + 2) / 153; 808 int month = (marchMonth0 + 2) % 12 + 1; 809 int dom = marchDoy0 - (marchMonth0 * 306 + 5) / 10 + 1; 810 yearEst += marchMonth0 / 10; 811 return (int)yearEst; 812 } 813 814 private static final int[] toCalendarDOW = new int[] { 815 -1, 816 Calendar.MONDAY, 817 Calendar.TUESDAY, 818 Calendar.WEDNESDAY, 819 Calendar.THURSDAY, 820 Calendar.FRIDAY, 821 Calendar.SATURDAY, 822 Calendar.SUNDAY 823 }; 824 825 private static final int[] toSTZTime = new int[] { 826 SimpleTimeZone.UTC_TIME, 827 SimpleTimeZone.WALL_TIME, 828 SimpleTimeZone.STANDARD_TIME, 829 }; 830 831 private static final long OFFSET_MASK = 0x0fL; 832 private static final long DST_MASK = 0xf0L; 833 private static final int DST_NSHIFT = 4; 834 private static final int TRANSITION_NSHIFT = 12; 835 private static final int LASTYEAR = 2037; 836 837 // from: 0 for offset lookup, 1 for dstsvings lookup 838 private static int indexOf(int[] offsets, int from, int nOffsets, int offset) { 839 offset *= 1000; 840 for (; from < nOffsets; from++) { 841 if (offsets[from] == offset) 842 return from; 843 } 844 offsets[from] = offset; 845 return from; 846 } 847 848 // return updated nOffsets 849 private static int addTrans(long[] transitions, int nTrans, 850 int[] offsets, int nOffsets, 851 long trans, int offset, int stdOffset) { 852 int offsetIndex = indexOf(offsets, 0, nOffsets, offset); 853 if (offsetIndex == nOffsets) 854 nOffsets++; 855 int dstIndex = 0; 856 if (offset != stdOffset) { 857 dstIndex = indexOf(offsets, 1, nOffsets, offset - stdOffset); 858 if (dstIndex == nOffsets) 859 nOffsets++; 860 } 861 transitions[nTrans] = ((trans * 1000) << TRANSITION_NSHIFT) | 862 ((dstIndex << DST_NSHIFT) & DST_MASK) | 863 (offsetIndex & OFFSET_MASK); 864 return nOffsets; 865 } 866 867 // ZoneInfo checksum, copy/pasted from javazic 868 private static class Checksum extends CRC32 { 869 public void update(int val) { 870 byte[] b = new byte[4]; |