1c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer/* 2c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved. 3c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * 5c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * This code is free software; you can redistribute it and/or modify it 6c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * under the terms of the GNU General Public License version 2 only, as 7c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * published by the Free Software Foundation. Oracle designates this 8c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * particular file as subject to the "Classpath" exception as provided 9c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * by Oracle in the LICENSE file that accompanied this code. 10c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * 11c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * This code is distributed in the hope that it will be useful, but WITHOUT 12c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * version 2 for more details (a copy is included in the LICENSE file that 15c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * accompanied this code). 16c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * 17c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * You should have received a copy of the GNU General Public License version 18c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * 2 along with this work; if not, write to the Free Software Foundation, 19c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * 21c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * or visit www.oracle.com if you need additional information or have any 23c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * questions. 24c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer */ 25c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer 26c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer/* 27c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * Copyright (c) 2012, Stephen Colebourne & Michael Nascimento Santos 28c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * 29c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * All rights reserved. 30c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * 31c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * Redistribution and use in source and binary forms, with or without 32c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * modification, are permitted provided that the following conditions are met: 33c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * 34c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * * Redistributions of source code must retain the above copyright notice, 35c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * this list of conditions and the following disclaimer. 36c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * 37c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * * Redistributions in binary form must reproduce the above copyright notice, 38c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * this list of conditions and the following disclaimer in the documentation 39c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * and/or other materials provided with the distribution. 40c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * 41c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * * Neither the name of JSR-310 nor the names of its contributors 42c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * may be used to endorse or promote products derived from this software 43c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * without specific prior written permission. 44c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * 45c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 46c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 47c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 48c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 49c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 50c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 51c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 52c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 53c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 54c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 55c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 56c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer */ 57c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerpackage java.time.chrono; 58c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer 59c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport static java.time.chrono.MinguoChronology.YEARS_DIFFERENCE; 60c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport static java.time.temporal.ChronoField.DAY_OF_MONTH; 61c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport static java.time.temporal.ChronoField.MONTH_OF_YEAR; 62c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport static java.time.temporal.ChronoField.YEAR; 63c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer 64c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport java.io.DataInput; 65c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport java.io.DataOutput; 66c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport java.io.IOException; 67c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport java.io.InvalidObjectException; 68c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport java.io.ObjectInputStream; 69c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport java.io.Serializable; 70c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport java.time.Clock; 71c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport java.time.DateTimeException; 72c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport java.time.LocalDate; 73c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport java.time.LocalTime; 74c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport java.time.Period; 75c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport java.time.ZoneId; 76c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport java.time.temporal.ChronoField; 77c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport java.time.temporal.TemporalAccessor; 78c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport java.time.temporal.TemporalAdjuster; 79c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport java.time.temporal.TemporalAmount; 80c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport java.time.temporal.TemporalField; 81c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport java.time.temporal.TemporalQuery; 82c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport java.time.temporal.TemporalUnit; 83c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport java.time.temporal.UnsupportedTemporalTypeException; 84c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport java.time.temporal.ValueRange; 85c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerimport java.util.Objects; 86c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer 87fa84287e36805c14f8177d449207b9701faacd10Przemyslaw Szczepaniak// Android-changed: removed ValueBased paragraph. 88c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer/** 89c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * A date in the Minguo calendar system. 90c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * <p> 91c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * This date operates using the {@linkplain MinguoChronology Minguo calendar}. 92c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * This calendar system is primarily used in the Republic of China, often known as Taiwan. 93c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * Dates are aligned such that {@code 0001-01-01 (Minguo)} is {@code 1912-01-01 (ISO)}. 94c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * 95c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * @implSpec 96c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * This class is immutable and thread-safe. 97c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * 98c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * @since 1.8 99c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer */ 100c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauerpublic final class MinguoDate 101c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer extends ChronoLocalDateImpl<MinguoDate> 102c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer implements ChronoLocalDate, Serializable { 103c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer 104c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer /** 105c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * Serialization version. 106c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer */ 107c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer private static final long serialVersionUID = 1300372329181994526L; 108c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer 109c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer /** 110c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * The underlying date. 111c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer */ 112c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer private final transient LocalDate isoDate; 113c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer 114c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer //----------------------------------------------------------------------- 115c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer /** 116c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * Obtains the current {@code MinguoDate} from the system clock in the default time-zone. 117c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * <p> 118c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * This will query the {@link Clock#systemDefaultZone() system clock} in the default 119c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * time-zone to obtain the current date. 120c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * <p> 121c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * Using this method will prevent the ability to use an alternate clock for testing 122c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * because the clock is hard-coded. 123c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * 124c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * @return the current date using the system clock and default time-zone, not null 125c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer */ 126c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer public static MinguoDate now() { 127c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer return now(Clock.systemDefaultZone()); 128c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer } 129c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer 130c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer /** 131c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * Obtains the current {@code MinguoDate} from the system clock in the specified time-zone. 132c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * <p> 133c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * This will query the {@link Clock#system(ZoneId) system clock} to obtain the current date. 134c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * Specifying the time-zone avoids dependence on the default time-zone. 135c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * <p> 136c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * Using this method will prevent the ability to use an alternate clock for testing 137c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * because the clock is hard-coded. 138c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * 139c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * @param zone the zone ID to use, not null 140c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * @return the current date using the system clock, not null 141c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer */ 142c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer public static MinguoDate now(ZoneId zone) { 143c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer return now(Clock.system(zone)); 144c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer } 145c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer 146c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer /** 147c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * Obtains the current {@code MinguoDate} from the specified clock. 148c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * <p> 149c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * This will query the specified clock to obtain the current date - today. 150c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * Using this method allows the use of an alternate clock for testing. 151c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * The alternate clock may be introduced using {@linkplain Clock dependency injection}. 152c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * 153c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * @param clock the clock to use, not null 154c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * @return the current date, not null 155c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * @throws DateTimeException if the current date cannot be obtained 156c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer */ 157c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer public static MinguoDate now(Clock clock) { 158c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer return new MinguoDate(LocalDate.now(clock)); 159c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer } 160c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer 161c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer /** 162c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * Obtains a {@code MinguoDate} representing a date in the Minguo calendar 163c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * system from the proleptic-year, month-of-year and day-of-month fields. 164c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * <p> 165c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * This returns a {@code MinguoDate} with the specified fields. 166c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * The day must be valid for the year and month, otherwise an exception will be thrown. 167c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * 168c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * @param prolepticYear the Minguo proleptic-year 169c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * @param month the Minguo month-of-year, from 1 to 12 170c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * @param dayOfMonth the Minguo day-of-month, from 1 to 31 171c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * @return the date in Minguo calendar system, not null 172c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * @throws DateTimeException if the value of any field is out of range, 173c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * or if the day-of-month is invalid for the month-year 174c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer */ 175c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer public static MinguoDate of(int prolepticYear, int month, int dayOfMonth) { 176c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer return new MinguoDate(LocalDate.of(prolepticYear + YEARS_DIFFERENCE, month, dayOfMonth)); 177c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer } 178c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer 179c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer /** 180c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * Obtains a {@code MinguoDate} from a temporal object. 181c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * <p> 182c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * This obtains a date in the Minguo calendar system based on the specified temporal. 183c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * A {@code TemporalAccessor} represents an arbitrary set of date and time information, 184c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * which this factory converts to an instance of {@code MinguoDate}. 185c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * <p> 186c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * The conversion typically uses the {@link ChronoField#EPOCH_DAY EPOCH_DAY} 187c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * field, which is standardized across calendar systems. 188c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * <p> 189c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * This method matches the signature of the functional interface {@link TemporalQuery} 190c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * allowing it to be used as a query via method reference, {@code MinguoDate::from}. 191c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * 192c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * @param temporal the temporal object to convert, not null 193c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * @return the date in Minguo calendar system, not null 194c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * @throws DateTimeException if unable to convert to a {@code MinguoDate} 195c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer */ 196c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer public static MinguoDate from(TemporalAccessor temporal) { 197c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer return MinguoChronology.INSTANCE.date(temporal); 198c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer } 199c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer 200c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer //----------------------------------------------------------------------- 201c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer /** 202c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * Creates an instance from an ISO date. 203c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * 204c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * @param isoDate the standard local date, validated not null 205c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer */ 206c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer MinguoDate(LocalDate isoDate) { 207c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer Objects.requireNonNull(isoDate, "isoDate"); 208c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer this.isoDate = isoDate; 209c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer } 210c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer 211c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer //----------------------------------------------------------------------- 212c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer /** 213c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * Gets the chronology of this date, which is the Minguo calendar system. 214c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * <p> 215c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * The {@code Chronology} represents the calendar system in use. 216c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * The era and other fields in {@link ChronoField} are defined by the chronology. 217c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * 218c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * @return the Minguo chronology, not null 219c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer */ 220c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer @Override 221c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer public MinguoChronology getChronology() { 222c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer return MinguoChronology.INSTANCE; 223c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer } 224c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer 225c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer /** 226c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * Gets the era applicable at this date. 227c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * <p> 228c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * The Minguo calendar system has two eras, 'ROC' and 'BEFORE_ROC', 229c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * defined by {@link MinguoEra}. 230c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * 231c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * @return the era applicable at this date, not null 232c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer */ 233c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer @Override 234c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer public MinguoEra getEra() { 235c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer return (getProlepticYear() >= 1 ? MinguoEra.ROC : MinguoEra.BEFORE_ROC); 236c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer } 237c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer 238c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer /** 239c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * Returns the length of the month represented by this date. 240c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * <p> 241c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * This returns the length of the month in days. 242c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * Month lengths match those of the ISO calendar system. 243c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * 244c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * @return the length of the month in days 245c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer */ 246c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer @Override 247c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer public int lengthOfMonth() { 248c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer return isoDate.lengthOfMonth(); 249c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer } 250c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer 251c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer //----------------------------------------------------------------------- 252c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer @Override 253c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer public ValueRange range(TemporalField field) { 254c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer if (field instanceof ChronoField) { 255c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer if (isSupported(field)) { 256c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer ChronoField f = (ChronoField) field; 257c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer switch (f) { 258c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer case DAY_OF_MONTH: 259c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer case DAY_OF_YEAR: 260c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer case ALIGNED_WEEK_OF_MONTH: 261c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer return isoDate.range(field); 262c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer case YEAR_OF_ERA: { 263c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer ValueRange range = YEAR.range(); 264c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer long max = (getProlepticYear() <= 0 ? -range.getMinimum() + 1 + YEARS_DIFFERENCE : range.getMaximum() - YEARS_DIFFERENCE); 265c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer return ValueRange.of(1, max); 266c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer } 267c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer } 268c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer return getChronology().range(f); 269c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer } 270c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer throw new UnsupportedTemporalTypeException("Unsupported field: " + field); 271c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer } 272c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer return field.rangeRefinedBy(this); 273c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer } 274c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer 275c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer @Override 276c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer public long getLong(TemporalField field) { 277c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer if (field instanceof ChronoField) { 278c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer switch ((ChronoField) field) { 279c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer case PROLEPTIC_MONTH: 280c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer return getProlepticMonth(); 281c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer case YEAR_OF_ERA: { 282c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer int prolepticYear = getProlepticYear(); 283c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer return (prolepticYear >= 1 ? prolepticYear : 1 - prolepticYear); 284c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer } 285c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer case YEAR: 286c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer return getProlepticYear(); 287c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer case ERA: 288c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer return (getProlepticYear() >= 1 ? 1 : 0); 289c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer } 290c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer return isoDate.getLong(field); 291c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer } 292c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer return field.getFrom(this); 293c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer } 294c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer 295c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer private long getProlepticMonth() { 296c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer return getProlepticYear() * 12L + isoDate.getMonthValue() - 1; 297c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer } 298c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer 299c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer private int getProlepticYear() { 300c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer return isoDate.getYear() - YEARS_DIFFERENCE; 301c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer } 302c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer 303c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer //----------------------------------------------------------------------- 304c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer @Override 305c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer public MinguoDate with(TemporalField field, long newValue) { 306c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer if (field instanceof ChronoField) { 307c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer ChronoField f = (ChronoField) field; 308c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer if (getLong(f) == newValue) { 309c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer return this; 310c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer } 311c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer switch (f) { 312c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer case PROLEPTIC_MONTH: 313c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer getChronology().range(f).checkValidValue(newValue, f); 314c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer return plusMonths(newValue - getProlepticMonth()); 315c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer case YEAR_OF_ERA: 316c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer case YEAR: 317c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer case ERA: { 318c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer int nvalue = getChronology().range(f).checkValidIntValue(newValue, f); 319c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer switch (f) { 320c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer case YEAR_OF_ERA: 321c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer return with(isoDate.withYear(getProlepticYear() >= 1 ? nvalue + YEARS_DIFFERENCE : (1 - nvalue) + YEARS_DIFFERENCE)); 322c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer case YEAR: 323c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer return with(isoDate.withYear(nvalue + YEARS_DIFFERENCE)); 324c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer case ERA: 325c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer return with(isoDate.withYear((1 - getProlepticYear()) + YEARS_DIFFERENCE)); 326c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer } 327c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer } 328c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer } 329c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer return with(isoDate.with(field, newValue)); 330c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer } 331c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer return super.with(field, newValue); 332c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer } 333c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer 334c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer /** 335c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * {@inheritDoc} 336c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * @throws DateTimeException {@inheritDoc} 337c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * @throws ArithmeticException {@inheritDoc} 338c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer */ 339c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer @Override 340c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer public MinguoDate with(TemporalAdjuster adjuster) { 341c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer return super.with(adjuster); 342c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer } 343c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer 344c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer /** 345c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * {@inheritDoc} 346c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * @throws DateTimeException {@inheritDoc} 347c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * @throws ArithmeticException {@inheritDoc} 348c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer */ 349c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer @Override 350c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer public MinguoDate plus(TemporalAmount amount) { 351c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer return super.plus(amount); 352c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer } 353c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer 354c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer /** 355c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * {@inheritDoc} 356c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * @throws DateTimeException {@inheritDoc} 357c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * @throws ArithmeticException {@inheritDoc} 358c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer */ 359c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer @Override 360c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer public MinguoDate minus(TemporalAmount amount) { 361c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer return super.minus(amount); 362c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer } 363c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer 364c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer //----------------------------------------------------------------------- 365c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer @Override 366c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer MinguoDate plusYears(long years) { 367c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer return with(isoDate.plusYears(years)); 368c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer } 369c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer 370c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer @Override 371c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer MinguoDate plusMonths(long months) { 372c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer return with(isoDate.plusMonths(months)); 373c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer } 374c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer 375c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer @Override 376c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer MinguoDate plusWeeks(long weeksToAdd) { 377c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer return super.plusWeeks(weeksToAdd); 378c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer } 379c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer 380c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer @Override 381c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer MinguoDate plusDays(long days) { 382c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer return with(isoDate.plusDays(days)); 383c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer } 384c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer 385c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer @Override 386c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer public MinguoDate plus(long amountToAdd, TemporalUnit unit) { 387c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer return super.plus(amountToAdd, unit); 388c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer } 389c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer 390c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer @Override 391c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer public MinguoDate minus(long amountToAdd, TemporalUnit unit) { 392c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer return super.minus(amountToAdd, unit); 393c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer } 394c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer 395c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer @Override 396c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer MinguoDate minusYears(long yearsToSubtract) { 397c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer return super.minusYears(yearsToSubtract); 398c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer } 399c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer 400c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer @Override 401c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer MinguoDate minusMonths(long monthsToSubtract) { 402c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer return super.minusMonths(monthsToSubtract); 403c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer } 404c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer 405c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer @Override 406c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer MinguoDate minusWeeks(long weeksToSubtract) { 407c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer return super.minusWeeks(weeksToSubtract); 408c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer } 409c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer 410c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer @Override 411c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer MinguoDate minusDays(long daysToSubtract) { 412c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer return super.minusDays(daysToSubtract); 413c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer } 414c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer 415c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer private MinguoDate with(LocalDate newDate) { 416c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer return (newDate.equals(isoDate) ? this : new MinguoDate(newDate)); 417c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer } 418c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer 419c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer @Override // for javadoc and covariant return type 420c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer @SuppressWarnings("unchecked") 421c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer public final ChronoLocalDateTime<MinguoDate> atTime(LocalTime localTime) { 422c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer return (ChronoLocalDateTime<MinguoDate>)super.atTime(localTime); 423c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer } 424c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer 425c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer @Override 426c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer public ChronoPeriod until(ChronoLocalDate endDate) { 427c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer Period period = isoDate.until(endDate); 428c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer return getChronology().period(period.getYears(), period.getMonths(), period.getDays()); 429c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer } 430c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer 431c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer @Override // override for performance 432c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer public long toEpochDay() { 433c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer return isoDate.toEpochDay(); 434c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer } 435c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer 436c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer //------------------------------------------------------------------------- 437c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer /** 438c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * Compares this date to another date, including the chronology. 439c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * <p> 440c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * Compares this {@code MinguoDate} with another ensuring that the date is the same. 441c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * <p> 442c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * Only objects of type {@code MinguoDate} are compared, other types return false. 443c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * To compare the dates of two {@code TemporalAccessor} instances, including dates 444c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * in two different chronologies, use {@link ChronoField#EPOCH_DAY} as a comparator. 445c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * 446c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * @param obj the object to check, null returns false 447c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * @return true if this is equal to the other date 448c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer */ 449c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer @Override // override for performance 450c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer public boolean equals(Object obj) { 451c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer if (this == obj) { 452c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer return true; 453c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer } 454c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer if (obj instanceof MinguoDate) { 455c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer MinguoDate otherDate = (MinguoDate) obj; 456c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer return this.isoDate.equals(otherDate.isoDate); 457c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer } 458c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer return false; 459c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer } 460c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer 461c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer /** 462c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * A hash code for this date. 463c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * 464c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * @return a suitable hash code based only on the Chronology and the date 465c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer */ 466c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer @Override // override for performance 467c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer public int hashCode() { 468c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer return getChronology().getId().hashCode() ^ isoDate.hashCode(); 469c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer } 470c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer 471c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer //----------------------------------------------------------------------- 472c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer /** 473c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * Defend against malicious streams. 474c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * 475c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * @param s the stream to read 476c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * @throws InvalidObjectException always 477c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer */ 478c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer private void readObject(ObjectInputStream s) throws InvalidObjectException { 479c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer throw new InvalidObjectException("Deserialization via serialization delegate"); 480c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer } 481c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer 482c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer /** 483c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * Writes the object using a 484c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * <a href="../../../serialized-form.html#java.time.chrono.Ser">dedicated serialized form</a>. 485c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * @serialData 486c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * <pre> 487c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * out.writeByte(8); // identifies a MinguoDate 488c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * out.writeInt(get(YEAR)); 489c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * out.writeByte(get(MONTH_OF_YEAR)); 490c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * out.writeByte(get(DAY_OF_MONTH)); 491c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * </pre> 492c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * 493c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer * @return the instance of {@code Ser}, not null 494c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer */ 495c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer private Object writeReplace() { 496c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer return new Ser(Ser.MINGUO_DATE_TYPE, this); 497c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer } 498c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer 499c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer void writeExternal(DataOutput out) throws IOException { 500c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer // MinguoChronology is implicit in the MINGUO_DATE_TYPE 501c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer out.writeInt(get(YEAR)); 502c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer out.writeByte(get(MONTH_OF_YEAR)); 503c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer out.writeByte(get(DAY_OF_MONTH)); 504c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer } 505c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer 506c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer static MinguoDate readExternal(DataInput in) throws IOException { 507c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer int year = in.readInt(); 508c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer int month = in.readByte(); 509c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer int dayOfMonth = in.readByte(); 510c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer return MinguoChronology.INSTANCE.date(year, month, dayOfMonth); 511c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer } 512c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer 513c9dd3385ea6f927052783f42fb1282fb093e636eJoachim Sauer} 514