701 702 // first stanard offset 703 ZoneOffset firstStdOffset = stdOffset; 704 // first wall offset 705 ZoneOffset firstWallOffset = wallOffset; 706 707 for (ZoneLine zone : zones) { 708 // check if standard offset changed, update it if yes 709 ZoneOffset stdOffsetPrev = stdOffset; // for effectiveSavings check 710 if (zone.stdOffsetSecs != stdOffset.getTotalSeconds()) { 711 ZoneOffset stdOffsetNew = ZoneOffset.ofTotalSeconds(zone.stdOffsetSecs); 712 standardTransitionList.add( 713 ZoneOffsetTransition.of( 714 LocalDateTime.ofEpochSecond(zoneStart.toEpochSecond(wallOffset), 715 0, 716 stdOffset), 717 stdOffset, 718 stdOffsetNew)); 719 stdOffset = stdOffsetNew; 720 } 721 722 LocalDateTime zoneEnd; 723 if (zone.year == Year.MAX_VALUE) { 724 zoneEnd = LocalDateTime.MAX; 725 } else { 726 zoneEnd = zone.toDateTime(); 727 } 728 if (zoneEnd.compareTo(zoneStart) < 0) { 729 throw new IllegalStateException("Windows must be in date-time order: " + 730 zoneEnd + " < " + zoneStart); 731 } 732 // calculate effective savings at the start of the window 733 List<TransRule> trules = null; 734 List<TransRule> lastRules = null; 735 736 int effectiveSavings = zone.fixedSavingsSecs; 737 if (zone.savingsRule != null) { 738 List<RuleLine> tzdbRules = rules.get(zone.savingsRule); 739 if (tzdbRules == null) { 740 throw new IllegalArgumentException("<Rule> not found: " + 741 zone.savingsRule); 742 } 743 trules = new ArrayList<>(256); 744 lastRules = new ArrayList<>(2); 745 int lastRulesStartYear = Year.MIN_VALUE; 746 747 // merge the rules to transitions 748 for (RuleLine rule : tzdbRules) { 749 if (rule.startYear > zoneEnd.getYear()) { 750 // rules will not be used for this zone entry 751 continue; 752 } 753 rule.adjustToForwards(2004); // irrelevant, treat as leap year 754 755 int startYear = rule.startYear; 756 int endYear = rule.endYear; 757 if (zoneEnd.equals(LocalDateTime.MAX)) { 758 if (endYear == Year.MAX_VALUE) { 759 endYear = startYear; 760 lastRules.add(new TransRule(endYear, rule)); 761 lastRulesStartYear = Math.max(startYear, lastRulesStartYear); 762 } 763 } else { 764 if (endYear == Year.MAX_VALUE) { 765 //endYear = zoneEnd.getYear(); 766 endYear = zone.year; 767 } 768 } 769 int year = startYear; 770 while (year <= endYear) { 771 trules.add(new TransRule(year, rule)); 772 year++; 773 } 774 } 775 776 // last rules, fill the gap years between different last rules 777 if (zoneEnd.equals(LocalDateTime.MAX)) { 778 lastRulesStartYear = Math.max(lastRulesStartYear, zoneStart.getYear()) + 1; 779 for (TransRule rule : lastRules) { 780 if (rule.year <= lastRulesStartYear) { 781 int year = rule.year; 782 while (year <= lastRulesStartYear) { | 701 702 // first stanard offset 703 ZoneOffset firstStdOffset = stdOffset; 704 // first wall offset 705 ZoneOffset firstWallOffset = wallOffset; 706 707 for (ZoneLine zone : zones) { 708 // check if standard offset changed, update it if yes 709 ZoneOffset stdOffsetPrev = stdOffset; // for effectiveSavings check 710 if (zone.stdOffsetSecs != stdOffset.getTotalSeconds()) { 711 ZoneOffset stdOffsetNew = ZoneOffset.ofTotalSeconds(zone.stdOffsetSecs); 712 standardTransitionList.add( 713 ZoneOffsetTransition.of( 714 LocalDateTime.ofEpochSecond(zoneStart.toEpochSecond(wallOffset), 715 0, 716 stdOffset), 717 stdOffset, 718 stdOffsetNew)); 719 stdOffset = stdOffsetNew; 720 } 721 LocalDateTime zoneEnd; 722 if (zone.year == Year.MAX_VALUE) { 723 zoneEnd = LocalDateTime.MAX; 724 } else { 725 zoneEnd = zone.toDateTime(); 726 } 727 if (zoneEnd.compareTo(zoneStart) < 0) { 728 throw new IllegalStateException("Windows must be in date-time order: " + 729 zoneEnd + " < " + zoneStart); 730 } 731 // calculate effective savings at the start of the window 732 List<TransRule> trules = null; 733 List<TransRule> lastRules = null; 734 735 int effectiveSavings = zone.fixedSavingsSecs; 736 737 if (zone.savingsRule != null) { 738 List<RuleLine> tzdbRules = rules.get(zone.savingsRule); 739 if (tzdbRules == null) { 740 throw new IllegalArgumentException("<Rule> not found: " + 741 zone.savingsRule); 742 } 743 trules = new ArrayList<>(256); 744 lastRules = new ArrayList<>(2); 745 int lastRulesStartYear = Year.MIN_VALUE; 746 747 // merge the rules to transitions 748 for (RuleLine rule : tzdbRules) { 749 if (rule.startYear > zoneEnd.getYear()) { 750 // rules will not be used for this zone entry 751 continue; 752 } 753 rule.adjustToForwards(2004); // irrelevant, treat as leap year 754 755 int startYear = rule.startYear; 756 int endYear = rule.endYear; 757 if (zoneEnd.equals(LocalDateTime.MAX)) { 758 if (endYear == Year.MAX_VALUE) { 759 endYear = startYear; 760 lastRules.add(new TransRule(endYear, rule)); 761 } 762 lastRulesStartYear = Math.max(startYear, lastRulesStartYear); 763 764 } else { 765 if (endYear == Year.MAX_VALUE) { 766 //endYear = zoneEnd.getYear(); 767 endYear = zone.year; 768 } 769 } 770 int year = startYear; 771 while (year <= endYear) { 772 trules.add(new TransRule(year, rule)); 773 year++; 774 } 775 } 776 777 // last rules, fill the gap years between different last rules 778 if (zoneEnd.equals(LocalDateTime.MAX)) { 779 lastRulesStartYear = Math.max(lastRulesStartYear, zoneStart.getYear()) + 1; 780 for (TransRule rule : lastRules) { 781 if (rule.year <= lastRulesStartYear) { 782 int year = rule.year; 783 while (year <= lastRulesStartYear) { |