jdk/src/share/classes/java/time/zone/ZoneOffsetTransitionRule.java
author sherman
Wed, 15 May 2013 07:48:57 -0700
changeset 17474 8c100beabcc0
parent 16852 60207b2b4b42
child 19841 15c8e97d6a14
permissions -rw-r--r--
8013730: JSR 310 DateTime API Updates III Summary: Integration of JSR310 Date/Time API update III Reviewed-by: naoto Contributed-by: scolebourne@joda.org, roger.riggs@oracle.com, masayoshi.okutsu@oracle.com, patrick.zhang@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) 2009-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.zone;
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 static java.time.temporal.TemporalAdjuster.nextOrSame;
60207b2b4b42 8011172: JSR 310 DateTime API Updates II
sherman
parents: 15658
diff changeset
    65
import static java.time.temporal.TemporalAdjuster.previousOrSame;
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    66
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    67
import java.io.DataInput;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    68
import java.io.DataOutput;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    69
import java.io.IOException;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    70
import java.io.Serializable;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    71
import java.time.DayOfWeek;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    72
import java.time.LocalDate;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    73
import java.time.LocalDateTime;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    74
import java.time.LocalTime;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    75
import java.time.Month;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    76
import java.time.ZoneOffset;
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
    77
import java.time.chrono.IsoChronology;
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    78
import java.util.Objects;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    79
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    80
/**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    81
 * A rule expressing how to create a transition.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    82
 * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    83
 * This class allows rules for identifying future transitions to be expressed.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    84
 * A rule might be written in many forms:
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    85
 * <p><ul>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    86
 * <li>the 16th March
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    87
 * <li>the Sunday on or after the 16th March
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    88
 * <li>the Sunday on or before the 16th March
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    89
 * <li>the last Sunday in February
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    90
 * </ul><p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    91
 * These different rule types can be expressed and queried.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    92
 *
17474
8c100beabcc0 8013730: JSR 310 DateTime API Updates III
sherman
parents: 16852
diff changeset
    93
 * @implSpec
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    94
 * This class is immutable and thread-safe.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    95
 *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    96
 * @since 1.8
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    97
 */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    98
public final class ZoneOffsetTransitionRule implements Serializable {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
    99
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   100
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   101
     * Serialization version.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   102
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   103
    private static final long serialVersionUID = 6889046316657758795L;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   104
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   105
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   106
     * The month of the month-day of the first day of the cutover week.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   107
     * The actual date will be adjusted by the dowChange field.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   108
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   109
    private final Month month;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   110
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   111
     * The day-of-month of the month-day of the cutover week.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   112
     * If positive, it is the start of the week where the cutover can occur.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   113
     * If negative, it represents the end of the week where cutover can occur.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   114
     * The value is the number of days from the end of the month, such that
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   115
     * {@code -1} is the last day of the month, {@code -2} is the second
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   116
     * to last day, and so on.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   117
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   118
    private final byte dom;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   119
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   120
     * The cutover day-of-week, null to retain the day-of-month.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   121
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   122
    private final DayOfWeek dow;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   123
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   124
     * The cutover time in the 'before' offset.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   125
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   126
    private final LocalTime time;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   127
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   128
     * Whether the cutover time is midnight at the end of day.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   129
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   130
    private final boolean timeEndOfDay;
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 definition of how the local time should be interpreted.
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 final TimeDefinition timeDefinition;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   135
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   136
     * The standard offset at the cutover.
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 final ZoneOffset standardOffset;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   139
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   140
     * The offset before the cutover.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   141
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   142
    private final ZoneOffset offsetBefore;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   143
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   144
     * The offset after the cutover.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   145
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   146
    private final ZoneOffset offsetAfter;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   147
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   148
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   149
     * Obtains an instance defining the yearly rule to create transitions between two offsets.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   150
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   151
     * Applications should normally obtain an instance from {@link ZoneRules}.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   152
     * This factory is only intended for use when creating {@link ZoneRules}.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   153
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   154
     * @param month  the month of the month-day of the first day of the cutover week, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   155
     * @param dayOfMonthIndicator  the day of the month-day of the cutover week, positive if the week is that
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   156
     *  day or later, negative if the week is that day or earlier, counting from the last day of the month,
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   157
     *  from -28 to 31 excluding 0
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   158
     * @param dayOfWeek  the required day-of-week, null if the month-day should not be changed
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   159
     * @param time  the cutover time in the 'before' offset, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   160
     * @param timeEndOfDay  whether the time is midnight at the end of day
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   161
     * @param timeDefnition  how to interpret the cutover
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   162
     * @param standardOffset  the standard offset in force at the cutover, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   163
     * @param offsetBefore  the offset before the cutover, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   164
     * @param offsetAfter  the offset after the cutover, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   165
     * @return the rule, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   166
     * @throws IllegalArgumentException if the day of month indicator is invalid
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   167
     * @throws IllegalArgumentException if the end of day flag is true when the time is not midnight
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   168
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   169
    public static ZoneOffsetTransitionRule of(
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   170
            Month month,
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   171
            int dayOfMonthIndicator,
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   172
            DayOfWeek dayOfWeek,
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   173
            LocalTime time,
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   174
            boolean timeEndOfDay,
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   175
            TimeDefinition timeDefnition,
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   176
            ZoneOffset standardOffset,
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   177
            ZoneOffset offsetBefore,
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   178
            ZoneOffset offsetAfter) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   179
        Objects.requireNonNull(month, "month");
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   180
        Objects.requireNonNull(time, "time");
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   181
        Objects.requireNonNull(timeDefnition, "timeDefnition");
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   182
        Objects.requireNonNull(standardOffset, "standardOffset");
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   183
        Objects.requireNonNull(offsetBefore, "offsetBefore");
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   184
        Objects.requireNonNull(offsetAfter, "offsetAfter");
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   185
        if (dayOfMonthIndicator < -28 || dayOfMonthIndicator > 31 || dayOfMonthIndicator == 0) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   186
            throw new IllegalArgumentException("Day of month indicator must be between -28 and 31 inclusive excluding zero");
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   187
        }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   188
        if (timeEndOfDay && time.equals(LocalTime.MIDNIGHT) == false) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   189
            throw new IllegalArgumentException("Time must be midnight when end of day flag is true");
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   190
        }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   191
        return new ZoneOffsetTransitionRule(month, dayOfMonthIndicator, dayOfWeek, time, timeEndOfDay, timeDefnition, standardOffset, offsetBefore, offsetAfter);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   192
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   193
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   194
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   195
     * Creates an instance defining the yearly rule to create transitions between two offsets.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   196
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   197
     * @param month  the month of the month-day of the first day of the cutover week, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   198
     * @param dayOfMonthIndicator  the day of the month-day of the cutover week, positive if the week is that
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   199
     *  day or later, negative if the week is that day or earlier, counting from the last day of the month,
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   200
     *  from -28 to 31 excluding 0
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   201
     * @param dayOfWeek  the required day-of-week, null if the month-day should not be changed
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   202
     * @param time  the cutover time in the 'before' offset, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   203
     * @param timeEndOfDay  whether the time is midnight at the end of day
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   204
     * @param timeDefnition  how to interpret the cutover
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   205
     * @param standardOffset  the standard offset in force at the cutover, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   206
     * @param offsetBefore  the offset before the cutover, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   207
     * @param offsetAfter  the offset after the cutover, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   208
     * @throws IllegalArgumentException if the day of month indicator is invalid
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   209
     * @throws IllegalArgumentException if the end of day flag is true when the time is not midnight
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   210
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   211
    ZoneOffsetTransitionRule(
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   212
            Month month,
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   213
            int dayOfMonthIndicator,
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   214
            DayOfWeek dayOfWeek,
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   215
            LocalTime time,
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   216
            boolean timeEndOfDay,
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   217
            TimeDefinition timeDefnition,
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   218
            ZoneOffset standardOffset,
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   219
            ZoneOffset offsetBefore,
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   220
            ZoneOffset offsetAfter) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   221
        this.month = month;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   222
        this.dom = (byte) dayOfMonthIndicator;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   223
        this.dow = dayOfWeek;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   224
        this.time = time;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   225
        this.timeEndOfDay = timeEndOfDay;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   226
        this.timeDefinition = timeDefnition;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   227
        this.standardOffset = standardOffset;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   228
        this.offsetBefore = offsetBefore;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   229
        this.offsetAfter = offsetAfter;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   230
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   231
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   232
    //-----------------------------------------------------------------------
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   233
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   234
     * Uses a serialization delegate.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   235
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   236
     * @return the replacing object, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   237
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   238
    private Object writeReplace() {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   239
        return new Ser(Ser.ZOTRULE, this);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   240
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   241
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   242
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   243
     * Writes the state to the stream.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   244
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   245
     * @param out  the output stream, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   246
     * @throws IOException if an error occurs
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   247
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   248
    void writeExternal(DataOutput out) throws IOException {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   249
        final int timeSecs = (timeEndOfDay ? 86400 : time.toSecondOfDay());
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   250
        final int stdOffset = standardOffset.getTotalSeconds();
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   251
        final int beforeDiff = offsetBefore.getTotalSeconds() - stdOffset;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   252
        final int afterDiff = offsetAfter.getTotalSeconds() - stdOffset;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   253
        final int timeByte = (timeSecs % 3600 == 0 ? (timeEndOfDay ? 24 : time.getHour()) : 31);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   254
        final int stdOffsetByte = (stdOffset % 900 == 0 ? stdOffset / 900 + 128 : 255);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   255
        final int beforeByte = (beforeDiff == 0 || beforeDiff == 1800 || beforeDiff == 3600 ? beforeDiff / 1800 : 3);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   256
        final int afterByte = (afterDiff == 0 || afterDiff == 1800 || afterDiff == 3600 ? afterDiff / 1800 : 3);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   257
        final int dowByte = (dow == null ? 0 : dow.getValue());
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   258
        int b = (month.getValue() << 28) +          // 4 bits
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   259
                ((dom + 32) << 22) +                // 6 bits
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   260
                (dowByte << 19) +                   // 3 bits
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   261
                (timeByte << 14) +                  // 5 bits
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   262
                (timeDefinition.ordinal() << 12) +  // 2 bits
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   263
                (stdOffsetByte << 4) +              // 8 bits
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   264
                (beforeByte << 2) +                 // 2 bits
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   265
                afterByte;                          // 2 bits
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   266
        out.writeInt(b);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   267
        if (timeByte == 31) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   268
            out.writeInt(timeSecs);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   269
        }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   270
        if (stdOffsetByte == 255) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   271
            out.writeInt(stdOffset);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   272
        }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   273
        if (beforeByte == 3) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   274
            out.writeInt(offsetBefore.getTotalSeconds());
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   275
        }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   276
        if (afterByte == 3) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   277
            out.writeInt(offsetAfter.getTotalSeconds());
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   278
        }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   279
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   280
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   281
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   282
     * Reads the state from the stream.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   283
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   284
     * @param in  the input stream, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   285
     * @return the created object, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   286
     * @throws IOException if an error occurs
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   287
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   288
    static ZoneOffsetTransitionRule readExternal(DataInput in) throws IOException {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   289
        int data = in.readInt();
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   290
        Month month = Month.of(data >>> 28);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   291
        int dom = ((data & (63 << 22)) >>> 22) - 32;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   292
        int dowByte = (data & (7 << 19)) >>> 19;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   293
        DayOfWeek dow = dowByte == 0 ? null : DayOfWeek.of(dowByte);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   294
        int timeByte = (data & (31 << 14)) >>> 14;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   295
        TimeDefinition defn = TimeDefinition.values()[(data & (3 << 12)) >>> 12];
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   296
        int stdByte = (data & (255 << 4)) >>> 4;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   297
        int beforeByte = (data & (3 << 2)) >>> 2;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   298
        int afterByte = (data & 3);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   299
        LocalTime time = (timeByte == 31 ? LocalTime.ofSecondOfDay(in.readInt()) : LocalTime.of(timeByte % 24, 0));
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   300
        ZoneOffset std = (stdByte == 255 ? ZoneOffset.ofTotalSeconds(in.readInt()) : ZoneOffset.ofTotalSeconds((stdByte - 128) * 900));
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   301
        ZoneOffset before = (beforeByte == 3 ? ZoneOffset.ofTotalSeconds(in.readInt()) : ZoneOffset.ofTotalSeconds(std.getTotalSeconds() + beforeByte * 1800));
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   302
        ZoneOffset after = (afterByte == 3 ? ZoneOffset.ofTotalSeconds(in.readInt()) : ZoneOffset.ofTotalSeconds(std.getTotalSeconds() + afterByte * 1800));
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   303
        return ZoneOffsetTransitionRule.of(month, dom, dow, time, timeByte == 24, defn, std, before, after);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   304
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   305
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   306
    //-----------------------------------------------------------------------
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   307
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   308
     * Gets the month of the transition.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   309
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   310
     * If the rule defines an exact date then the month is the month of that date.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   311
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   312
     * If the rule defines a week where the transition might occur, then the month
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   313
     * if the month of either the earliest or latest possible date of the cutover.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   314
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   315
     * @return the month of the transition, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   316
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   317
    public Month getMonth() {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   318
        return month;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   319
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   320
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   321
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   322
     * Gets the indicator of the day-of-month of the transition.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   323
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   324
     * If the rule defines an exact date then the day is the month of that date.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   325
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   326
     * If the rule defines a week where the transition might occur, then the day
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   327
     * defines either the start of the end of the transition week.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   328
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   329
     * If the value is positive, then it represents a normal day-of-month, and is the
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   330
     * earliest possible date that the transition can be.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   331
     * The date may refer to 29th February which should be treated as 1st March in non-leap years.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   332
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   333
     * If the value is negative, then it represents the number of days back from the
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   334
     * end of the month where {@code -1} is the last day of the month.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   335
     * In this case, the day identified is the latest possible date that the transition can be.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   336
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   337
     * @return the day-of-month indicator, from -28 to 31 excluding 0
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   338
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   339
    public int getDayOfMonthIndicator() {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   340
        return dom;
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
     * Gets the day-of-week of the transition.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   345
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   346
     * If the rule defines an exact date then this returns null.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   347
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   348
     * If the rule defines a week where the cutover might occur, then this method
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   349
     * returns the day-of-week that the month-day will be adjusted to.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   350
     * If the day is positive then the adjustment is later.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   351
     * If the day is negative then the adjustment is earlier.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   352
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   353
     * @return the day-of-week that the transition occurs, null if the rule defines an exact date
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   354
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   355
    public DayOfWeek getDayOfWeek() {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   356
        return dow;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   357
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   358
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   359
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   360
     * Gets the local time of day of the transition which must be checked with
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   361
     * {@link #isMidnightEndOfDay()}.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   362
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   363
     * The time is converted into an instant using the time definition.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   364
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   365
     * @return the local time of day of the transition, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   366
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   367
    public LocalTime getLocalTime() {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   368
        return time;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   369
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   370
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   371
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   372
     * Is the transition local time midnight at the end of day.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   373
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   374
     * The transition may be represented as occurring at 24:00.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   375
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   376
     * @return whether a local time of midnight is at the start or end of the day
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   377
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   378
    public boolean isMidnightEndOfDay() {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   379
        return timeEndOfDay;
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
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   383
     * Gets the time definition, specifying how to convert the time to an instant.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   384
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   385
     * The local time can be converted to an instant using the standard offset,
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   386
     * the wall offset or UTC.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   387
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   388
     * @return the time definition, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   389
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   390
    public TimeDefinition getTimeDefinition() {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   391
        return timeDefinition;
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
     * Gets the standard offset in force at the transition.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   396
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   397
     * @return the standard offset, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   398
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   399
    public ZoneOffset getStandardOffset() {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   400
        return standardOffset;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   401
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   402
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   403
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   404
     * Gets the offset before the transition.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   405
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   406
     * @return the offset before, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   407
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   408
    public ZoneOffset getOffsetBefore() {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   409
        return offsetBefore;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   410
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   411
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   412
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   413
     * Gets the offset after the transition.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   414
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   415
     * @return the offset after, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   416
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   417
    public ZoneOffset getOffsetAfter() {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   418
        return offsetAfter;
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
     * Creates a transition instance for the specified year.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   424
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   425
     * Calculations are performed using the ISO-8601 chronology.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   426
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   427
     * @param year  the year to create a transition for, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   428
     * @return the transition instance, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   429
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   430
    public ZoneOffsetTransition createTransition(int year) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   431
        LocalDate date;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   432
        if (dom < 0) {
15658
55b829ca2334 8007392: JSR 310: DateTime API Updates
sherman
parents: 15289
diff changeset
   433
            date = LocalDate.of(year, month, month.length(IsoChronology.INSTANCE.isLeapYear(year)) + 1 + dom);
15289
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   434
            if (dow != null) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   435
                date = date.with(previousOrSame(dow));
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   436
            }
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
            date = LocalDate.of(year, month, dom);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   439
            if (dow != null) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   440
                date = date.with(nextOrSame(dow));
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   441
            }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   442
        }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   443
        if (timeEndOfDay) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   444
            date = date.plusDays(1);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   445
        }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   446
        LocalDateTime localDT = LocalDateTime.of(date, time);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   447
        LocalDateTime transition = timeDefinition.createDateTime(localDT, standardOffset, offsetBefore);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   448
        return new ZoneOffsetTransition(transition, offsetBefore, offsetAfter);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   449
    }
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
     * Checks if this object equals another.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   454
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   455
     * The entire state of the object is compared.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   456
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   457
     * @param otherRule  the other object to compare to, null returns false
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   458
     * @return true if equal
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   459
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   460
    @Override
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   461
    public boolean equals(Object otherRule) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   462
        if (otherRule == this) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   463
            return true;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   464
        }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   465
        if (otherRule instanceof ZoneOffsetTransitionRule) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   466
            ZoneOffsetTransitionRule other = (ZoneOffsetTransitionRule) otherRule;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   467
            return month == other.month && dom == other.dom && dow == other.dow &&
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   468
                timeDefinition == other.timeDefinition &&
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   469
                time.equals(other.time) &&
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   470
                timeEndOfDay == other.timeEndOfDay &&
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   471
                standardOffset.equals(other.standardOffset) &&
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   472
                offsetBefore.equals(other.offsetBefore) &&
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   473
                offsetAfter.equals(other.offsetAfter);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   474
        }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   475
        return false;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   476
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   477
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   478
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   479
     * Returns a suitable hash code.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   480
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   481
     * @return the hash code
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   482
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   483
    @Override
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   484
    public int hashCode() {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   485
        int hash = ((time.toSecondOfDay() + (timeEndOfDay ? 1 : 0)) << 15) +
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   486
                (month.ordinal() << 11) + ((dom + 32) << 5) +
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   487
                ((dow == null ? 7 : dow.ordinal()) << 2) + (timeDefinition.ordinal());
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   488
        return hash ^ standardOffset.hashCode() ^
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   489
                offsetBefore.hashCode() ^ offsetAfter.hashCode();
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   490
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   491
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   492
    //-----------------------------------------------------------------------
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   493
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   494
     * Returns a string describing this object.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   495
     *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   496
     * @return a string for debugging, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   497
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   498
    @Override
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   499
    public String toString() {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   500
        StringBuilder buf = new StringBuilder();
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   501
        buf.append("TransitionRule[")
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   502
            .append(offsetBefore.compareTo(offsetAfter) > 0 ? "Gap " : "Overlap ")
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   503
            .append(offsetBefore).append(" to ").append(offsetAfter).append(", ");
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   504
        if (dow != null) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   505
            if (dom == -1) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   506
                buf.append(dow.name()).append(" on or before last day of ").append(month.name());
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   507
            } else if (dom < 0) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   508
                buf.append(dow.name()).append(" on or before last day minus ").append(-dom - 1).append(" of ").append(month.name());
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   509
            } else {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   510
                buf.append(dow.name()).append(" on or after ").append(month.name()).append(' ').append(dom);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   511
            }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   512
        } else {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   513
            buf.append(month.name()).append(' ').append(dom);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   514
        }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   515
        buf.append(" at ").append(timeEndOfDay ? "24:00" : time.toString())
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   516
            .append(" ").append(timeDefinition)
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   517
            .append(", standard offset ").append(standardOffset)
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   518
            .append(']');
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   519
        return buf.toString();
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   520
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   521
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   522
    //-----------------------------------------------------------------------
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   523
    /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   524
     * A definition of the way a local time can be converted to the actual
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   525
     * transition date-time.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   526
     * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   527
     * Time zone rules are expressed in one of three ways:
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   528
     * <p><ul>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   529
     * <li>Relative to UTC</li>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   530
     * <li>Relative to the standard offset in force</li>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   531
     * <li>Relative to the wall offset (what you would see on a clock on the wall)</li>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   532
     * </ul><p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   533
     */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   534
    public static enum TimeDefinition {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   535
        /** The local date-time is expressed in terms of the UTC offset. */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   536
        UTC,
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   537
        /** The local date-time is expressed in terms of the wall offset. */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   538
        WALL,
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   539
        /** The local date-time is expressed in terms of the standard offset. */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   540
        STANDARD;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   541
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   542
        /**
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   543
         * Converts the specified local date-time to the local date-time actually
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   544
         * seen on a wall clock.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   545
         * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   546
         * This method converts using the type of this enum.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   547
         * The output is defined relative to the 'before' offset of the transition.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   548
         * <p>
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   549
         * The UTC type uses the UTC offset.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   550
         * The STANDARD type uses the standard offset.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   551
         * The WALL type returns the input date-time.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   552
         * The result is intended for use with the wall-offset.
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   553
         *
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   554
         * @param dateTime  the local date-time, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   555
         * @param standardOffset  the standard offset, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   556
         * @param wallOffset  the wall offset, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   557
         * @return the date-time relative to the wall/before offset, not null
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   558
         */
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   559
        public LocalDateTime createDateTime(LocalDateTime dateTime, ZoneOffset standardOffset, ZoneOffset wallOffset) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   560
            switch (this) {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   561
                case UTC: {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   562
                    int difference = wallOffset.getTotalSeconds() - ZoneOffset.UTC.getTotalSeconds();
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   563
                    return dateTime.plusSeconds(difference);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   564
                }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   565
                case STANDARD: {
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   566
                    int difference = wallOffset.getTotalSeconds() - standardOffset.getTotalSeconds();
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   567
                    return dateTime.plusSeconds(difference);
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   568
                }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   569
                default:  // WALL
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   570
                    return dateTime;
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   571
            }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   572
        }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   573
    }
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   574
3ac550392e43 8003680: JSR 310 Date/Time API
sherman
parents:
diff changeset
   575
}