jdk/src/share/classes/java/time/ZoneOffset.java
author rriggs
Fri, 20 Dec 2013 13:06:23 -0500
changeset 22081 86eb26ff8f2b
parent 20873 e91d5b1cb8e6
child 22108 99859c0e9a33
permissions -rw-r--r--
8030002: Enhance deserialization using readObject Reviewed-by: sherman, chegar, scolebourne
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
     1
/*
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
     2
 * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
     4
 *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    10
 *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    15
 * accompanied this code).
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    16
 *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    20
 *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    23
 * questions.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    24
 */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    25
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    26
/*
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    27
 * This file is available under and governed by the GNU General Public
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    28
 * License version 2 only, as published by the Free Software Foundation.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    29
 * However, the following notice accompanied the original version of this
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    30
 * file:
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    31
 *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    32
 * Copyright (c) 2007-2012, Stephen Colebourne & Michael Nascimento Santos
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    33
 *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    34
 * All rights reserved.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    35
 *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    36
 * Redistribution and use in source and binary forms, with or without
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    37
 * modification, are permitted provided that the following conditions are met:
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    38
 *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    39
 *  * Redistributions of source code must retain the above copyright notice,
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    40
 *    this list of conditions and the following disclaimer.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    41
 *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    42
 *  * Redistributions in binary form must reproduce the above copyright notice,
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    43
 *    this list of conditions and the following disclaimer in the documentation
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    44
 *    and/or other materials provided with the distribution.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    45
 *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    46
 *  * Neither the name of JSR-310 nor the names of its contributors
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    47
 *    may be used to endorse or promote products derived from this software
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    48
 *    without specific prior written permission.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    49
 *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    50
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    51
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    52
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    53
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    54
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    55
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    56
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    57
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    58
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    59
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    60
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    61
 */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    62
package java.time;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    63
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
    64
import static java.time.LocalTime.MINUTES_PER_HOUR;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
    65
import static java.time.LocalTime.SECONDS_PER_HOUR;
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
    66
import static java.time.LocalTime.SECONDS_PER_MINUTE;
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    67
import static java.time.temporal.ChronoField.OFFSET_SECONDS;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    68
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    69
import java.io.DataInput;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    70
import java.io.DataOutput;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    71
import java.io.IOException;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    72
import java.io.InvalidObjectException;
22081
86eb26ff8f2b 8030002: Enhance deserialization using readObject
rriggs
parents: 20873
diff changeset
    73
import java.io.ObjectInputStream;
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    74
import java.io.Serializable;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    75
import java.time.temporal.ChronoField;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    76
import java.time.temporal.Temporal;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    77
import java.time.temporal.TemporalAccessor;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    78
import java.time.temporal.TemporalAdjuster;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    79
import java.time.temporal.TemporalField;
20795
8ec9e5b79828 8025722: TemporalAdjusters and TemporalQueries
rriggs
parents: 20747
diff changeset
    80
import java.time.temporal.TemporalQueries;
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    81
import java.time.temporal.TemporalQuery;
19030
32f129cb6351 8016025: JSR 310 DateTime API Updates IV
sherman
parents: 17474
diff changeset
    82
import java.time.temporal.UnsupportedTemporalTypeException;
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    83
import java.time.temporal.ValueRange;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    84
import java.time.zone.ZoneRules;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    85
import java.util.Objects;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    86
import java.util.concurrent.ConcurrentHashMap;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    87
import java.util.concurrent.ConcurrentMap;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    88
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    89
/**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    90
 * A time-zone offset from Greenwich/UTC, such as {@code +02:00}.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    91
 * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    92
 * A time-zone offset is the period of time that a time-zone differs from Greenwich/UTC.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    93
 * This is usually a fixed number of hours and minutes.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    94
 * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    95
 * Different parts of the world have different time-zone offsets.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    96
 * The rules for how offsets vary by place and time of year are captured in the
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    97
 * {@link ZoneId} class.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    98
 * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    99
 * For example, Paris is one hour ahead of Greenwich/UTC in winter and two hours
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   100
 * ahead in summer. The {@code ZoneId} instance for Paris will reference two
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   101
 * {@code ZoneOffset} instances - a {@code +01:00} instance for winter,
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   102
 * and a {@code +02:00} instance for summer.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   103
 * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   104
 * In 2008, time-zone offsets around the world extended from -12:00 to +14:00.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   105
 * To prevent any problems with that range being extended, yet still provide
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   106
 * validation, the range of offsets is restricted to -18:00 to 18:00 inclusive.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   107
 * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   108
 * This class is designed for use with the ISO calendar system.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   109
 * The fields of hours, minutes and seconds make assumptions that are valid for the
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   110
 * standard ISO definitions of those fields. This class may be used with other
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   111
 * calendar systems providing the definition of the time fields matches those
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   112
 * of the ISO calendar system.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   113
 * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   114
 * Instances of {@code ZoneOffset} must be compared using {@link #equals}.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   115
 * Implementations may choose to cache certain common offsets, however
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   116
 * applications must not rely on such caching.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   117
 *
17474
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   118
 * @implSpec
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   119
 * This class is immutable and thread-safe.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   120
 *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   121
 * @since 1.8
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   122
 */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   123
public final class ZoneOffset
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   124
        extends ZoneId
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   125
        implements TemporalAccessor, TemporalAdjuster, Comparable<ZoneOffset>, Serializable {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   126
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   127
    /** Cache of time-zone offset by offset in seconds. */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   128
    private static final ConcurrentMap<Integer, ZoneOffset> SECONDS_CACHE = new ConcurrentHashMap<>(16, 0.75f, 4);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   129
    /** Cache of time-zone offset by ID. */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   130
    private static final ConcurrentMap<String, ZoneOffset> ID_CACHE = new ConcurrentHashMap<>(16, 0.75f, 4);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   131
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   132
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   133
     * The abs maximum seconds.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   134
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   135
    private static final int MAX_SECONDS = 18 * SECONDS_PER_HOUR;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   136
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   137
     * Serialization version.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   138
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   139
    private static final long serialVersionUID = 2357656521762053153L;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   140
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   141
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   142
     * The time-zone offset for UTC, with an ID of 'Z'.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   143
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   144
    public static final ZoneOffset UTC = ZoneOffset.ofTotalSeconds(0);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   145
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   146
     * Constant for the maximum supported offset.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   147
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   148
    public static final ZoneOffset MIN = ZoneOffset.ofTotalSeconds(-MAX_SECONDS);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   149
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   150
     * Constant for the maximum supported offset.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   151
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   152
    public static final ZoneOffset MAX = ZoneOffset.ofTotalSeconds(MAX_SECONDS);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   153
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   154
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   155
     * The total offset in seconds.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   156
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   157
    private final int totalSeconds;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   158
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   159
     * The string form of the time-zone offset.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   160
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   161
    private final transient String id;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   162
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   163
    //-----------------------------------------------------------------------
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   164
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   165
     * Obtains an instance of {@code ZoneOffset} using the ID.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   166
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   167
     * This method parses the string ID of a {@code ZoneOffset} to
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   168
     * return an instance. The parsing accepts all the formats generated by
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   169
     * {@link #getId()}, plus some additional formats:
20873
e91d5b1cb8e6 8026516: javadoc errors in java.time
rriggs
parents: 20795
diff changeset
   170
     * <ul>
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   171
     * <li>{@code Z} - for UTC
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   172
     * <li>{@code +h}
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   173
     * <li>{@code +hh}
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   174
     * <li>{@code +hh:mm}
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   175
     * <li>{@code -hh:mm}
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   176
     * <li>{@code +hhmm}
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   177
     * <li>{@code -hhmm}
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   178
     * <li>{@code +hh:mm:ss}
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   179
     * <li>{@code -hh:mm:ss}
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   180
     * <li>{@code +hhmmss}
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   181
     * <li>{@code -hhmmss}
20873
e91d5b1cb8e6 8026516: javadoc errors in java.time
rriggs
parents: 20795
diff changeset
   182
     * </ul>
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   183
     * Note that &plusmn; means either the plus or minus symbol.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   184
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   185
     * The ID of the returned offset will be normalized to one of the formats
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   186
     * described by {@link #getId()}.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   187
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   188
     * The maximum supported range is from +18:00 to -18:00 inclusive.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   189
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   190
     * @param offsetId  the offset ID, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   191
     * @return the zone-offset, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   192
     * @throws DateTimeException if the offset ID is invalid
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   193
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   194
    @SuppressWarnings("fallthrough")
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   195
    public static ZoneOffset of(String offsetId) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   196
        Objects.requireNonNull(offsetId, "offsetId");
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   197
        // "Z" is always in the cache
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   198
        ZoneOffset offset = ID_CACHE.get(offsetId);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   199
        if (offset != null) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   200
            return offset;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   201
        }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   202
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   203
        // parse - +h, +hh, +hhmm, +hh:mm, +hhmmss, +hh:mm:ss
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   204
        final int hours, minutes, seconds;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   205
        switch (offsetId.length()) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   206
            case 2:
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   207
                offsetId = offsetId.charAt(0) + "0" + offsetId.charAt(1);  // fallthru
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   208
            case 3:
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   209
                hours = parseNumber(offsetId, 1, false);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   210
                minutes = 0;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   211
                seconds = 0;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   212
                break;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   213
            case 5:
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   214
                hours = parseNumber(offsetId, 1, false);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   215
                minutes = parseNumber(offsetId, 3, false);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   216
                seconds = 0;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   217
                break;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   218
            case 6:
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   219
                hours = parseNumber(offsetId, 1, false);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   220
                minutes = parseNumber(offsetId, 4, true);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   221
                seconds = 0;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   222
                break;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   223
            case 7:
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   224
                hours = parseNumber(offsetId, 1, false);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   225
                minutes = parseNumber(offsetId, 3, false);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   226
                seconds = parseNumber(offsetId, 5, false);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   227
                break;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   228
            case 9:
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   229
                hours = parseNumber(offsetId, 1, false);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   230
                minutes = parseNumber(offsetId, 4, true);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   231
                seconds = parseNumber(offsetId, 7, true);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   232
                break;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   233
            default:
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   234
                throw new DateTimeException("Invalid ID for ZoneOffset, invalid format: " + offsetId);
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   235
        }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   236
        char first = offsetId.charAt(0);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   237
        if (first != '+' && first != '-') {
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   238
            throw new DateTimeException("Invalid ID for ZoneOffset, plus/minus not found when expected: " + offsetId);
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   239
        }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   240
        if (first == '-') {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   241
            return ofHoursMinutesSeconds(-hours, -minutes, -seconds);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   242
        } else {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   243
            return ofHoursMinutesSeconds(hours, minutes, seconds);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   244
        }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   245
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   246
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   247
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   248
     * Parse a two digit zero-prefixed number.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   249
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   250
     * @param offsetId  the offset ID, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   251
     * @param pos  the position to parse, valid
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   252
     * @param precededByColon  should this number be prefixed by a precededByColon
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   253
     * @return the parsed number, from 0 to 99
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   254
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   255
    private static int parseNumber(CharSequence offsetId, int pos, boolean precededByColon) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   256
        if (precededByColon && offsetId.charAt(pos - 1) != ':') {
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   257
            throw new DateTimeException("Invalid ID for ZoneOffset, colon not found when expected: " + offsetId);
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   258
        }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   259
        char ch1 = offsetId.charAt(pos);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   260
        char ch2 = offsetId.charAt(pos + 1);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   261
        if (ch1 < '0' || ch1 > '9' || ch2 < '0' || ch2 > '9') {
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   262
            throw new DateTimeException("Invalid ID for ZoneOffset, non numeric characters found: " + offsetId);
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   263
        }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   264
        return (ch1 - 48) * 10 + (ch2 - 48);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   265
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   266
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   267
    //-----------------------------------------------------------------------
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   268
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   269
     * Obtains an instance of {@code ZoneOffset} using an offset in hours.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   270
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   271
     * @param hours  the time-zone offset in hours, from -18 to +18
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   272
     * @return the zone-offset, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   273
     * @throws DateTimeException if the offset is not in the required range
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   274
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   275
    public static ZoneOffset ofHours(int hours) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   276
        return ofHoursMinutesSeconds(hours, 0, 0);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   277
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   278
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   279
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   280
     * Obtains an instance of {@code ZoneOffset} using an offset in
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   281
     * hours and minutes.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   282
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   283
     * The sign of the hours and minutes components must match.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   284
     * Thus, if the hours is negative, the minutes must be negative or zero.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   285
     * If the hours is zero, the minutes may be positive, negative or zero.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   286
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   287
     * @param hours  the time-zone offset in hours, from -18 to +18
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   288
     * @param minutes  the time-zone offset in minutes, from 0 to &plusmn;59, sign matches hours
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   289
     * @return the zone-offset, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   290
     * @throws DateTimeException if the offset is not in the required range
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   291
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   292
    public static ZoneOffset ofHoursMinutes(int hours, int minutes) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   293
        return ofHoursMinutesSeconds(hours, minutes, 0);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   294
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   295
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   296
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   297
     * Obtains an instance of {@code ZoneOffset} using an offset in
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   298
     * hours, minutes and seconds.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   299
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   300
     * The sign of the hours, minutes and seconds components must match.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   301
     * Thus, if the hours is negative, the minutes and seconds must be negative or zero.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   302
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   303
     * @param hours  the time-zone offset in hours, from -18 to +18
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   304
     * @param minutes  the time-zone offset in minutes, from 0 to &plusmn;59, sign matches hours and seconds
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   305
     * @param seconds  the time-zone offset in seconds, from 0 to &plusmn;59, sign matches hours and minutes
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   306
     * @return the zone-offset, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   307
     * @throws DateTimeException if the offset is not in the required range
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   308
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   309
    public static ZoneOffset ofHoursMinutesSeconds(int hours, int minutes, int seconds) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   310
        validate(hours, minutes, seconds);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   311
        int totalSeconds = totalSeconds(hours, minutes, seconds);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   312
        return ofTotalSeconds(totalSeconds);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   313
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   314
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   315
    //-----------------------------------------------------------------------
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   316
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   317
     * Obtains an instance of {@code ZoneOffset} from a temporal object.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   318
     * <p>
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   319
     * This obtains an offset based on the specified temporal.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   320
     * A {@code TemporalAccessor} represents an arbitrary set of date and time information,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   321
     * which this factory converts to an instance of {@code ZoneOffset}.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   322
     * <p>
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   323
     * A {@code TemporalAccessor} represents some form of date and time information.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   324
     * This factory converts the arbitrary temporal object to an instance of {@code ZoneOffset}.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   325
     * <p>
20795
8ec9e5b79828 8025722: TemporalAdjusters and TemporalQueries
rriggs
parents: 20747
diff changeset
   326
     * The conversion uses the {@link TemporalQueries#offset()} query, which relies
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   327
     * on extracting the {@link ChronoField#OFFSET_SECONDS OFFSET_SECONDS} field.
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   328
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   329
     * This method matches the signature of the functional interface {@link TemporalQuery}
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   330
     * allowing it to be used in queries via method reference, {@code ZoneOffset::from}.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   331
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   332
     * @param temporal  the temporal object to convert, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   333
     * @return the zone-offset, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   334
     * @throws DateTimeException if unable to convert to an {@code ZoneOffset}
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   335
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   336
    public static ZoneOffset from(TemporalAccessor temporal) {
20520
0952771e3e25 8024835: Change until() to accept any compatible temporal
rriggs
parents: 19841
diff changeset
   337
        Objects.requireNonNull(temporal, "temporal");
20795
8ec9e5b79828 8025722: TemporalAdjusters and TemporalQueries
rriggs
parents: 20747
diff changeset
   338
        ZoneOffset offset = temporal.query(TemporalQueries.offset());
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   339
        if (offset == null) {
20747
86a86a94b367 8025718: Enhance error messages for parsing
rriggs
parents: 20520
diff changeset
   340
            throw new DateTimeException("Unable to obtain ZoneOffset from TemporalAccessor: " +
86a86a94b367 8025718: Enhance error messages for parsing
rriggs
parents: 20520
diff changeset
   341
                    temporal + " of type " + temporal.getClass().getName());
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   342
        }
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   343
        return offset;
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   344
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   345
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   346
    //-----------------------------------------------------------------------
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   347
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   348
     * Validates the offset fields.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   349
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   350
     * @param hours  the time-zone offset in hours, from -18 to +18
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   351
     * @param minutes  the time-zone offset in minutes, from 0 to &plusmn;59
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   352
     * @param seconds  the time-zone offset in seconds, from 0 to &plusmn;59
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   353
     * @throws DateTimeException if the offset is not in the required range
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   354
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   355
    private static void validate(int hours, int minutes, int seconds) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   356
        if (hours < -18 || hours > 18) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   357
            throw new DateTimeException("Zone offset hours not in valid range: value " + hours +
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   358
                    " is not in the range -18 to 18");
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   359
        }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   360
        if (hours > 0) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   361
            if (minutes < 0 || seconds < 0) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   362
                throw new DateTimeException("Zone offset minutes and seconds must be positive because hours is positive");
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   363
            }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   364
        } else if (hours < 0) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   365
            if (minutes > 0 || seconds > 0) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   366
                throw new DateTimeException("Zone offset minutes and seconds must be negative because hours is negative");
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   367
            }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   368
        } else if ((minutes > 0 && seconds < 0) || (minutes < 0 && seconds > 0)) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   369
            throw new DateTimeException("Zone offset minutes and seconds must have the same sign");
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   370
        }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   371
        if (Math.abs(minutes) > 59) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   372
            throw new DateTimeException("Zone offset minutes not in valid range: abs(value) " +
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   373
                    Math.abs(minutes) + " is not in the range 0 to 59");
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   374
        }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   375
        if (Math.abs(seconds) > 59) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   376
            throw new DateTimeException("Zone offset seconds not in valid range: abs(value) " +
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   377
                    Math.abs(seconds) + " is not in the range 0 to 59");
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   378
        }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   379
        if (Math.abs(hours) == 18 && (Math.abs(minutes) > 0 || Math.abs(seconds) > 0)) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   380
            throw new DateTimeException("Zone offset not in valid range: -18:00 to +18:00");
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   381
        }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   382
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   383
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   384
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   385
     * Calculates the total offset in seconds.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   386
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   387
     * @param hours  the time-zone offset in hours, from -18 to +18
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   388
     * @param minutes  the time-zone offset in minutes, from 0 to &plusmn;59, sign matches hours and seconds
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   389
     * @param seconds  the time-zone offset in seconds, from 0 to &plusmn;59, sign matches hours and minutes
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   390
     * @return the total in seconds
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   391
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   392
    private static int totalSeconds(int hours, int minutes, int seconds) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   393
        return hours * SECONDS_PER_HOUR + minutes * SECONDS_PER_MINUTE + seconds;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   394
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   395
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   396
    //-----------------------------------------------------------------------
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   397
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   398
     * Obtains an instance of {@code ZoneOffset} specifying the total offset in seconds
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   399
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   400
     * The offset must be in the range {@code -18:00} to {@code +18:00}, which corresponds to -64800 to +64800.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   401
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   402
     * @param totalSeconds  the total time-zone offset in seconds, from -64800 to +64800
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   403
     * @return the ZoneOffset, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   404
     * @throws DateTimeException if the offset is not in the required range
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   405
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   406
    public static ZoneOffset ofTotalSeconds(int totalSeconds) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   407
        if (Math.abs(totalSeconds) > MAX_SECONDS) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   408
            throw new DateTimeException("Zone offset not in valid range: -18:00 to +18:00");
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   409
        }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   410
        if (totalSeconds % (15 * SECONDS_PER_MINUTE) == 0) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   411
            Integer totalSecs = totalSeconds;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   412
            ZoneOffset result = SECONDS_CACHE.get(totalSecs);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   413
            if (result == null) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   414
                result = new ZoneOffset(totalSeconds);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   415
                SECONDS_CACHE.putIfAbsent(totalSecs, result);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   416
                result = SECONDS_CACHE.get(totalSecs);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   417
                ID_CACHE.putIfAbsent(result.getId(), result);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   418
            }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   419
            return result;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   420
        } else {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   421
            return new ZoneOffset(totalSeconds);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   422
        }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   423
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   424
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   425
    //-----------------------------------------------------------------------
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   426
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   427
     * Constructor.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   428
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   429
     * @param totalSeconds  the total time-zone offset in seconds, from -64800 to +64800
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   430
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   431
    private ZoneOffset(int totalSeconds) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   432
        super();
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   433
        this.totalSeconds = totalSeconds;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   434
        id = buildId(totalSeconds);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   435
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   436
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   437
    private static String buildId(int totalSeconds) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   438
        if (totalSeconds == 0) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   439
            return "Z";
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   440
        } else {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   441
            int absTotalSeconds = Math.abs(totalSeconds);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   442
            StringBuilder buf = new StringBuilder();
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   443
            int absHours = absTotalSeconds / SECONDS_PER_HOUR;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   444
            int absMinutes = (absTotalSeconds / SECONDS_PER_MINUTE) % MINUTES_PER_HOUR;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   445
            buf.append(totalSeconds < 0 ? "-" : "+")
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   446
                .append(absHours < 10 ? "0" : "").append(absHours)
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   447
                .append(absMinutes < 10 ? ":0" : ":").append(absMinutes);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   448
            int absSeconds = absTotalSeconds % SECONDS_PER_MINUTE;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   449
            if (absSeconds != 0) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   450
                buf.append(absSeconds < 10 ? ":0" : ":").append(absSeconds);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   451
            }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   452
            return buf.toString();
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   453
        }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   454
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   455
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   456
    //-----------------------------------------------------------------------
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   457
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   458
     * Gets the total zone offset in seconds.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   459
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   460
     * This is the primary way to access the offset amount.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   461
     * It returns the total of the hours, minutes and seconds fields as a
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   462
     * single offset that can be added to a time.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   463
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   464
     * @return the total zone offset amount in seconds
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   465
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   466
    public int getTotalSeconds() {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   467
        return totalSeconds;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   468
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   469
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   470
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   471
     * Gets the normalized zone offset ID.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   472
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   473
     * The ID is minor variation to the standard ISO-8601 formatted string
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   474
     * for the offset. There are three formats:
20873
e91d5b1cb8e6 8026516: javadoc errors in java.time
rriggs
parents: 20795
diff changeset
   475
     * <ul>
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   476
     * <li>{@code Z} - for UTC (ISO-8601)
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   477
     * <li>{@code +hh:mm} or {@code -hh:mm} - if the seconds are zero (ISO-8601)
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   478
     * <li>{@code +hh:mm:ss} or {@code -hh:mm:ss} - if the seconds are non-zero (not ISO-8601)
20873
e91d5b1cb8e6 8026516: javadoc errors in java.time
rriggs
parents: 20795
diff changeset
   479
     * </ul>
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   480
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   481
     * @return the zone offset ID, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   482
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   483
    @Override
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   484
    public String getId() {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   485
        return id;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   486
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   487
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   488
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   489
     * Gets the associated time-zone rules.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   490
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   491
     * The rules will always return this offset when queried.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   492
     * The implementation class is immutable, thread-safe and serializable.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   493
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   494
     * @return the rules, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   495
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   496
    @Override
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   497
    public ZoneRules getRules() {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   498
        return ZoneRules.of(this);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   499
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   500
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   501
    //-----------------------------------------------------------------------
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   502
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   503
     * Checks if the specified field is supported.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   504
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   505
     * This checks if this offset can be queried for the specified field.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   506
     * If false, then calling the {@link #range(TemporalField) range} and
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   507
     * {@link #get(TemporalField) get} methods will throw an exception.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   508
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   509
     * If the field is a {@link ChronoField} then the query is implemented here.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   510
     * The {@code OFFSET_SECONDS} field returns true.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   511
     * All other {@code ChronoField} instances will return false.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   512
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   513
     * If the field is not a {@code ChronoField}, then the result of this method
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   514
     * is obtained by invoking {@code TemporalField.isSupportedBy(TemporalAccessor)}
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   515
     * passing {@code this} as the argument.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   516
     * Whether the field is supported is determined by the field.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   517
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   518
     * @param field  the field to check, null returns false
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   519
     * @return true if the field is supported on this offset, false if not
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   520
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   521
    @Override
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   522
    public boolean isSupported(TemporalField field) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   523
        if (field instanceof ChronoField) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   524
            return field == OFFSET_SECONDS;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   525
        }
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   526
        return field != null && field.isSupportedBy(this);
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   527
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   528
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   529
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   530
     * Gets the range of valid values for the specified field.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   531
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   532
     * The range object expresses the minimum and maximum valid values for a field.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   533
     * This offset is used to enhance the accuracy of the returned range.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   534
     * If it is not possible to return the range, because the field is not supported
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   535
     * or for some other reason, an exception is thrown.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   536
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   537
     * If the field is a {@link ChronoField} then the query is implemented here.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   538
     * The {@link #isSupported(TemporalField) supported fields} will return
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   539
     * appropriate range instances.
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   540
     * All other {@code ChronoField} instances will throw an {@code UnsupportedTemporalTypeException}.
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   541
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   542
     * If the field is not a {@code ChronoField}, then the result of this method
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   543
     * is obtained by invoking {@code TemporalField.rangeRefinedBy(TemporalAccessor)}
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   544
     * passing {@code this} as the argument.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   545
     * Whether the range can be obtained is determined by the field.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   546
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   547
     * @param field  the field to query the range for, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   548
     * @return the range of valid values for the field, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   549
     * @throws DateTimeException if the range for the field cannot be obtained
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   550
     * @throws UnsupportedTemporalTypeException if the field is not supported
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   551
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   552
    @Override  // override for Javadoc
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   553
    public ValueRange range(TemporalField field) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   554
        return TemporalAccessor.super.range(field);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   555
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   556
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   557
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   558
     * Gets the value of the specified field from this offset as an {@code int}.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   559
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   560
     * This queries this offset for the value for the specified field.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   561
     * The returned value will always be within the valid range of values for the field.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   562
     * If it is not possible to return the value, because the field is not supported
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   563
     * or for some other reason, an exception is thrown.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   564
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   565
     * If the field is a {@link ChronoField} then the query is implemented here.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   566
     * The {@code OFFSET_SECONDS} field returns the value of the offset.
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   567
     * All other {@code ChronoField} instances will throw an {@code UnsupportedTemporalTypeException}.
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   568
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   569
     * If the field is not a {@code ChronoField}, then the result of this method
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   570
     * is obtained by invoking {@code TemporalField.getFrom(TemporalAccessor)}
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   571
     * passing {@code this} as the argument. Whether the value can be obtained,
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   572
     * and what the value represents, is determined by the field.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   573
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   574
     * @param field  the field to get, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   575
     * @return the value for the field
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   576
     * @throws DateTimeException if a value for the field cannot be obtained or
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   577
     *         the value is outside the range of valid values for the field
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   578
     * @throws UnsupportedTemporalTypeException if the field is not supported or
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   579
     *         the range of values exceeds an {@code int}
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   580
     * @throws ArithmeticException if numeric overflow occurs
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   581
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   582
    @Override  // override for Javadoc and performance
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   583
    public int get(TemporalField field) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   584
        if (field == OFFSET_SECONDS) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   585
            return totalSeconds;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   586
        } else if (field instanceof ChronoField) {
19030
32f129cb6351 8016025: JSR 310 DateTime API Updates IV
sherman
parents: 17474
diff changeset
   587
            throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   588
        }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   589
        return range(field).checkValidIntValue(getLong(field), field);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   590
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   591
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   592
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   593
     * Gets the value of the specified field from this offset as a {@code long}.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   594
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   595
     * This queries this offset for the value for the specified field.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   596
     * If it is not possible to return the value, because the field is not supported
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   597
     * or for some other reason, an exception is thrown.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   598
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   599
     * If the field is a {@link ChronoField} then the query is implemented here.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   600
     * The {@code OFFSET_SECONDS} field returns the value of the offset.
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   601
     * All other {@code ChronoField} instances will throw an {@code UnsupportedTemporalTypeException}.
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   602
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   603
     * If the field is not a {@code ChronoField}, then the result of this method
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   604
     * is obtained by invoking {@code TemporalField.getFrom(TemporalAccessor)}
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   605
     * passing {@code this} as the argument. Whether the value can be obtained,
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   606
     * and what the value represents, is determined by the field.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   607
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   608
     * @param field  the field to get, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   609
     * @return the value for the field
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   610
     * @throws DateTimeException if a value for the field cannot be obtained
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   611
     * @throws UnsupportedTemporalTypeException if the field is not supported
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   612
     * @throws ArithmeticException if numeric overflow occurs
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   613
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   614
    @Override
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   615
    public long getLong(TemporalField field) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   616
        if (field == OFFSET_SECONDS) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   617
            return totalSeconds;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   618
        } else if (field instanceof ChronoField) {
19030
32f129cb6351 8016025: JSR 310 DateTime API Updates IV
sherman
parents: 17474
diff changeset
   619
            throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   620
        }
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   621
        return field.getFrom(this);
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   622
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   623
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   624
    //-----------------------------------------------------------------------
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   625
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   626
     * Queries this offset using the specified query.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   627
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   628
     * This queries this offset using the specified query strategy object.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   629
     * The {@code TemporalQuery} object defines the logic to be used to
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   630
     * obtain the result. Read the documentation of the query to understand
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   631
     * what the result of this method will be.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   632
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   633
     * The result of this method is obtained by invoking the
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   634
     * {@link TemporalQuery#queryFrom(TemporalAccessor)} method on the
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   635
     * specified query passing {@code this} as the argument.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   636
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   637
     * @param <R> the type of the result
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   638
     * @param query  the query to invoke, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   639
     * @return the query result, null may be returned (defined by the query)
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   640
     * @throws DateTimeException if unable to query (defined by the query)
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   641
     * @throws ArithmeticException if numeric overflow occurs (defined by the query)
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   642
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   643
    @SuppressWarnings("unchecked")
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   644
    @Override
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   645
    public <R> R query(TemporalQuery<R> query) {
20795
8ec9e5b79828 8025722: TemporalAdjusters and TemporalQueries
rriggs
parents: 20747
diff changeset
   646
        if (query == TemporalQueries.offset() || query == TemporalQueries.zone()) {
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   647
            return (R) this;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   648
        }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   649
        return TemporalAccessor.super.query(query);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   650
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   651
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   652
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   653
     * Adjusts the specified temporal object to have the same offset as this object.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   654
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   655
     * This returns a temporal object of the same observable type as the input
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   656
     * with the offset changed to be the same as this.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   657
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   658
     * The adjustment is equivalent to using {@link Temporal#with(TemporalField, long)}
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   659
     * passing {@link ChronoField#OFFSET_SECONDS} as the field.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   660
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   661
     * In most cases, it is clearer to reverse the calling pattern by using
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   662
     * {@link Temporal#with(TemporalAdjuster)}:
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   663
     * <pre>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   664
     *   // these two lines are equivalent, but the second approach is recommended
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   665
     *   temporal = thisOffset.adjustInto(temporal);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   666
     *   temporal = temporal.with(thisOffset);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   667
     * </pre>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   668
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   669
     * This instance is immutable and unaffected by this method call.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   670
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   671
     * @param temporal  the target object to be adjusted, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   672
     * @return the adjusted object, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   673
     * @throws DateTimeException if unable to make the adjustment
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   674
     * @throws ArithmeticException if numeric overflow occurs
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   675
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   676
    @Override
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   677
    public Temporal adjustInto(Temporal temporal) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   678
        return temporal.with(OFFSET_SECONDS, totalSeconds);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   679
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   680
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   681
    //-----------------------------------------------------------------------
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   682
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   683
     * Compares this offset to another offset in descending order.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   684
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   685
     * The offsets are compared in the order that they occur for the same time
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   686
     * of day around the world. Thus, an offset of {@code +10:00} comes before an
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   687
     * offset of {@code +09:00} and so on down to {@code -18:00}.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   688
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   689
     * The comparison is "consistent with equals", as defined by {@link Comparable}.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   690
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   691
     * @param other  the other date to compare to, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   692
     * @return the comparator value, negative if less, postive if greater
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   693
     * @throws NullPointerException if {@code other} is null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   694
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   695
    @Override
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   696
    public int compareTo(ZoneOffset other) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   697
        return other.totalSeconds - totalSeconds;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   698
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   699
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   700
    //-----------------------------------------------------------------------
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   701
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   702
     * Checks if this offset is equal to another offset.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   703
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   704
     * The comparison is based on the amount of the offset in seconds.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   705
     * This is equivalent to a comparison by ID.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   706
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   707
     * @param obj  the object to check, null returns false
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   708
     * @return true if this is equal to the other offset
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   709
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   710
    @Override
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   711
    public boolean equals(Object obj) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   712
        if (this == obj) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   713
           return true;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   714
        }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   715
        if (obj instanceof ZoneOffset) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   716
            return totalSeconds == ((ZoneOffset) obj).totalSeconds;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   717
        }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   718
        return false;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   719
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   720
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   721
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   722
     * A hash code for this offset.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   723
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   724
     * @return a suitable hash code
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   725
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   726
    @Override
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   727
    public int hashCode() {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   728
        return totalSeconds;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   729
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   730
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   731
    //-----------------------------------------------------------------------
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   732
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   733
     * Outputs this offset as a {@code String}, using the normalized ID.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   734
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   735
     * @return a string representation of this offset, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   736
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   737
    @Override
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   738
    public String toString() {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   739
        return id;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   740
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   741
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   742
    // -----------------------------------------------------------------------
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   743
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   744
     * Writes the object using a
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   745
     * <a href="../../serialized-form.html#java.time.Ser">dedicated serialized form</a>.
19841
15c8e97d6a14 8024164: JSR310 serialization should be described in details
rriggs
parents: 19030
diff changeset
   746
     * @serialData
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   747
     * <pre>
19841
15c8e97d6a14 8024164: JSR310 serialization should be described in details
rriggs
parents: 19030
diff changeset
   748
     *  out.writeByte(8);                  // identifies a ZoneOffset
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   749
     *  int offsetByte = totalSeconds % 900 == 0 ? totalSeconds / 900 : 127;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   750
     *  out.writeByte(offsetByte);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   751
     *  if (offsetByte == 127) {
19841
15c8e97d6a14 8024164: JSR310 serialization should be described in details
rriggs
parents: 19030
diff changeset
   752
     *      out.writeInt(totalSeconds);
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   753
     *  }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   754
     * </pre>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   755
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   756
     * @return the instance of {@code Ser}, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   757
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   758
    private Object writeReplace() {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   759
        return new Ser(Ser.ZONE_OFFSET_TYPE, this);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   760
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   761
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   762
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   763
     * Defend against malicious streams.
22081
86eb26ff8f2b 8030002: Enhance deserialization using readObject
rriggs
parents: 20873
diff changeset
   764
     *
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   765
     * @throws InvalidObjectException always
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   766
     */
22081
86eb26ff8f2b 8030002: Enhance deserialization using readObject
rriggs
parents: 20873
diff changeset
   767
    private void readObject(ObjectInputStream s) throws InvalidObjectException {
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   768
        throw new InvalidObjectException("Deserialization via serialization delegate");
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   769
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   770
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   771
    @Override
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   772
    void write(DataOutput out) throws IOException {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   773
        out.writeByte(Ser.ZONE_OFFSET_TYPE);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   774
        writeExternal(out);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   775
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   776
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   777
    void writeExternal(DataOutput out) throws IOException {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   778
        final int offsetSecs = totalSeconds;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   779
        int offsetByte = offsetSecs % 900 == 0 ? offsetSecs / 900 : 127;  // compress to -72 to +72
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   780
        out.writeByte(offsetByte);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   781
        if (offsetByte == 127) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   782
            out.writeInt(offsetSecs);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   783
        }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   784
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   785
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   786
    static ZoneOffset readExternal(DataInput in) throws IOException {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   787
        int offsetByte = in.readByte();
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   788
        return (offsetByte == 127 ? ZoneOffset.ofTotalSeconds(in.readInt()) : ZoneOffset.ofTotalSeconds(offsetByte * 900));
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   789
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   790
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   791
}