src/java.base/share/classes/sun/util/calendar/ZoneInfoFile.java
author rpatil
Wed, 10 Jul 2019 05:12:23 +0100
changeset 55634 0f1e29c77e50
parent 50817 fa1e04811ff6
child 57667 79036e5e744b
permissions -rw-r--r--
8224560: (tz) Upgrade time-zone data to tzdata2019a 8225580: tzdata2018i integration causes test failures on jdk-13 Reviewed-by: andrew, naoto
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     1
/*
55634
0f1e29c77e50 8224560: (tz) Upgrade time-zone data to tzdata2019a
rpatil
parents: 50817
diff changeset
     2
 * Copyright (c) 2012, 2019, Oracle and/or its affiliates. All rights reserved.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
90ce3da70b43 Initial load
duke
parents:
diff changeset
     4
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
90ce3da70b43 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 4194
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 4194
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    10
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
90ce3da70b43 Initial load
duke
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
90ce3da70b43 Initial load
duke
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
90ce3da70b43 Initial load
duke
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
90ce3da70b43 Initial load
duke
parents:
diff changeset
    15
 * accompanied this code).
90ce3da70b43 Initial load
duke
parents:
diff changeset
    16
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
90ce3da70b43 Initial load
duke
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    20
 *
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 4194
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 4194
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 4194
diff changeset
    23
 * questions.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    24
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    25
90ce3da70b43 Initial load
duke
parents:
diff changeset
    26
package sun.util.calendar;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    27
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    28
import java.io.ByteArrayInputStream;
21286
0641a36bb610 8025971: Remove ZoneId.OLD_SHORT_IDS
sherman
parents: 17464
diff changeset
    29
import java.io.BufferedInputStream;
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    30
import java.io.DataInput;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    31
import java.io.DataInputStream;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    32
import java.io.File;
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
    33
import java.io.FileInputStream;
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    34
import java.io.IOException;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    35
import java.io.StreamCorruptedException;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    36
import java.security.AccessController;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    37
import java.security.PrivilegedAction;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    38
import java.time.LocalDateTime;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    39
import java.time.ZoneOffset;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    40
import java.util.ArrayList;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    41
import java.util.Arrays;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    42
import java.util.Calendar;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    43
import java.util.Collections;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    44
import java.util.HashMap;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    45
import java.util.List;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    46
import java.util.Locale;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    47
import java.util.Map;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    48
import java.util.SimpleTimeZone;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    49
import java.util.concurrent.ConcurrentHashMap;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    50
import java.util.zip.CRC32;
50817
fa1e04811ff6 8066709: Make some JDK system properties read only
rriggs
parents: 47216
diff changeset
    51
fa1e04811ff6 8066709: Make some JDK system properties read only
rriggs
parents: 47216
diff changeset
    52
import jdk.internal.util.StaticProperty;
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
    53
import sun.security.action.GetPropertyAction;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    54
90ce3da70b43 Initial load
duke
parents:
diff changeset
    55
/**
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    56
 * Loads TZDB time-zone rules for j.u.TimeZone
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    57
 * <p>
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    58
 * @since 1.8
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    59
 */
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    60
public final class ZoneInfoFile {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    61
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    62
    /**
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    63
     * Gets all available IDs supported in the Java run-time.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    64
     *
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    65
     * @return a set of time zone IDs.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    66
     */
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
    67
    public static String[] getZoneIds() {
21306
e56a970409e5 8026842: Remove Time-Zone IDs HST/EST/MST
sherman
parents: 21286
diff changeset
    68
        int len = regions.length + oldMappings.length;
e56a970409e5 8026842: Remove Time-Zone IDs HST/EST/MST
sherman
parents: 21286
diff changeset
    69
        if (!USE_OLDMAPPING) {
e56a970409e5 8026842: Remove Time-Zone IDs HST/EST/MST
sherman
parents: 21286
diff changeset
    70
            len += 3;    // EST/HST/MST not in tzdb.dat
e56a970409e5 8026842: Remove Time-Zone IDs HST/EST/MST
sherman
parents: 21286
diff changeset
    71
        }
e56a970409e5 8026842: Remove Time-Zone IDs HST/EST/MST
sherman
parents: 21286
diff changeset
    72
        String[] ids = Arrays.copyOf(regions, len);
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
    73
        int i = regions.length;
21306
e56a970409e5 8026842: Remove Time-Zone IDs HST/EST/MST
sherman
parents: 21286
diff changeset
    74
        if (!USE_OLDMAPPING) {
e56a970409e5 8026842: Remove Time-Zone IDs HST/EST/MST
sherman
parents: 21286
diff changeset
    75
            ids[i++] = "EST";
e56a970409e5 8026842: Remove Time-Zone IDs HST/EST/MST
sherman
parents: 21286
diff changeset
    76
            ids[i++] = "HST";
e56a970409e5 8026842: Remove Time-Zone IDs HST/EST/MST
sherman
parents: 21286
diff changeset
    77
            ids[i++] = "MST";
e56a970409e5 8026842: Remove Time-Zone IDs HST/EST/MST
sherman
parents: 21286
diff changeset
    78
        }
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
    79
        for (int j = 0; j < oldMappings.length; j++) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
    80
            ids[i++] = oldMappings[j][0];
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
    81
        }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
    82
        return ids;
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    83
    }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    84
90ce3da70b43 Initial load
duke
parents:
diff changeset
    85
    /**
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    86
     * Gets all available IDs that have the same value as the
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    87
     * specified raw GMT offset.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    88
     *
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    89
     * @param rawOffset  the GMT offset in milliseconds. This
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    90
     *                   value should not include any daylight saving time.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    91
     * @return an array of time zone IDs.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    92
     */
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    93
    public static String[] getZoneIds(int rawOffset) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    94
        List<String> ids = new ArrayList<>();
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
    95
        for (String id : getZoneIds()) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
    96
            ZoneInfo zi = getZoneInfo(id);
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    97
            if (zi.getRawOffset() == rawOffset) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    98
                ids.add(id);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
    99
            }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   100
        }
15665
2223468cd706 8008161: Regression: j.u.TimeZone.getAvailableIDs(rawOffset) returns non-sorted list
sherman
parents: 15658
diff changeset
   101
        // It appears the "zi" implementation returns the
2223468cd706 8008161: Regression: j.u.TimeZone.getAvailableIDs(rawOffset) returns non-sorted list
sherman
parents: 15658
diff changeset
   102
        // sorted list, though the specification does not
2223468cd706 8008161: Regression: j.u.TimeZone.getAvailableIDs(rawOffset) returns non-sorted list
sherman
parents: 15658
diff changeset
   103
        // specify it. Keep the same behavior for better
2223468cd706 8008161: Regression: j.u.TimeZone.getAvailableIDs(rawOffset) returns non-sorted list
sherman
parents: 15658
diff changeset
   104
        // compatibility.
2223468cd706 8008161: Regression: j.u.TimeZone.getAvailableIDs(rawOffset) returns non-sorted list
sherman
parents: 15658
diff changeset
   105
        String[] list = ids.toArray(new String[ids.size()]);
2223468cd706 8008161: Regression: j.u.TimeZone.getAvailableIDs(rawOffset) returns non-sorted list
sherman
parents: 15658
diff changeset
   106
        Arrays.sort(list);
2223468cd706 8008161: Regression: j.u.TimeZone.getAvailableIDs(rawOffset) returns non-sorted list
sherman
parents: 15658
diff changeset
   107
        return list;
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   108
    }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   109
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   110
    public static ZoneInfo getZoneInfo(String zoneId) {
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   111
        if (zoneId == null) {
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   112
            return null;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   113
        }
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   114
        ZoneInfo zi = getZoneInfo0(zoneId);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   115
        if (zi != null) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   116
            zi = (ZoneInfo)zi.clone();
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   117
            zi.setID(zoneId);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   118
        }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   119
        return zi;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   120
    }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   121
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   122
    private static ZoneInfo getZoneInfo0(String zoneId) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   123
        try {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   124
            ZoneInfo zi = zones.get(zoneId);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   125
            if (zi != null) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   126
                return zi;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   127
            }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   128
            String zid = zoneId;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   129
            if (aliases.containsKey(zoneId)) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   130
                zid = aliases.get(zoneId);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   131
            }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   132
            int index = Arrays.binarySearch(regions, zid);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   133
            if (index < 0) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   134
                return null;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   135
            }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   136
            byte[] bytes = ruleArray[indices[index]];
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   137
            DataInputStream dis = new DataInputStream(new ByteArrayInputStream(bytes));
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   138
            zi = getZoneInfo(dis, zid);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   139
            zones.put(zoneId, zi);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   140
            return zi;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   141
        } catch (Exception ex) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   142
            throw new RuntimeException("Invalid binary time-zone data: TZDB:" +
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   143
                zoneId + ", version: " + versionId, ex);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   144
        }
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   145
    }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   146
90ce3da70b43 Initial load
duke
parents:
diff changeset
   147
    /**
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   148
     * Returns a Map from alias time zone IDs to their standard
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   149
     * time zone IDs.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   150
     *
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   151
     * @return an unmodified alias mapping
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   152
     */
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   153
    public static Map<String, String> getAliasMap() {
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   154
        return Collections.unmodifiableMap(aliases);
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   155
    }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   156
90ce3da70b43 Initial load
duke
parents:
diff changeset
   157
    /**
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   158
     * Gets the version of this tz data.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   159
     *
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   160
     * @return the tzdb version
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   161
     */
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   162
    public static String getVersion() {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   163
        return versionId;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   164
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   165
90ce3da70b43 Initial load
duke
parents:
diff changeset
   166
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   167
     * Gets a ZoneInfo with the given GMT offset. The object
90ce3da70b43 Initial load
duke
parents:
diff changeset
   168
     * has its ID in the format of GMT{+|-}hh:mm.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   169
     *
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   170
     * @param originalId  the given custom id (before normalized such as "GMT+9")
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   171
     * @param gmtOffset   GMT offset <em>in milliseconds</em>
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   172
     * @return a ZoneInfo constructed with the given GMT offset
90ce3da70b43 Initial load
duke
parents:
diff changeset
   173
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   174
    public static ZoneInfo getCustomTimeZone(String originalId, int gmtOffset) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   175
        String id = toCustomID(gmtOffset);
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   176
        return new ZoneInfo(id, gmtOffset);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   177
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   178
90ce3da70b43 Initial load
duke
parents:
diff changeset
   179
    public static String toCustomID(int gmtOffset) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   180
        char sign;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   181
        int offset = gmtOffset / 60000;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   182
        if (offset >= 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   183
            sign = '+';
90ce3da70b43 Initial load
duke
parents:
diff changeset
   184
        } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   185
            sign = '-';
90ce3da70b43 Initial load
duke
parents:
diff changeset
   186
            offset = -offset;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   187
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   188
        int hh = offset / 60;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   189
        int mm = offset % 60;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   190
90ce3da70b43 Initial load
duke
parents:
diff changeset
   191
        char[] buf = new char[] { 'G', 'M', 'T', sign, '0', '0', ':', '0', '0' };
90ce3da70b43 Initial load
duke
parents:
diff changeset
   192
        if (hh >= 10) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   193
            buf[4] += hh / 10;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   194
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   195
        buf[5] += hh % 10;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   196
        if (mm != 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   197
            buf[7] += mm / 10;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   198
            buf[8] += mm % 10;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   199
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   200
        return new String(buf);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   201
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   202
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   203
    ///////////////////////////////////////////////////////////
11130
c7093e306a34 7117487: Warnings Cleanup: some i18n classes in java.util and sun.util
okutsu
parents: 9025
diff changeset
   204
    private ZoneInfoFile() {
c7093e306a34 7117487: Warnings Cleanup: some i18n classes in java.util and sun.util
okutsu
parents: 9025
diff changeset
   205
    }
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   206
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   207
    private static String versionId;
32649
2ee9017c7597 8136583: Core libraries should use blessed modifier order
martin
parents: 29722
diff changeset
   208
    private static final Map<String, ZoneInfo> zones = new ConcurrentHashMap<>();
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   209
    private static Map<String, String> aliases = new HashMap<>();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   210
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   211
    private static byte[][] ruleArray;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   212
    private static String[] regions;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   213
    private static int[] indices;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   214
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   215
    // Flag for supporting JDK backward compatible IDs, such as "EST".
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   216
    private static final boolean USE_OLDMAPPING;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   217
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   218
    private static String[][] oldMappings = new String[][] {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   219
        { "ACT", "Australia/Darwin" },
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   220
        { "AET", "Australia/Sydney" },
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   221
        { "AGT", "America/Argentina/Buenos_Aires" },
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   222
        { "ART", "Africa/Cairo" },
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   223
        { "AST", "America/Anchorage" },
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   224
        { "BET", "America/Sao_Paulo" },
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   225
        { "BST", "Asia/Dhaka" },
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   226
        { "CAT", "Africa/Harare" },
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   227
        { "CNT", "America/St_Johns" },
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   228
        { "CST", "America/Chicago" },
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   229
        { "CTT", "Asia/Shanghai" },
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   230
        { "EAT", "Africa/Addis_Ababa" },
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   231
        { "ECT", "Europe/Paris" },
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   232
        { "IET", "America/Indiana/Indianapolis" },
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   233
        { "IST", "Asia/Kolkata" },
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   234
        { "JST", "Asia/Tokyo" },
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   235
        { "MIT", "Pacific/Apia" },
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   236
        { "NET", "Asia/Yerevan" },
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   237
        { "NST", "Pacific/Auckland" },
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   238
        { "PLT", "Asia/Karachi" },
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   239
        { "PNT", "America/Phoenix" },
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   240
        { "PRT", "America/Puerto_Rico" },
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   241
        { "PST", "America/Los_Angeles" },
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   242
        { "SST", "Pacific/Guadalcanal" },
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   243
        { "VST", "Asia/Ho_Chi_Minh" },
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   244
    };
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   245
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   246
    static {
37594
5aa7438a8ce1 8154853: java/util/TimeZone/OldIDMappingTest.sh fails after JDK-8154231
redestad
parents: 37593
diff changeset
   247
        String oldmapping = GetPropertyAction
37781
71ed5645f17c 8155775: Re-examine naming of privileged methods to access System properties
redestad
parents: 37594
diff changeset
   248
                .privilegedGetProperty("sun.timezone.ids.oldmapping", "false")
37594
5aa7438a8ce1 8154853: java/util/TimeZone/OldIDMappingTest.sh fails after JDK-8154231
redestad
parents: 37593
diff changeset
   249
                .toLowerCase(Locale.ROOT);
5aa7438a8ce1 8154853: java/util/TimeZone/OldIDMappingTest.sh fails after JDK-8154231
redestad
parents: 37593
diff changeset
   250
        USE_OLDMAPPING = (oldmapping.equals("yes") || oldmapping.equals("true"));
5aa7438a8ce1 8154853: java/util/TimeZone/OldIDMappingTest.sh fails after JDK-8154231
redestad
parents: 37593
diff changeset
   251
        AccessController.doPrivileged(new PrivilegedAction<Void>() {
5aa7438a8ce1 8154853: java/util/TimeZone/OldIDMappingTest.sh fails after JDK-8154231
redestad
parents: 37593
diff changeset
   252
            public Void run() {
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   253
                try {
50817
fa1e04811ff6 8066709: Make some JDK system properties read only
rriggs
parents: 47216
diff changeset
   254
                    String libDir = StaticProperty.javaHome() + File.separator + "lib";
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   255
                    try (DataInputStream dis = new DataInputStream(
21286
0641a36bb610 8025971: Remove ZoneId.OLD_SHORT_IDS
sherman
parents: 17464
diff changeset
   256
                             new BufferedInputStream(new FileInputStream(
0641a36bb610 8025971: Remove ZoneId.OLD_SHORT_IDS
sherman
parents: 17464
diff changeset
   257
                                 new File(libDir, "tzdb.dat"))))) {
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   258
                        load(dis);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   259
                    }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   260
                } catch (Exception x) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   261
                    throw new Error(x);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   262
                }
37594
5aa7438a8ce1 8154853: java/util/TimeZone/OldIDMappingTest.sh fails after JDK-8154231
redestad
parents: 37593
diff changeset
   263
                return null;
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   264
            }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   265
        });
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   266
    }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   267
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   268
    private static void addOldMapping() {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   269
        for (String[] alias : oldMappings) {
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   270
            aliases.put(alias[0], alias[1]);
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   271
        }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   272
        if (USE_OLDMAPPING) {
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   273
            aliases.put("EST", "America/New_York");
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   274
            aliases.put("MST", "America/Denver");
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   275
            aliases.put("HST", "Pacific/Honolulu");
21306
e56a970409e5 8026842: Remove Time-Zone IDs HST/EST/MST
sherman
parents: 21286
diff changeset
   276
        } else {
e56a970409e5 8026842: Remove Time-Zone IDs HST/EST/MST
sherman
parents: 21286
diff changeset
   277
            zones.put("EST", new ZoneInfo("EST", -18000000));
e56a970409e5 8026842: Remove Time-Zone IDs HST/EST/MST
sherman
parents: 21286
diff changeset
   278
            zones.put("MST", new ZoneInfo("MST", -25200000));
e56a970409e5 8026842: Remove Time-Zone IDs HST/EST/MST
sherman
parents: 21286
diff changeset
   279
            zones.put("HST", new ZoneInfo("HST", -36000000));
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   280
        }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   281
    }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   282
21286
0641a36bb610 8025971: Remove ZoneId.OLD_SHORT_IDS
sherman
parents: 17464
diff changeset
   283
    public static boolean useOldMapping() {
0641a36bb610 8025971: Remove ZoneId.OLD_SHORT_IDS
sherman
parents: 17464
diff changeset
   284
       return USE_OLDMAPPING;
0641a36bb610 8025971: Remove ZoneId.OLD_SHORT_IDS
sherman
parents: 17464
diff changeset
   285
    }
0641a36bb610 8025971: Remove ZoneId.OLD_SHORT_IDS
sherman
parents: 17464
diff changeset
   286
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   287
    /**
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   288
     * Loads the rules from a DateInputStream
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   289
     *
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   290
     * @param dis  the DateInputStream to load, not null
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   291
     * @throws Exception if an error occurs
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   292
     */
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   293
    private static void load(DataInputStream dis) throws ClassNotFoundException, IOException {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   294
        if (dis.readByte() != 1) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   295
            throw new StreamCorruptedException("File format not recognised");
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   296
        }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   297
        // group
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   298
        String groupId = dis.readUTF();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   299
        if ("TZDB".equals(groupId) == false) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   300
            throw new StreamCorruptedException("File format not recognised");
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   301
        }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   302
        // versions, only keep the last one
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   303
        int versionCount = dis.readShort();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   304
        for (int i = 0; i < versionCount; i++) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   305
            versionId = dis.readUTF();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   306
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   307
        }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   308
        // regions
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   309
        int regionCount = dis.readShort();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   310
        String[] regionArray = new String[regionCount];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   311
        for (int i = 0; i < regionCount; i++) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   312
            regionArray[i] = dis.readUTF();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   313
        }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   314
        // rules
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   315
        int ruleCount = dis.readShort();
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   316
        ruleArray = new byte[ruleCount][];
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   317
        for (int i = 0; i < ruleCount; i++) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   318
            byte[] bytes = new byte[dis.readShort()];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   319
            dis.readFully(bytes);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   320
            ruleArray[i] = bytes;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   321
        }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   322
        // link version-region-rules, only keep the last version, if more than one
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   323
        for (int i = 0; i < versionCount; i++) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   324
            regionCount = dis.readShort();
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   325
            regions = new String[regionCount];
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   326
            indices = new int[regionCount];
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   327
            for (int j = 0; j < regionCount; j++) {
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   328
                regions[j] = regionArray[dis.readShort()];
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   329
                indices[j] = dis.readShort();
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   330
            }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   331
        }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   332
        // remove the following ids from the map, they
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   333
        // are exclued from the "old" ZoneInfo
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   334
        zones.remove("ROC");
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   335
        for (int i = 0; i < versionCount; i++) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   336
            int aliasCount = dis.readShort();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   337
            aliases.clear();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   338
            for (int j = 0; j < aliasCount; j++) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   339
                String alias = regionArray[dis.readShort()];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   340
                String region = regionArray[dis.readShort()];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   341
                aliases.put(alias, region);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   342
            }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   343
        }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   344
        // old us time-zone names
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   345
        addOldMapping();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   346
    }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   347
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   348
    /////////////////////////Ser/////////////////////////////////
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   349
    public static ZoneInfo getZoneInfo(DataInput in, String zoneId) throws Exception {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   350
        byte type = in.readByte();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   351
        // TBD: assert ZRULES:
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   352
        int stdSize = in.readInt();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   353
        long[] stdTrans = new long[stdSize];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   354
        for (int i = 0; i < stdSize; i++) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   355
            stdTrans[i] = readEpochSec(in);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   356
        }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   357
        int [] stdOffsets = new int[stdSize + 1];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   358
        for (int i = 0; i < stdOffsets.length; i++) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   359
            stdOffsets[i] = readOffset(in);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   360
        }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   361
        int savSize = in.readInt();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   362
        long[] savTrans = new long[savSize];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   363
        for (int i = 0; i < savSize; i++) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   364
            savTrans[i] = readEpochSec(in);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   365
        }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   366
        int[] savOffsets = new int[savSize + 1];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   367
        for (int i = 0; i < savOffsets.length; i++) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   368
            savOffsets[i] = readOffset(in);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   369
        }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   370
        int ruleSize = in.readByte();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   371
        ZoneOffsetTransitionRule[] rules = new ZoneOffsetTransitionRule[ruleSize];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   372
        for (int i = 0; i < ruleSize; i++) {
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   373
            rules[i] = new ZoneOffsetTransitionRule(in);
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   374
        }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   375
        return getZoneInfo(zoneId, stdTrans, stdOffsets, savTrans, savOffsets, rules);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   376
    }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   377
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   378
    public static int readOffset(DataInput in) throws IOException {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   379
        int offsetByte = in.readByte();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   380
        return offsetByte == 127 ? in.readInt() : offsetByte * 900;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   381
    }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   382
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   383
    static long readEpochSec(DataInput in) throws IOException {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   384
        int hiByte = in.readByte() & 255;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   385
        if (hiByte == 255) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   386
            return in.readLong();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   387
        } else {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   388
            int midByte = in.readByte() & 255;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   389
            int loByte = in.readByte() & 255;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   390
            long tot = ((hiByte << 16) + (midByte << 8) + loByte);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   391
            return (tot * 900) - 4575744000L;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   392
        }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   393
    }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   394
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   395
    /////////////////////////ZoneRules --> ZoneInfo/////////////////////////////////
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   396
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   397
    // ZoneInfo starts with UTC1900
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   398
    private static final long UTC1900 = -2208988800L;
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   399
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   400
    // ZoneInfo ends with   UTC2037
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   401
    // LocalDateTime.of(2038, 1, 1, 0, 0, 0).toEpochSecond(ZoneOffset.UTC) - 1;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   402
    private static final long UTC2037 = 2145916799L;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   403
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   404
    // ZoneInfo has an ending entry for 2037, this need to be offset by
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   405
    // a "rawOffset"
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   406
    // LocalDateTime.of(2037, 1, 1, 0, 0, 0).toEpochSecond(ZoneOffset.UTC));
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   407
    private static final long LDT2037 = 2114380800L;
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   408
21842
81911f748777 8027848: The ZoneInfoFile doesn't honor future GMT offset changes
aefimov
parents: 21306
diff changeset
   409
    //Current time. Used to determine future GMToffset transitions
81911f748777 8027848: The ZoneInfoFile doesn't honor future GMT offset changes
aefimov
parents: 21306
diff changeset
   410
    private static final long CURRT = System.currentTimeMillis()/1000;
81911f748777 8027848: The ZoneInfoFile doesn't honor future GMT offset changes
aefimov
parents: 21306
diff changeset
   411
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   412
    /* Get a ZoneInfo instance.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   413
     *
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   414
     * @param standardTransitions  the standard transitions, not null
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   415
     * @param standardOffsets  the standard offsets, not null
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   416
     * @param savingsInstantTransitions  the standard transitions, not null
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   417
     * @param wallOffsets  the wall offsets, not null
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   418
     * @param lastRules  the recurring last rules, size 15 or less, not null
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   419
     */
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   420
    private static ZoneInfo getZoneInfo(String zoneId,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   421
                                        long[] standardTransitions,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   422
                                        int[] standardOffsets,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   423
                                        long[] savingsInstantTransitions,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   424
                                        int[] wallOffsets,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   425
                                        ZoneOffsetTransitionRule[] lastRules) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   426
        int rawOffset = 0;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   427
        int dstSavings = 0;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   428
        int checksum = 0;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   429
        int[] params = null;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   430
        boolean willGMTOffsetChange = false;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   431
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   432
        // rawOffset, pick the last one
21842
81911f748777 8027848: The ZoneInfoFile doesn't honor future GMT offset changes
aefimov
parents: 21306
diff changeset
   433
        if (standardTransitions.length > 0) {
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   434
            rawOffset = standardOffsets[standardOffsets.length - 1] * 1000;
21842
81911f748777 8027848: The ZoneInfoFile doesn't honor future GMT offset changes
aefimov
parents: 21306
diff changeset
   435
            willGMTOffsetChange = standardTransitions[standardTransitions.length - 1] > CURRT;
81911f748777 8027848: The ZoneInfoFile doesn't honor future GMT offset changes
aefimov
parents: 21306
diff changeset
   436
        }
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   437
        else
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   438
            rawOffset = standardOffsets[0] * 1000;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   439
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   440
        // transitions, offsets;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   441
        long[] transitions = null;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   442
        int[]  offsets = null;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   443
        int    nOffsets = 0;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   444
        int    nTrans = 0;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   445
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   446
        if (savingsInstantTransitions.length != 0) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   447
            transitions = new long[250];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   448
            offsets = new int[100];    // TBD: ZoneInfo actually can't handle
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   449
                                       // offsets.length > 16 (4-bit index limit)
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   450
            // last year in trans table
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   451
            // It should not matter to use before or after offset for year
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   452
            int lastyear = getYear(savingsInstantTransitions[savingsInstantTransitions.length - 1],
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   453
                                   wallOffsets[savingsInstantTransitions.length - 1]);
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   454
            int i = 0, k = 1;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   455
            while (i < savingsInstantTransitions.length &&
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   456
                   savingsInstantTransitions[i] < UTC1900) {
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   457
                i++;     // skip any date before UTC1900
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   458
            }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   459
            if (i < savingsInstantTransitions.length) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   460
                // javazic writes the last GMT offset into index 0!
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   461
                if (i < savingsInstantTransitions.length) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   462
                    offsets[0] = standardOffsets[standardOffsets.length - 1] * 1000;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   463
                    nOffsets = 1;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   464
                }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   465
                // ZoneInfo has a beginning entry for 1900.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   466
                // Only add it if this is not the only one in table
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   467
                nOffsets = addTrans(transitions, nTrans++,
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   468
                                    offsets, nOffsets,
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   469
                                    UTC1900,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   470
                                    wallOffsets[i],
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   471
                                    getStandardOffset(standardTransitions, standardOffsets, UTC1900));
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   472
            }
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   473
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   474
            for (; i < savingsInstantTransitions.length; i++) {
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   475
                long trans = savingsInstantTransitions[i];
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   476
                if (trans > UTC2037) {
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   477
                    // no trans beyond LASTYEAR
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   478
                    lastyear = LASTYEAR;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   479
                    break;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   480
                }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   481
                while (k < standardTransitions.length) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   482
                    // some standard offset transitions don't exist in
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   483
                    // savingInstantTrans, if the offset "change" doesn't
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   484
                    // really change the "effectiveWallOffset". For example
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   485
                    // the 1999/2000 pair in Zone Arg/Buenos_Aires, in which
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   486
                    // the daylightsaving "happened" but it actually does
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   487
                    // not result in the timezone switch. ZoneInfo however
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   488
                    // needs them in its transitions table
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   489
                    long trans_s = standardTransitions[k];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   490
                    if (trans_s >= UTC1900) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   491
                        if (trans_s > trans)
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   492
                            break;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   493
                        if (trans_s < trans) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   494
                            if (nOffsets + 2 >= offsets.length) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   495
                                offsets = Arrays.copyOf(offsets, offsets.length + 100);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   496
                            }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   497
                            if (nTrans + 1 >= transitions.length) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   498
                                transitions = Arrays.copyOf(transitions, transitions.length + 100);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   499
                            }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   500
                            nOffsets = addTrans(transitions, nTrans++, offsets, nOffsets,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   501
                                                trans_s,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   502
                                                wallOffsets[i],
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   503
                                                standardOffsets[k+1]);
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   504
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   505
                        }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   506
                    }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   507
                    k++;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   508
                }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   509
                if (nOffsets + 2 >= offsets.length) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   510
                    offsets = Arrays.copyOf(offsets, offsets.length + 100);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   511
                }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   512
                if (nTrans + 1 >= transitions.length) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   513
                    transitions = Arrays.copyOf(transitions, transitions.length + 100);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   514
                }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   515
                nOffsets = addTrans(transitions, nTrans++, offsets, nOffsets,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   516
                                    trans,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   517
                                    wallOffsets[i + 1],
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   518
                                    getStandardOffset(standardTransitions, standardOffsets, trans));
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   519
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   520
            }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   521
            // append any leftover standard trans
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   522
            while (k < standardTransitions.length) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   523
                long trans = standardTransitions[k];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   524
                if (trans >= UTC1900) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   525
                    int offset = wallOffsets[i];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   526
                    int offsetIndex = indexOf(offsets, 0, nOffsets, offset);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   527
                    if (offsetIndex == nOffsets)
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   528
                        nOffsets++;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   529
                    transitions[nTrans++] = ((trans * 1000) << TRANSITION_NSHIFT) |
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   530
                                            (offsetIndex & OFFSET_MASK);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   531
                }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   532
                k++;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   533
            }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   534
            if (lastRules.length > 1) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   535
                // fill the gap between the last trans until LASTYEAR
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   536
                while (lastyear++ < LASTYEAR) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   537
                    for (ZoneOffsetTransitionRule zotr : lastRules) {
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   538
                        long trans = zotr.getTransitionEpochSecond(lastyear);
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   539
                        if (nOffsets + 2 >= offsets.length) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   540
                            offsets = Arrays.copyOf(offsets, offsets.length + 100);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   541
                        }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   542
                        if (nTrans + 1 >= transitions.length) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   543
                            transitions = Arrays.copyOf(transitions, transitions.length + 100);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   544
                        }
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   545
                        nOffsets = addTrans(transitions, nTrans++,
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   546
                                            offsets, nOffsets,
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   547
                                            trans,
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   548
                                            zotr.offsetAfter,
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   549
                                            zotr.standardOffset);
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   550
                    }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   551
                }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   552
                ZoneOffsetTransitionRule startRule =  lastRules[lastRules.length - 2];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   553
                ZoneOffsetTransitionRule endRule =  lastRules[lastRules.length - 1];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   554
                params = new int[10];
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   555
                if (startRule.offsetAfter - startRule.offsetBefore < 0 &&
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   556
                    endRule.offsetAfter - endRule.offsetBefore > 0) {
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   557
                    ZoneOffsetTransitionRule tmp;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   558
                    tmp = startRule;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   559
                    startRule = endRule;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   560
                    endRule = tmp;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   561
                }
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   562
                params[0] = startRule.month - 1;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   563
                int dom = startRule.dom;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   564
                int dow = startRule.dow;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   565
                if (dow == -1) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   566
                    params[1] = dom;
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   567
                    params[2] = 0;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   568
                } else {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   569
                    // ZoneRulesBuilder adjusts < 0 case (-1, for last, don't have
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   570
                    // "<=" case yet) to positive value if not February (it appears
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   571
                    // we don't have February cutoff in tzdata table yet)
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   572
                    // Ideally, if JSR310 can just pass in the nagative and
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   573
                    // we can then pass in the dom = -1, dow > 0 into ZoneInfo
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   574
                    //
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   575
                    // hacking, assume the >=24 is the result of ZRB optimization for
55634
0f1e29c77e50 8224560: (tz) Upgrade time-zone data to tzdata2019a
rpatil
parents: 50817
diff changeset
   576
                    // "last", it works for now. From tzdata2019a this hacking
0f1e29c77e50 8224560: (tz) Upgrade time-zone data to tzdata2019a
rpatil
parents: 50817
diff changeset
   577
                    // will not work for Asia/Gaza and Asia/Hebron which follow
0f1e29c77e50 8224560: (tz) Upgrade time-zone data to tzdata2019a
rpatil
parents: 50817
diff changeset
   578
                    // Palestine DST rules.
0f1e29c77e50 8224560: (tz) Upgrade time-zone data to tzdata2019a
rpatil
parents: 50817
diff changeset
   579
                    if (dom < 0 || dom >= 24 &&
0f1e29c77e50 8224560: (tz) Upgrade time-zone data to tzdata2019a
rpatil
parents: 50817
diff changeset
   580
                                   !(zoneId.equals("Asia/Gaza") ||
0f1e29c77e50 8224560: (tz) Upgrade time-zone data to tzdata2019a
rpatil
parents: 50817
diff changeset
   581
                                     zoneId.equals("Asia/Hebron"))) {
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   582
                        params[1] = -1;
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   583
                        params[2] = toCalendarDOW[dow];
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   584
                    } else {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   585
                        params[1] = dom;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   586
                        // To specify a day of week on or after an exact day of month,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   587
                        // set the month to an exact month value, day-of-month to the
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   588
                        // day on or after which the rule is applied, and day-of-week
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   589
                        // to a negative Calendar.DAY_OF_WEEK DAY_OF_WEEK field value.
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   590
                        params[2] = -toCalendarDOW[dow];
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   591
                    }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   592
                }
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   593
                params[3] = startRule.secondOfDay * 1000;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   594
                params[4] = toSTZTime[startRule.timeDefinition];
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   595
                params[5] = endRule.month - 1;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   596
                dom = endRule.dom;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   597
                dow = endRule.dow;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   598
                if (dow == -1) {
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   599
                    params[6] = dom;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   600
                    params[7] = 0;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   601
                } else {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   602
                    // hacking: see comment above
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   603
                    if (dom < 0 || dom >= 24) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   604
                        params[6] = -1;
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   605
                        params[7] = toCalendarDOW[dow];
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   606
                    } else {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   607
                        params[6] = dom;
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   608
                        params[7] = -toCalendarDOW[dow];
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   609
                    }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   610
                }
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   611
                params[8] = endRule.secondOfDay * 1000;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   612
                params[9] = toSTZTime[endRule.timeDefinition];
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   613
                dstSavings = (startRule.offsetAfter - startRule.offsetBefore) * 1000;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   614
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   615
                // Note: known mismatching -> Asia/Amman
17464
268d3ce75045 8013386: (tz) Support tzdata2013c
sherman
parents: 16852
diff changeset
   616
                //                            Asia/Gaza
268d3ce75045 8013386: (tz) Support tzdata2013c
sherman
parents: 16852
diff changeset
   617
                //                            Asia/Hebron
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   618
                // ZoneInfo :      startDayOfWeek=5     <= Thursday
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   619
                //                 startTime=86400000   <= 24 hours
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   620
                // This:           startDayOfWeek=6
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   621
                //                 startTime=0
26452
04bfc550f2b4 8049343: (tz) Support tzdata2014g
aefimov
parents: 25859
diff changeset
   622
                // Similar workaround needs to be applied to Africa/Cairo and
04bfc550f2b4 8049343: (tz) Support tzdata2014g
aefimov
parents: 25859
diff changeset
   623
                // its endDayOfWeek and endTime
04bfc550f2b4 8049343: (tz) Support tzdata2014g
aefimov
parents: 25859
diff changeset
   624
                // Below is the workarounds, it probably slows down everyone a little
17464
268d3ce75045 8013386: (tz) Support tzdata2013c
sherman
parents: 16852
diff changeset
   625
                if (params[2] == 6 && params[3] == 0 &&
268d3ce75045 8013386: (tz) Support tzdata2013c
sherman
parents: 16852
diff changeset
   626
                    (zoneId.equals("Asia/Amman") ||
268d3ce75045 8013386: (tz) Support tzdata2013c
sherman
parents: 16852
diff changeset
   627
                     zoneId.equals("Asia/Gaza") ||
268d3ce75045 8013386: (tz) Support tzdata2013c
sherman
parents: 16852
diff changeset
   628
                     zoneId.equals("Asia/Hebron"))) {
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   629
                    params[2] = 5;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   630
                    params[3] = 86400000;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   631
                }
29722
7833837e1481 8075667: (tz) Support tzdata2015b
aefimov
parents: 26452
diff changeset
   632
                // Additional check for startDayOfWeek=6 and starTime=86400000
7833837e1481 8075667: (tz) Support tzdata2015b
aefimov
parents: 26452
diff changeset
   633
                // is needed for Asia/Amman; Asia/Gasa and Asia/Hebron
7833837e1481 8075667: (tz) Support tzdata2015b
aefimov
parents: 26452
diff changeset
   634
                if (params[2] == 7 && params[3] == 0 &&
7833837e1481 8075667: (tz) Support tzdata2015b
aefimov
parents: 26452
diff changeset
   635
                     (zoneId.equals("Asia/Amman") ||
7833837e1481 8075667: (tz) Support tzdata2015b
aefimov
parents: 26452
diff changeset
   636
                      zoneId.equals("Asia/Gaza") ||
7833837e1481 8075667: (tz) Support tzdata2015b
aefimov
parents: 26452
diff changeset
   637
                      zoneId.equals("Asia/Hebron"))) {
7833837e1481 8075667: (tz) Support tzdata2015b
aefimov
parents: 26452
diff changeset
   638
                    params[2] = 6;        // Friday
7833837e1481 8075667: (tz) Support tzdata2015b
aefimov
parents: 26452
diff changeset
   639
                    params[3] = 86400000; // 24h
7833837e1481 8075667: (tz) Support tzdata2015b
aefimov
parents: 26452
diff changeset
   640
                }
26452
04bfc550f2b4 8049343: (tz) Support tzdata2014g
aefimov
parents: 25859
diff changeset
   641
                //endDayOfWeek and endTime workaround
04bfc550f2b4 8049343: (tz) Support tzdata2014g
aefimov
parents: 25859
diff changeset
   642
                if (params[7] == 6 && params[8] == 0 &&
04bfc550f2b4 8049343: (tz) Support tzdata2014g
aefimov
parents: 25859
diff changeset
   643
                    (zoneId.equals("Africa/Cairo"))) {
04bfc550f2b4 8049343: (tz) Support tzdata2014g
aefimov
parents: 25859
diff changeset
   644
                    params[7] = 5;
04bfc550f2b4 8049343: (tz) Support tzdata2014g
aefimov
parents: 25859
diff changeset
   645
                    params[8] = 86400000;
04bfc550f2b4 8049343: (tz) Support tzdata2014g
aefimov
parents: 25859
diff changeset
   646
                }
04bfc550f2b4 8049343: (tz) Support tzdata2014g
aefimov
parents: 25859
diff changeset
   647
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   648
            } else if (nTrans > 0) {  // only do this if there is something in table already
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   649
                if (lastyear < LASTYEAR) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   650
                    // ZoneInfo has an ending entry for 2037
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   651
                    //long trans = OffsetDateTime.of(LASTYEAR, 1, 1, 0, 0, 0, 0,
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   652
                    //                               ZoneOffset.ofTotalSeconds(rawOffset/1000))
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   653
                    //                           .toEpochSecond();
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   654
                    long trans = LDT2037 - rawOffset/1000;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   655
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   656
                    int offsetIndex = indexOf(offsets, 0, nOffsets, rawOffset/1000);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   657
                    if (offsetIndex == nOffsets)
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   658
                        nOffsets++;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   659
                    transitions[nTrans++] = (trans * 1000) << TRANSITION_NSHIFT |
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   660
                                       (offsetIndex & OFFSET_MASK);
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   661
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   662
                } else if (savingsInstantTransitions.length > 2) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   663
                    // Workaround: create the params based on the last pair for
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   664
                    // zones like Israel and Iran which have trans defined
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   665
                    // up until 2037, but no "transition rule" defined
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   666
                    //
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   667
                    // Note: Known mismatching for Israel, Asia/Jerusalem/Tel Aviv
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   668
                    // ZoneInfo:        startMode=3
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   669
                    //                  startMonth=2
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   670
                    //                  startDay=26
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   671
                    //                  startDayOfWeek=6
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   672
                    //
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   673
                    // This:            startMode=1
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   674
                    //                  startMonth=2
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   675
                    //                  startDay=27
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   676
                    //                  startDayOfWeek=0
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   677
                    // these two are actually the same for 2037, the SimpleTimeZone
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   678
                    // for the last "known" year
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   679
                    int m = savingsInstantTransitions.length;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   680
                    long startTrans = savingsInstantTransitions[m - 2];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   681
                    int startOffset = wallOffsets[m - 2 + 1];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   682
                    int startStd = getStandardOffset(standardTransitions, standardOffsets, startTrans);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   683
                    long endTrans =  savingsInstantTransitions[m - 1];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   684
                    int endOffset = wallOffsets[m - 1 + 1];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   685
                    int endStd = getStandardOffset(standardTransitions, standardOffsets, endTrans);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   686
                    if (startOffset > startStd && endOffset == endStd) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   687
                        // last - 1 trans
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   688
                        m = savingsInstantTransitions.length - 2;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   689
                        ZoneOffset before = ZoneOffset.ofTotalSeconds(wallOffsets[m]);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   690
                        ZoneOffset after = ZoneOffset.ofTotalSeconds(wallOffsets[m + 1]);
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   691
                        LocalDateTime ldt = LocalDateTime.ofEpochSecond(savingsInstantTransitions[m], 0, before);
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   692
                        LocalDateTime startLDT;
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   693
                        if (after.getTotalSeconds() > before.getTotalSeconds()) {  // isGap()
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   694
                            startLDT = ldt;
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   695
                        } else {
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   696
                            startLDT = ldt.plusSeconds(wallOffsets[m + 1] - wallOffsets[m]);
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   697
                        }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   698
                        // last trans
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   699
                        m = savingsInstantTransitions.length - 1;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   700
                        before = ZoneOffset.ofTotalSeconds(wallOffsets[m]);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   701
                        after = ZoneOffset.ofTotalSeconds(wallOffsets[m + 1]);
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   702
                        ldt = LocalDateTime.ofEpochSecond(savingsInstantTransitions[m], 0, before);
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   703
                        LocalDateTime endLDT;
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   704
                        if (after.getTotalSeconds() > before.getTotalSeconds()) {  // isGap()
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   705
                            endLDT = ldt.plusSeconds(wallOffsets[m + 1] - wallOffsets[m]);
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   706
                        } else {
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   707
                            endLDT = ldt;
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   708
                        }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   709
                        params = new int[10];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   710
                        params[0] = startLDT.getMonthValue() - 1;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   711
                        params[1] = startLDT.getDayOfMonth();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   712
                        params[2] = 0;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   713
                        params[3] = startLDT.toLocalTime().toSecondOfDay() * 1000;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   714
                        params[4] = SimpleTimeZone.WALL_TIME;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   715
                        params[5] = endLDT.getMonthValue() - 1;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   716
                        params[6] = endLDT.getDayOfMonth();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   717
                        params[7] = 0;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   718
                        params[8] = endLDT.toLocalTime().toSecondOfDay() * 1000;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   719
                        params[9] = SimpleTimeZone.WALL_TIME;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   720
                        dstSavings = (startOffset - startStd) * 1000;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   721
                    }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   722
                }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   723
            }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   724
            if (transitions != null && transitions.length != nTrans) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   725
                if (nTrans == 0) {
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   726
                    transitions = null;
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   727
                } else {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   728
                    transitions = Arrays.copyOf(transitions, nTrans);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   729
                }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   730
            }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   731
            if (offsets != null && offsets.length != nOffsets) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   732
                if (nOffsets == 0) {
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   733
                    offsets = null;
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   734
                } else {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   735
                    offsets = Arrays.copyOf(offsets, nOffsets);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   736
                }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   737
            }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   738
            if (transitions != null) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   739
                Checksum sum = new Checksum();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   740
                for (i = 0; i < transitions.length; i++) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   741
                    long val = transitions[i];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   742
                    int dst = (int)((val >>> DST_NSHIFT) & 0xfL);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   743
                    int saving = (dst == 0) ? 0 : offsets[dst];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   744
                    int index = (int)(val & OFFSET_MASK);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   745
                    int offset = offsets[index];
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   746
                    long second = (val >> TRANSITION_NSHIFT);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   747
                    // javazic uses "index of the offset in offsets",
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   748
                    // instead of the real offset value itself to
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   749
                    // calculate the checksum. Have to keep doing
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   750
                    // the same thing, checksum is part of the
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   751
                    // ZoneInfo serialization form.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   752
                    sum.update(second + index);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   753
                    sum.update(index);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   754
                    sum.update(dst == 0 ? -1 : dst);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   755
                }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   756
                checksum = (int)sum.getValue();
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   757
            }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   758
        }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   759
        return new ZoneInfo(zoneId, rawOffset, dstSavings, checksum, transitions,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   760
                            offsets, params, willGMTOffsetChange);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   761
    }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   762
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   763
    private static int getStandardOffset(long[] standardTransitions,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   764
                                         int[] standardOffsets,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   765
                                         long epochSec) {
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   766
        // The size of stdOffsets is [0..9], with most are
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   767
        // [1..4] entries , simple loop search is faster
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   768
        //
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   769
        // int index  = Arrays.binarySearch(standardTransitions, epochSec);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   770
        // if (index < 0) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   771
        //    // switch negative insert position to start of matched range
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   772
        //    index = -index - 2;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   773
        // }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   774
        // return standardOffsets[index + 1];
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   775
        int index = 0;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   776
        for (; index < standardTransitions.length; index++) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   777
            if (epochSec < standardTransitions[index]) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   778
                break;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   779
            }
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   780
        }
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   781
        return standardOffsets[index];
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   782
    }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   783
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   784
    static final int SECONDS_PER_DAY = 86400;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   785
    static final int DAYS_PER_CYCLE = 146097;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   786
    static final long DAYS_0000_TO_1970 = (DAYS_PER_CYCLE * 5L) - (30L * 365L + 7L);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   787
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   788
    private static int getYear(long epochSecond, int offset) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   789
        long second = epochSecond + offset;  // overflow caught later
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   790
        long epochDay = Math.floorDiv(second, SECONDS_PER_DAY);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   791
        long zeroDay = epochDay + DAYS_0000_TO_1970;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   792
        // find the march-based year
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   793
        zeroDay -= 60;  // adjust to 0000-03-01 so leap day is at end of four year cycle
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   794
        long adjust = 0;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   795
        if (zeroDay < 0) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   796
            // adjust negative years to positive for calculation
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   797
            long adjustCycles = (zeroDay + 1) / DAYS_PER_CYCLE - 1;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   798
            adjust = adjustCycles * 400;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   799
            zeroDay += -adjustCycles * DAYS_PER_CYCLE;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   800
        }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   801
        long yearEst = (400 * zeroDay + 591) / DAYS_PER_CYCLE;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   802
        long doyEst = zeroDay - (365 * yearEst + yearEst / 4 - yearEst / 100 + yearEst / 400);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   803
        if (doyEst < 0) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   804
            // fix estimate
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   805
            yearEst--;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   806
            doyEst = zeroDay - (365 * yearEst + yearEst / 4 - yearEst / 100 + yearEst / 400);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   807
        }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   808
        yearEst += adjust;  // reset any negative year
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   809
        int marchDoy0 = (int) doyEst;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   810
        // convert march-based values back to january-based
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   811
        int marchMonth0 = (marchDoy0 * 5 + 2) / 153;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   812
        int month = (marchMonth0 + 2) % 12 + 1;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   813
        int dom = marchDoy0 - (marchMonth0 * 306 + 5) / 10 + 1;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   814
        yearEst += marchMonth0 / 10;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   815
        return (int)yearEst;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   816
    }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   817
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   818
    private static final int toCalendarDOW[] = new int[] {
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   819
        -1,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   820
        Calendar.MONDAY,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   821
        Calendar.TUESDAY,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   822
        Calendar.WEDNESDAY,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   823
        Calendar.THURSDAY,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   824
        Calendar.FRIDAY,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   825
        Calendar.SATURDAY,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   826
        Calendar.SUNDAY
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   827
    };
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   828
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   829
    private static final int toSTZTime[] = new int[] {
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   830
        SimpleTimeZone.UTC_TIME,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   831
        SimpleTimeZone.WALL_TIME,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   832
        SimpleTimeZone.STANDARD_TIME,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   833
    };
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   834
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   835
    private static final long OFFSET_MASK = 0x0fL;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   836
    private static final long DST_MASK = 0xf0L;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   837
    private static final int  DST_NSHIFT = 4;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   838
    private static final int  TRANSITION_NSHIFT = 12;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   839
    private static final int  LASTYEAR = 2037;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   840
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   841
    // from: 0 for offset lookup, 1 for dstsvings lookup
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   842
    private static int indexOf(int[] offsets, int from, int nOffsets, int offset) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   843
        offset *= 1000;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   844
        for (; from < nOffsets; from++) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   845
            if (offsets[from] == offset)
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   846
                return from;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   847
        }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   848
        offsets[from] = offset;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   849
        return from;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   850
    }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   851
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   852
    // return updated nOffsets
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   853
    private static int addTrans(long transitions[], int nTrans,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   854
                                int offsets[], int nOffsets,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   855
                                long trans, int offset, int stdOffset) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   856
        int offsetIndex = indexOf(offsets, 0, nOffsets, offset);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   857
        if (offsetIndex == nOffsets)
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   858
            nOffsets++;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   859
        int dstIndex = 0;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   860
        if (offset != stdOffset) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   861
            dstIndex = indexOf(offsets, 1, nOffsets, offset - stdOffset);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   862
            if (dstIndex == nOffsets)
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   863
                nOffsets++;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   864
        }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   865
        transitions[nTrans] = ((trans * 1000) << TRANSITION_NSHIFT) |
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   866
                              ((dstIndex << DST_NSHIFT) & DST_MASK) |
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   867
                              (offsetIndex & OFFSET_MASK);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   868
        return nOffsets;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   869
    }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   870
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   871
    // ZoneInfo checksum, copy/pasted from javazic
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   872
    private static class Checksum extends CRC32 {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   873
        public void update(int val) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   874
            byte[] b = new byte[4];
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   875
            b[0] = (byte)(val >>> 24);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   876
            b[1] = (byte)(val >>> 16);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   877
            b[2] = (byte)(val >>> 8);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   878
            b[3] = (byte)(val);
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   879
            update(b);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   880
        }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   881
        void update(long val) {
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   882
            byte[] b = new byte[8];
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   883
            b[0] = (byte)(val >>> 56);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   884
            b[1] = (byte)(val >>> 48);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   885
            b[2] = (byte)(val >>> 40);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   886
            b[3] = (byte)(val >>> 32);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   887
            b[4] = (byte)(val >>> 24);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   888
            b[5] = (byte)(val >>> 16);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   889
            b[6] = (byte)(val >>> 8);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   890
            b[7] = (byte)(val);
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   891
            update(b);
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   892
        }
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 11986
diff changeset
   893
    }
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   894
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   895
    // A simple/raw version of j.t.ZoneOffsetTransitionRule
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   896
    private static class ZoneOffsetTransitionRule {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   897
        private final int month;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   898
        private final byte dom;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   899
        private final int dow;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   900
        private final int secondOfDay;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   901
        private final boolean timeEndOfDay;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   902
        private final int timeDefinition;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   903
        private final int standardOffset;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   904
        private final int offsetBefore;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   905
        private final int offsetAfter;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   906
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   907
        ZoneOffsetTransitionRule(DataInput in) throws IOException {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   908
            int data = in.readInt();
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   909
            int dowByte = (data & (7 << 19)) >>> 19;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   910
            int timeByte = (data & (31 << 14)) >>> 14;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   911
            int stdByte = (data & (255 << 4)) >>> 4;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   912
            int beforeByte = (data & (3 << 2)) >>> 2;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   913
            int afterByte = (data & 3);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   914
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   915
            this.month = data >>> 28;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   916
            this.dom = (byte)(((data & (63 << 22)) >>> 22) - 32);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   917
            this.dow = dowByte == 0 ? -1 : dowByte;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   918
            this.secondOfDay = timeByte == 31 ? in.readInt() : timeByte * 3600;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   919
            this.timeEndOfDay = timeByte == 24;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   920
            this.timeDefinition = (data & (3 << 12)) >>> 12;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   921
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   922
            this.standardOffset = stdByte == 255 ? in.readInt() : (stdByte - 128) * 900;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   923
            this.offsetBefore = beforeByte == 3 ? in.readInt() : standardOffset + beforeByte * 1800;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   924
            this.offsetAfter = afterByte == 3 ? in.readInt() : standardOffset + afterByte * 1800;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   925
        }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   926
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   927
        long getTransitionEpochSecond(int year) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   928
            long epochDay = 0;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   929
            if (dom < 0) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   930
                epochDay = toEpochDay(year, month, lengthOfMonth(year, month) + 1 + dom);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   931
                if (dow != -1) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   932
                    epochDay = previousOrSame(epochDay, dow);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   933
                }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   934
            } else {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   935
                epochDay = toEpochDay(year, month, dom);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   936
                if (dow != -1) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   937
                    epochDay = nextOrSame(epochDay, dow);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   938
                }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   939
            }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   940
            if (timeEndOfDay) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   941
                epochDay += 1;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   942
            }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   943
            int difference = 0;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   944
            switch (timeDefinition) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   945
                case 0:    // UTC
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   946
                    difference = 0;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   947
                    break;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   948
                case 1:    // WALL
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   949
                    difference = -offsetBefore;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   950
                    break;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   951
                case 2:    //STANDARD
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   952
                    difference = -standardOffset;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   953
                    break;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   954
            }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   955
            return epochDay * 86400 + secondOfDay + difference;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   956
        }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   957
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   958
        static final boolean isLeapYear(int year) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   959
            return ((year & 3) == 0) && ((year % 100) != 0 || (year % 400) == 0);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   960
        }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   961
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   962
        static final int lengthOfMonth(int year, int month) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   963
            switch (month) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   964
                case 2:        //FEBRUARY:
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   965
                    return isLeapYear(year)? 29 : 28;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   966
                case 4:        //APRIL:
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   967
                case 6:        //JUNE:
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   968
                case 9:        //SEPTEMBER:
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   969
                case 11:       //NOVEMBER:
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   970
                    return 30;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   971
                default:
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   972
                    return 31;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   973
            }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   974
        }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   975
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   976
        static final long toEpochDay(int year, int month, int day) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   977
            long y = year;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   978
            long m = month;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   979
            long total = 0;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   980
            total += 365 * y;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   981
            if (y >= 0) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   982
                total += (y + 3) / 4 - (y + 99) / 100 + (y + 399) / 400;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   983
            } else {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   984
                total -= y / -4 - y / -100 + y / -400;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   985
            }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   986
            total += ((367 * m - 362) / 12);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   987
            total += day - 1;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   988
            if (m > 2) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   989
                total--;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   990
                if (!isLeapYear(year)) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   991
                    total--;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   992
                }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   993
            }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   994
            return total - DAYS_0000_TO_1970;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   995
        }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   996
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   997
        static final long previousOrSame(long epochDay, int dayOfWeek) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   998
            return adjust(epochDay, dayOfWeek, 1);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
   999
        }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
  1000
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
  1001
        static final long nextOrSame(long epochDay, int dayOfWeek) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
  1002
           return adjust(epochDay, dayOfWeek, 0);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
  1003
        }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
  1004
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
  1005
        static final long adjust(long epochDay, int dow, int relative) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
  1006
            int calDow = (int)Math.floorMod(epochDay + 3, 7L) + 1;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
  1007
            if (relative < 2 && calDow == dow) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
  1008
                return epochDay;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
  1009
            }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
  1010
            if ((relative & 1) == 0) {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
  1011
                int daysDiff = calDow - dow;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
  1012
                return epochDay + (daysDiff >= 0 ? 7 - daysDiff : -daysDiff);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
  1013
            } else {
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
  1014
                int daysDiff = dow - calDow;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
  1015
                return epochDay - (daysDiff >= 0 ? 7 - daysDiff : -daysDiff);
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
  1016
            }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
  1017
        }
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15665
diff changeset
  1018
    }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1019
}