src/java.base/share/classes/java/time/ZoneOffset.java
author darcy
Thu, 29 Aug 2019 16:31:34 -0700
changeset 57956 e0b8b019d2f5
parent 52078 4a63197816ce
permissions -rw-r--r--
8229997: Apply java.io.Serial annotations in java.base Reviewed-by: alanb, rriggs
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
     1
/*
57956
e0b8b019d2f5 8229997: Apply java.io.Serial annotations in java.base
darcy
parents: 52078
diff changeset
     2
 * Copyright (c) 2012, 2019, Oracle and/or its affiliates. All rights reserved.
15289
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>
24256
da9a41004459 8034906: Fix typos, errors and Javadoc differences in java.time
scolebourne
parents: 22566
diff changeset
    92
 * A time-zone offset is the amount of time that a time-zone differs from Greenwich/UTC.
15289
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
 *
22108
99859c0e9a33 8029551: Add value-type notice to java.time classes
rriggs
parents: 22081
diff changeset
   118
 * <p>
49433
b6671a111395 8199465: {@docRoot} references need to be updated to reflect new module/package structure
jjg
parents: 47216
diff changeset
   119
 * This is a <a href="{@docRoot}/java.base/java/lang/doc-files/ValueBased.html">value-based</a>
22108
99859c0e9a33 8029551: Add value-type notice to java.time classes
rriggs
parents: 22081
diff changeset
   120
 * class; use of identity-sensitive operations (including reference equality
99859c0e9a33 8029551: Add value-type notice to java.time classes
rriggs
parents: 22081
diff changeset
   121
 * ({@code ==}), identity hash code, or synchronization) on instances of
99859c0e9a33 8029551: Add value-type notice to java.time classes
rriggs
parents: 22081
diff changeset
   122
 * {@code ZoneOffset} may have unpredictable results and should be avoided.
99859c0e9a33 8029551: Add value-type notice to java.time classes
rriggs
parents: 22081
diff changeset
   123
 * The {@code equals} method should be used for comparisons.
99859c0e9a33 8029551: Add value-type notice to java.time classes
rriggs
parents: 22081
diff changeset
   124
 *
17474
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
   125
 * @implSpec
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   126
 * This class is immutable and thread-safe.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   127
 *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   128
 * @since 1.8
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   129
 */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   130
public final class ZoneOffset
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   131
        extends ZoneId
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   132
        implements TemporalAccessor, TemporalAdjuster, Comparable<ZoneOffset>, Serializable {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   133
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   134
    /** Cache of time-zone offset by offset in seconds. */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   135
    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
   136
    /** Cache of time-zone offset by ID. */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   137
    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
   138
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   139
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   140
     * The abs maximum seconds.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   141
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   142
    private static final int MAX_SECONDS = 18 * SECONDS_PER_HOUR;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   143
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   144
     * Serialization version.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   145
     */
57956
e0b8b019d2f5 8229997: Apply java.io.Serial annotations in java.base
darcy
parents: 52078
diff changeset
   146
    @java.io.Serial
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   147
    private static final long serialVersionUID = 2357656521762053153L;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   148
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   149
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   150
     * The time-zone offset for UTC, with an ID of 'Z'.
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 UTC = ZoneOffset.ofTotalSeconds(0);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   153
    /**
35777
656b9a28f19e 8142539: Incorrect definition of ZoneOffset.MIN
rriggs
parents: 25859
diff changeset
   154
     * Constant for the minimum supported offset.
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   155
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   156
    public static final ZoneOffset MIN = ZoneOffset.ofTotalSeconds(-MAX_SECONDS);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   157
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   158
     * Constant for the maximum supported offset.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   159
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   160
    public static final ZoneOffset MAX = ZoneOffset.ofTotalSeconds(MAX_SECONDS);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   161
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   162
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   163
     * The total offset in seconds.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   164
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   165
    private final int totalSeconds;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   166
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   167
     * The string form of the time-zone offset.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   168
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   169
    private final transient String id;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   170
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   171
    //-----------------------------------------------------------------------
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   172
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   173
     * Obtains an instance of {@code ZoneOffset} using the ID.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   174
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   175
     * This method parses the string ID of a {@code ZoneOffset} to
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   176
     * return an instance. The parsing accepts all the formats generated by
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   177
     * {@link #getId()}, plus some additional formats:
20873
e91d5b1cb8e6 8026516: javadoc errors in java.time
rriggs
parents: 20795
diff changeset
   178
     * <ul>
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   179
     * <li>{@code Z} - for UTC
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   180
     * <li>{@code +h}
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   181
     * <li>{@code +hh}
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   182
     * <li>{@code +hh:mm}
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   183
     * <li>{@code -hh:mm}
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   184
     * <li>{@code +hhmm}
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   185
     * <li>{@code -hhmm}
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   186
     * <li>{@code +hh:mm:ss}
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   187
     * <li>{@code -hh:mm:ss}
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   188
     * <li>{@code +hhmmss}
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   189
     * <li>{@code -hhmmss}
20873
e91d5b1cb8e6 8026516: javadoc errors in java.time
rriggs
parents: 20795
diff changeset
   190
     * </ul>
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   191
     * Note that &plusmn; means either the plus or minus symbol.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   192
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   193
     * 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
   194
     * described by {@link #getId()}.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   195
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   196
     * The maximum supported range is from +18:00 to -18:00 inclusive.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   197
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   198
     * @param offsetId  the offset ID, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   199
     * @return the zone-offset, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   200
     * @throws DateTimeException if the offset ID is invalid
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   201
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   202
    @SuppressWarnings("fallthrough")
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   203
    public static ZoneOffset of(String offsetId) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   204
        Objects.requireNonNull(offsetId, "offsetId");
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   205
        // "Z" is always in the cache
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   206
        ZoneOffset offset = ID_CACHE.get(offsetId);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   207
        if (offset != null) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   208
            return offset;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   209
        }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   210
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   211
        // parse - +h, +hh, +hhmm, +hh:mm, +hhmmss, +hh:mm:ss
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   212
        final int hours, minutes, seconds;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   213
        switch (offsetId.length()) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   214
            case 2:
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   215
                offsetId = offsetId.charAt(0) + "0" + offsetId.charAt(1);  // fallthru
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   216
            case 3:
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   217
                hours = parseNumber(offsetId, 1, false);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   218
                minutes = 0;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   219
                seconds = 0;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   220
                break;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   221
            case 5:
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   222
                hours = parseNumber(offsetId, 1, false);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   223
                minutes = parseNumber(offsetId, 3, false);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   224
                seconds = 0;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   225
                break;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   226
            case 6:
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   227
                hours = parseNumber(offsetId, 1, false);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   228
                minutes = parseNumber(offsetId, 4, true);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   229
                seconds = 0;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   230
                break;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   231
            case 7:
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   232
                hours = parseNumber(offsetId, 1, false);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   233
                minutes = parseNumber(offsetId, 3, false);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   234
                seconds = parseNumber(offsetId, 5, false);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   235
                break;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   236
            case 9:
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   237
                hours = parseNumber(offsetId, 1, false);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   238
                minutes = parseNumber(offsetId, 4, true);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   239
                seconds = parseNumber(offsetId, 7, true);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   240
                break;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   241
            default:
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   242
                throw new DateTimeException("Invalid ID for ZoneOffset, invalid format: " + offsetId);
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   243
        }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   244
        char first = offsetId.charAt(0);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   245
        if (first != '+' && first != '-') {
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   246
            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
   247
        }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   248
        if (first == '-') {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   249
            return ofHoursMinutesSeconds(-hours, -minutes, -seconds);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   250
        } else {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   251
            return ofHoursMinutesSeconds(hours, minutes, seconds);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   252
        }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   253
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   254
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   255
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   256
     * Parse a two digit zero-prefixed number.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   257
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   258
     * @param offsetId  the offset ID, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   259
     * @param pos  the position to parse, valid
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   260
     * @param precededByColon  should this number be prefixed by a precededByColon
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   261
     * @return the parsed number, from 0 to 99
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   262
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   263
    private static int parseNumber(CharSequence offsetId, int pos, boolean precededByColon) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   264
        if (precededByColon && offsetId.charAt(pos - 1) != ':') {
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   265
            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
   266
        }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   267
        char ch1 = offsetId.charAt(pos);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   268
        char ch2 = offsetId.charAt(pos + 1);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   269
        if (ch1 < '0' || ch1 > '9' || ch2 < '0' || ch2 > '9') {
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   270
            throw new DateTimeException("Invalid ID for ZoneOffset, non numeric characters found: " + offsetId);
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   271
        }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   272
        return (ch1 - 48) * 10 + (ch2 - 48);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   273
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   274
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   275
    //-----------------------------------------------------------------------
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   276
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   277
     * Obtains an instance of {@code ZoneOffset} using an offset in hours.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   278
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   279
     * @param hours  the time-zone offset in hours, from -18 to +18
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   280
     * @return the zone-offset, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   281
     * @throws DateTimeException if the offset is not in the required range
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   282
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   283
    public static ZoneOffset ofHours(int hours) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   284
        return ofHoursMinutesSeconds(hours, 0, 0);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   285
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   286
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   287
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   288
     * Obtains an instance of {@code ZoneOffset} using an offset in
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   289
     * hours and minutes.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   290
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   291
     * The sign of the hours and minutes components must match.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   292
     * Thus, if the hours is negative, the minutes must be negative or zero.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   293
     * If the hours is zero, the minutes may be positive, negative or zero.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   294
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   295
     * @param hours  the time-zone offset in hours, from -18 to +18
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   296
     * @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
   297
     * @return the zone-offset, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   298
     * @throws DateTimeException if the offset is not in the required range
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   299
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   300
    public static ZoneOffset ofHoursMinutes(int hours, int minutes) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   301
        return ofHoursMinutesSeconds(hours, minutes, 0);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   302
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   303
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   304
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   305
     * Obtains an instance of {@code ZoneOffset} using an offset in
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   306
     * hours, minutes and seconds.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   307
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   308
     * The sign of the hours, minutes and seconds components must match.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   309
     * 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
   310
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   311
     * @param hours  the time-zone offset in hours, from -18 to +18
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   312
     * @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
   313
     * @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
   314
     * @return the zone-offset, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   315
     * @throws DateTimeException if the offset is not in the required range
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   316
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   317
    public static ZoneOffset ofHoursMinutesSeconds(int hours, int minutes, int seconds) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   318
        validate(hours, minutes, seconds);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   319
        int totalSeconds = totalSeconds(hours, minutes, seconds);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   320
        return ofTotalSeconds(totalSeconds);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   321
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   322
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   323
    //-----------------------------------------------------------------------
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   324
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   325
     * Obtains an instance of {@code ZoneOffset} from a temporal object.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   326
     * <p>
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   327
     * This obtains an offset based on the specified temporal.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   328
     * A {@code TemporalAccessor} represents an arbitrary set of date and time information,
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   329
     * which this factory converts to an instance of {@code ZoneOffset}.
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   330
     * <p>
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   331
     * A {@code TemporalAccessor} represents some form of date and time information.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   332
     * This factory converts the arbitrary temporal object to an instance of {@code ZoneOffset}.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   333
     * <p>
20795
8ec9e5b79828 8025722: TemporalAdjusters and TemporalQueries
rriggs
parents: 20747
diff changeset
   334
     * The conversion uses the {@link TemporalQueries#offset()} query, which relies
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   335
     * on extracting the {@link ChronoField#OFFSET_SECONDS OFFSET_SECONDS} field.
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   336
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   337
     * This method matches the signature of the functional interface {@link TemporalQuery}
24256
da9a41004459 8034906: Fix typos, errors and Javadoc differences in java.time
scolebourne
parents: 22566
diff changeset
   338
     * allowing it to be used as a query via method reference, {@code ZoneOffset::from}.
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   339
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   340
     * @param temporal  the temporal object to convert, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   341
     * @return the zone-offset, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   342
     * @throws DateTimeException if unable to convert to an {@code ZoneOffset}
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   343
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   344
    public static ZoneOffset from(TemporalAccessor temporal) {
20520
0952771e3e25 8024835: Change until() to accept any compatible temporal
rriggs
parents: 19841
diff changeset
   345
        Objects.requireNonNull(temporal, "temporal");
20795
8ec9e5b79828 8025722: TemporalAdjusters and TemporalQueries
rriggs
parents: 20747
diff changeset
   346
        ZoneOffset offset = temporal.query(TemporalQueries.offset());
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   347
        if (offset == null) {
20747
86a86a94b367 8025718: Enhance error messages for parsing
rriggs
parents: 20520
diff changeset
   348
            throw new DateTimeException("Unable to obtain ZoneOffset from TemporalAccessor: " +
86a86a94b367 8025718: Enhance error messages for parsing
rriggs
parents: 20520
diff changeset
   349
                    temporal + " of type " + temporal.getClass().getName());
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   350
        }
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   351
        return offset;
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   352
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   353
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   354
    //-----------------------------------------------------------------------
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   355
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   356
     * Validates the offset fields.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   357
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   358
     * @param hours  the time-zone offset in hours, from -18 to +18
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   359
     * @param minutes  the time-zone offset in minutes, from 0 to &plusmn;59
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   360
     * @param seconds  the time-zone offset in seconds, from 0 to &plusmn;59
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   361
     * @throws DateTimeException if the offset is not in the required range
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   362
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   363
    private static void validate(int hours, int minutes, int seconds) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   364
        if (hours < -18 || hours > 18) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   365
            throw new DateTimeException("Zone offset hours not in valid range: value " + hours +
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   366
                    " is not in the range -18 to 18");
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   367
        }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   368
        if (hours > 0) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   369
            if (minutes < 0 || seconds < 0) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   370
                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
   371
            }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   372
        } else if (hours < 0) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   373
            if (minutes > 0 || seconds > 0) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   374
                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
   375
            }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   376
        } else if ((minutes > 0 && seconds < 0) || (minutes < 0 && seconds > 0)) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   377
            throw new DateTimeException("Zone offset minutes and seconds must have the same sign");
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   378
        }
40527
542d72803808 8164366: ZoneOffset.ofHoursMinutesSeconds() does not reject invalid input
igerasim
parents: 35777
diff changeset
   379
        if (minutes < -59 || minutes > 59) {
542d72803808 8164366: ZoneOffset.ofHoursMinutesSeconds() does not reject invalid input
igerasim
parents: 35777
diff changeset
   380
            throw new DateTimeException("Zone offset minutes not in valid range: value " +
542d72803808 8164366: ZoneOffset.ofHoursMinutesSeconds() does not reject invalid input
igerasim
parents: 35777
diff changeset
   381
                    minutes + " is not in the range -59 to 59");
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   382
        }
40527
542d72803808 8164366: ZoneOffset.ofHoursMinutesSeconds() does not reject invalid input
igerasim
parents: 35777
diff changeset
   383
        if (seconds < -59 || seconds > 59) {
542d72803808 8164366: ZoneOffset.ofHoursMinutesSeconds() does not reject invalid input
igerasim
parents: 35777
diff changeset
   384
            throw new DateTimeException("Zone offset seconds not in valid range: value " +
542d72803808 8164366: ZoneOffset.ofHoursMinutesSeconds() does not reject invalid input
igerasim
parents: 35777
diff changeset
   385
                    seconds + " is not in the range -59 to 59");
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   386
        }
40527
542d72803808 8164366: ZoneOffset.ofHoursMinutesSeconds() does not reject invalid input
igerasim
parents: 35777
diff changeset
   387
        if (Math.abs(hours) == 18 && (minutes | seconds) != 0) {
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   388
            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
   389
        }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   390
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   391
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   392
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   393
     * Calculates the total offset in 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
     * @param hours  the time-zone offset in hours, from -18 to +18
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   396
     * @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
   397
     * @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
   398
     * @return the total in seconds
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   399
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   400
    private static int totalSeconds(int hours, int minutes, int seconds) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   401
        return hours * SECONDS_PER_HOUR + minutes * SECONDS_PER_MINUTE + seconds;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   402
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   403
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   404
    //-----------------------------------------------------------------------
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   405
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   406
     * Obtains an instance of {@code ZoneOffset} specifying the total offset in seconds
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   407
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   408
     * 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
   409
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   410
     * @param totalSeconds  the total time-zone offset in seconds, from -64800 to +64800
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   411
     * @return the ZoneOffset, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   412
     * @throws DateTimeException if the offset is not in the required range
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   413
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   414
    public static ZoneOffset ofTotalSeconds(int totalSeconds) {
40527
542d72803808 8164366: ZoneOffset.ofHoursMinutesSeconds() does not reject invalid input
igerasim
parents: 35777
diff changeset
   415
        if (totalSeconds < -MAX_SECONDS || totalSeconds > MAX_SECONDS) {
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   416
            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
   417
        }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   418
        if (totalSeconds % (15 * SECONDS_PER_MINUTE) == 0) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   419
            Integer totalSecs = totalSeconds;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   420
            ZoneOffset result = SECONDS_CACHE.get(totalSecs);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   421
            if (result == null) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   422
                result = new ZoneOffset(totalSeconds);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   423
                SECONDS_CACHE.putIfAbsent(totalSecs, result);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   424
                result = SECONDS_CACHE.get(totalSecs);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   425
                ID_CACHE.putIfAbsent(result.getId(), result);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   426
            }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   427
            return result;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   428
        } else {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   429
            return new ZoneOffset(totalSeconds);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   430
        }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   431
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   432
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   433
    //-----------------------------------------------------------------------
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   434
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   435
     * Constructor.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   436
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   437
     * @param totalSeconds  the total time-zone offset in seconds, from -64800 to +64800
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   438
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   439
    private ZoneOffset(int totalSeconds) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   440
        super();
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   441
        this.totalSeconds = totalSeconds;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   442
        id = buildId(totalSeconds);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   443
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   444
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   445
    private static String buildId(int totalSeconds) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   446
        if (totalSeconds == 0) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   447
            return "Z";
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   448
        } else {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   449
            int absTotalSeconds = Math.abs(totalSeconds);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   450
            StringBuilder buf = new StringBuilder();
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   451
            int absHours = absTotalSeconds / SECONDS_PER_HOUR;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   452
            int absMinutes = (absTotalSeconds / SECONDS_PER_MINUTE) % MINUTES_PER_HOUR;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   453
            buf.append(totalSeconds < 0 ? "-" : "+")
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   454
                .append(absHours < 10 ? "0" : "").append(absHours)
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   455
                .append(absMinutes < 10 ? ":0" : ":").append(absMinutes);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   456
            int absSeconds = absTotalSeconds % SECONDS_PER_MINUTE;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   457
            if (absSeconds != 0) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   458
                buf.append(absSeconds < 10 ? ":0" : ":").append(absSeconds);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   459
            }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   460
            return buf.toString();
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   461
        }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   462
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   463
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   464
    //-----------------------------------------------------------------------
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   465
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   466
     * Gets the total zone offset in seconds.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   467
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   468
     * This is the primary way to access the offset amount.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   469
     * It returns the total of the hours, minutes and seconds fields as a
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   470
     * single offset that can be added to a time.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   471
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   472
     * @return the total zone offset amount in seconds
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   473
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   474
    public int getTotalSeconds() {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   475
        return totalSeconds;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   476
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   477
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   478
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   479
     * Gets the normalized zone offset ID.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   480
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   481
     * The ID is minor variation to the standard ISO-8601 formatted string
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   482
     * for the offset. There are three formats:
20873
e91d5b1cb8e6 8026516: javadoc errors in java.time
rriggs
parents: 20795
diff changeset
   483
     * <ul>
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   484
     * <li>{@code Z} - for UTC (ISO-8601)
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   485
     * <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
   486
     * <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
   487
     * </ul>
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   488
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   489
     * @return the zone offset ID, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   490
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   491
    @Override
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   492
    public String getId() {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   493
        return id;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   494
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   495
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   496
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   497
     * Gets the associated time-zone rules.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   498
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   499
     * The rules will always return this offset when queried.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   500
     * The implementation class is immutable, thread-safe and serializable.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   501
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   502
     * @return the rules, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   503
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   504
    @Override
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   505
    public ZoneRules getRules() {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   506
        return ZoneRules.of(this);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   507
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   508
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   509
    //-----------------------------------------------------------------------
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   510
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   511
     * Checks if the specified field is supported.
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
     * This checks if this offset can be queried for the specified field.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   514
     * If false, then calling the {@link #range(TemporalField) range} and
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   515
     * {@link #get(TemporalField) get} methods will throw an exception.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   516
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   517
     * If the field is a {@link ChronoField} then the query is implemented here.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   518
     * The {@code OFFSET_SECONDS} field returns true.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   519
     * All other {@code ChronoField} instances will return false.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   520
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   521
     * 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
   522
     * is obtained by invoking {@code TemporalField.isSupportedBy(TemporalAccessor)}
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   523
     * passing {@code this} as the argument.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   524
     * Whether the field is supported is determined by the field.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   525
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   526
     * @param field  the field to check, null returns false
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   527
     * @return true if the field is supported on this offset, false if not
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   528
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   529
    @Override
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   530
    public boolean isSupported(TemporalField field) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   531
        if (field instanceof ChronoField) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   532
            return field == OFFSET_SECONDS;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   533
        }
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   534
        return field != null && field.isSupportedBy(this);
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   535
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   536
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   537
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   538
     * Gets the range of valid values for the specified field.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   539
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   540
     * The range object expresses the minimum and maximum valid values for a field.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   541
     * This offset is used to enhance the accuracy of the returned range.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   542
     * 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
   543
     * or for some other reason, an exception is thrown.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   544
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   545
     * If the field is a {@link ChronoField} then the query is implemented here.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   546
     * The {@link #isSupported(TemporalField) supported fields} will return
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   547
     * appropriate range instances.
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   548
     * All other {@code ChronoField} instances will throw an {@code UnsupportedTemporalTypeException}.
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   549
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   550
     * 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
   551
     * is obtained by invoking {@code TemporalField.rangeRefinedBy(TemporalAccessor)}
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   552
     * passing {@code this} as the argument.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   553
     * Whether the range can be obtained is determined by the field.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   554
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   555
     * @param field  the field to query the range for, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   556
     * @return the range of valid values for the field, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   557
     * @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
   558
     * @throws UnsupportedTemporalTypeException if the field is not supported
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   559
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   560
    @Override  // override for Javadoc
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   561
    public ValueRange range(TemporalField field) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   562
        return TemporalAccessor.super.range(field);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   563
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   564
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   565
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   566
     * 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
   567
     * <p>
24256
da9a41004459 8034906: Fix typos, errors and Javadoc differences in java.time
scolebourne
parents: 22566
diff changeset
   568
     * This queries this offset for the value of the specified field.
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   569
     * 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
   570
     * 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
   571
     * or for some other reason, an exception is thrown.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   572
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   573
     * If the field is a {@link ChronoField} then the query is implemented here.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   574
     * 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
   575
     * All other {@code ChronoField} instances will throw an {@code UnsupportedTemporalTypeException}.
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   576
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   577
     * 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
   578
     * is obtained by invoking {@code TemporalField.getFrom(TemporalAccessor)}
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   579
     * passing {@code this} as the argument. Whether the value can be obtained,
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   580
     * and what the value represents, is determined by the field.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   581
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   582
     * @param field  the field to get, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   583
     * @return the value for the field
16852
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   584
     * @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
   585
     *         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
   586
     * @throws UnsupportedTemporalTypeException if the field is not supported or
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
   587
     *         the range of values exceeds an {@code int}
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   588
     * @throws ArithmeticException if numeric overflow occurs
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   589
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   590
    @Override  // override for Javadoc and performance
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   591
    public int get(TemporalField field) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   592
        if (field == OFFSET_SECONDS) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   593
            return totalSeconds;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   594
        } else if (field instanceof ChronoField) {
19030
32f129cb6351 8016025: JSR 310 DateTime API Updates IV
sherman
parents: 17474
diff changeset
   595
            throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   596
        }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   597
        return range(field).checkValidIntValue(getLong(field), field);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   598
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   599
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   600
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   601
     * 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
   602
     * <p>
24256
da9a41004459 8034906: Fix typos, errors and Javadoc differences in java.time
scolebourne
parents: 22566
diff changeset
   603
     * This queries this offset for the value of the specified field.
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   604
     * 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
   605
     * or for some other reason, an exception is thrown.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   606
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   607
     * If the field is a {@link ChronoField} then the query is implemented here.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   608
     * 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
   609
     * All other {@code ChronoField} instances will throw an {@code UnsupportedTemporalTypeException}.
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   610
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   611
     * 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
   612
     * is obtained by invoking {@code TemporalField.getFrom(TemporalAccessor)}
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   613
     * passing {@code this} as the argument. Whether the value can be obtained,
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   614
     * and what the value represents, is determined by the field.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   615
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   616
     * @param field  the field to get, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   617
     * @return the value for the field
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   618
     * @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
   619
     * @throws UnsupportedTemporalTypeException if the field is not supported
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   620
     * @throws ArithmeticException if numeric overflow occurs
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   621
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   622
    @Override
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   623
    public long getLong(TemporalField field) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   624
        if (field == OFFSET_SECONDS) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   625
            return totalSeconds;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   626
        } else if (field instanceof ChronoField) {
19030
32f129cb6351 8016025: JSR 310 DateTime API Updates IV
sherman
parents: 17474
diff changeset
   627
            throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   628
        }
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   629
        return field.getFrom(this);
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   630
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   631
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   632
    //-----------------------------------------------------------------------
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   633
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   634
     * Queries this offset using the specified query.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   635
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   636
     * This queries this offset using the specified query strategy object.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   637
     * The {@code TemporalQuery} object defines the logic to be used to
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   638
     * obtain the result. Read the documentation of the query to understand
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   639
     * what the result of this method will be.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   640
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   641
     * The result of this method is obtained by invoking the
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   642
     * {@link TemporalQuery#queryFrom(TemporalAccessor)} method on the
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   643
     * specified query passing {@code this} as the argument.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   644
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   645
     * @param <R> the type of the result
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   646
     * @param query  the query to invoke, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   647
     * @return the query result, null may be returned (defined by the query)
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   648
     * @throws DateTimeException if unable to query (defined by the query)
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   649
     * @throws ArithmeticException if numeric overflow occurs (defined by the 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
    @SuppressWarnings("unchecked")
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   652
    @Override
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   653
    public <R> R query(TemporalQuery<R> query) {
20795
8ec9e5b79828 8025722: TemporalAdjusters and TemporalQueries
rriggs
parents: 20747
diff changeset
   654
        if (query == TemporalQueries.offset() || query == TemporalQueries.zone()) {
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   655
            return (R) this;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   656
        }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   657
        return TemporalAccessor.super.query(query);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   658
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   659
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   660
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   661
     * Adjusts the specified temporal object to have the same offset as this object.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   662
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   663
     * This returns a temporal object of the same observable type as the input
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   664
     * with the offset changed to be the same as this.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   665
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   666
     * The adjustment is equivalent to using {@link Temporal#with(TemporalField, long)}
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   667
     * passing {@link ChronoField#OFFSET_SECONDS} as the field.
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
     * In most cases, it is clearer to reverse the calling pattern by using
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   670
     * {@link Temporal#with(TemporalAdjuster)}:
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   671
     * <pre>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   672
     *   // these two lines are equivalent, but the second approach is recommended
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   673
     *   temporal = thisOffset.adjustInto(temporal);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   674
     *   temporal = temporal.with(thisOffset);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   675
     * </pre>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   676
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   677
     * This instance is immutable and unaffected by this method call.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   678
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   679
     * @param temporal  the target object to be adjusted, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   680
     * @return the adjusted object, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   681
     * @throws DateTimeException if unable to make the adjustment
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   682
     * @throws ArithmeticException if numeric overflow occurs
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   683
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   684
    @Override
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   685
    public Temporal adjustInto(Temporal temporal) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   686
        return temporal.with(OFFSET_SECONDS, totalSeconds);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   687
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   688
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   689
    //-----------------------------------------------------------------------
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   690
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   691
     * Compares this offset to another offset in descending order.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   692
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   693
     * 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
   694
     * 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
   695
     * offset of {@code +09:00} and so on down to {@code -18:00}.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   696
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   697
     * The comparison is "consistent with equals", as defined by {@link Comparable}.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   698
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   699
     * @param other  the other date to compare to, not null
40527
542d72803808 8164366: ZoneOffset.ofHoursMinutesSeconds() does not reject invalid input
igerasim
parents: 35777
diff changeset
   700
     * @return the comparator value, negative if less, positive if greater
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   701
     * @throws NullPointerException if {@code other} is null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   702
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   703
    @Override
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   704
    public int compareTo(ZoneOffset other) {
40527
542d72803808 8164366: ZoneOffset.ofHoursMinutesSeconds() does not reject invalid input
igerasim
parents: 35777
diff changeset
   705
        // abs(totalSeconds) <= MAX_SECONDS, so no overflow can happen here
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   706
        return other.totalSeconds - totalSeconds;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   707
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   708
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   709
    //-----------------------------------------------------------------------
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   710
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   711
     * Checks if this offset is equal to another offset.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   712
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   713
     * The comparison is based on the amount of the offset in seconds.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   714
     * This is equivalent to a comparison by ID.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   715
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   716
     * @param obj  the object to check, null returns false
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   717
     * @return true if this is equal to the other offset
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   718
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   719
    @Override
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   720
    public boolean equals(Object obj) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   721
        if (this == obj) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   722
           return true;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   723
        }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   724
        if (obj instanceof ZoneOffset) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   725
            return totalSeconds == ((ZoneOffset) obj).totalSeconds;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   726
        }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   727
        return false;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   728
    }
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
     * A hash code for this offset.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   732
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   733
     * @return a suitable hash code
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   734
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   735
    @Override
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   736
    public int hashCode() {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   737
        return totalSeconds;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   738
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   739
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
     * Outputs this offset as a {@code String}, using the normalized ID.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   743
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   744
     * @return a string representation of this offset, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   745
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   746
    @Override
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   747
    public String toString() {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   748
        return id;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   749
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   750
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   751
    // -----------------------------------------------------------------------
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   752
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   753
     * Writes the object using a
52078
4a63197816ce 8211952: Broken links in java.time API
jjg
parents: 49433
diff changeset
   754
     * <a href="{@docRoot}/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
   755
     * @serialData
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   756
     * <pre>
19841
15c8e97d6a14 8024164: JSR310 serialization should be described in details
rriggs
parents: 19030
diff changeset
   757
     *  out.writeByte(8);                  // identifies a ZoneOffset
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   758
     *  int offsetByte = totalSeconds % 900 == 0 ? totalSeconds / 900 : 127;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   759
     *  out.writeByte(offsetByte);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   760
     *  if (offsetByte == 127) {
19841
15c8e97d6a14 8024164: JSR310 serialization should be described in details
rriggs
parents: 19030
diff changeset
   761
     *      out.writeInt(totalSeconds);
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   762
     *  }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   763
     * </pre>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   764
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   765
     * @return the instance of {@code Ser}, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   766
     */
57956
e0b8b019d2f5 8229997: Apply java.io.Serial annotations in java.base
darcy
parents: 52078
diff changeset
   767
    @java.io.Serial
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   768
    private Object writeReplace() {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   769
        return new Ser(Ser.ZONE_OFFSET_TYPE, this);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   770
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   771
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   772
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   773
     * Defend against malicious streams.
22081
86eb26ff8f2b 8030002: Enhance deserialization using readObject
rriggs
parents: 20873
diff changeset
   774
     *
22566
4ebe53dd7814 8032502: java.time add @param tags to readObject
rriggs
parents: 22108
diff changeset
   775
     * @param s the stream to read
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   776
     * @throws InvalidObjectException always
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   777
     */
57956
e0b8b019d2f5 8229997: Apply java.io.Serial annotations in java.base
darcy
parents: 52078
diff changeset
   778
    @java.io.Serial
22081
86eb26ff8f2b 8030002: Enhance deserialization using readObject
rriggs
parents: 20873
diff changeset
   779
    private void readObject(ObjectInputStream s) throws InvalidObjectException {
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   780
        throw new InvalidObjectException("Deserialization via serialization delegate");
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   781
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   782
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   783
    @Override
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   784
    void write(DataOutput out) throws IOException {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   785
        out.writeByte(Ser.ZONE_OFFSET_TYPE);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   786
        writeExternal(out);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   787
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   788
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   789
    void writeExternal(DataOutput out) throws IOException {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   790
        final int offsetSecs = totalSeconds;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   791
        int offsetByte = offsetSecs % 900 == 0 ? offsetSecs / 900 : 127;  // compress to -72 to +72
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   792
        out.writeByte(offsetByte);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   793
        if (offsetByte == 127) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   794
            out.writeInt(offsetSecs);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   795
        }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   796
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   797
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   798
    static ZoneOffset readExternal(DataInput in) throws IOException {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   799
        int offsetByte = in.readByte();
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   800
        return (offsetByte == 127 ? ZoneOffset.ofTotalSeconds(in.readInt()) : ZoneOffset.ofTotalSeconds(offsetByte * 900));
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   801
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   802
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   803
}