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