1 /* 2 * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 /* 27 * This file is available under and governed by the GNU General Public 28 * License version 2 only, as published by the Free Software Foundation. 29 * However, the following notice accompanied the original version of this 30 * file: 31 * 32 * Copyright (c) 2012, Stephen Colebourne & Michael Nascimento Santos 33 * 34 * All rights reserved. 35 * 36 * Redistribution and use in source and binary forms, with or without 37 * modification, are permitted provided that the following conditions are met: 38 * 39 * * Redistributions of source code must retain the above copyright notice, 40 * this list of conditions and the following disclaimer. 41 * 42 * * Redistributions in binary form must reproduce the above copyright notice, 43 * this list of conditions and the following disclaimer in the documentation 44 * and/or other materials provided with the distribution. 45 * 46 * * Neither the name of JSR-310 nor the names of its contributors 47 * may be used to endorse or promote products derived from this software 48 * without specific prior written permission. 49 * 50 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 51 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 52 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 53 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 54 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 55 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 56 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 57 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 58 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 59 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 60 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 61 */ 62 63 /** 64 * <p> 65 * Generic API for calendar systems other than the default ISO. 66 * </p> 67 * <p> 68 * The main API is based around the calendar system defined in ISO-8601. 69 * However, there are other calendar systems, and this package provides basic support for them. 70 * The alternate calendars are provided in the {@link java.time.chrono} package. 71 * </p> 72 * <p> 73 * A calendar system is defined by the {@link java.time.chrono.Chronology} interface, 74 * while a date in a calendar system is defined by the {@link java.time.chrono.ChronoLocalDate} interface. 75 * </p> 76 * <p> 77 * It is intended that applications use the main API whenever possible, including code to read and write 78 * from a persistent data store, such as a database, and to send dates and times across a network. 79 * The "chrono" classes are then used at the user interface level to deal with localized input/output. 80 * See {@link java.time.chrono.ChronoLocalDate ChronoLocalDate} 81 * for a full discussion of the issues. 82 * </p> 83 * <p> 84 * Using non-ISO calendar systems in an application introduces significant extra complexity. 85 * Ensure that the warnings and recommendations in {@code ChronoLocalDate} have been read before 86 * working with the "chrono" interfaces. 87 * </p> 88 * <p> 89 * The supported calendar systems includes: 90 * </p> 91 * <ul> 92 * <li>{@link java.time.chrono.HijrahChronology Hijrah calendar}</li> 93 * <li>{@link java.time.chrono.JapaneseChronology Japanese calendar}</li> 94 * <li>{@link java.time.chrono.MinguoChronology Minguo calendar}</li> 95 * <li>{@link java.time.chrono.ThaiBuddhistChronology Thai Buddhist calendar}</li> 96 * </ul> 97 * 98 * <h3>Example</h3> 99 * <p> 100 * This example lists todays date for all of the available calendars. 101 * </p> 102 * <pre> 103 * // Enumerate the list of available calendars and print todays date for each. 104 * Set<Chronology> chronos = Chronology.getAvailableChronologies(); 105 * for (Chronology chrono : chronos) { 106 * ChronoLocalDate date = chrono.dateNow(); 107 * System.out.printf(" %20s: %s%n", chrono.getId(), date.toString()); 108 * } 109 * </pre> 110 * 111 * <p> 112 * This example creates and uses a date in a named non-ISO calendar system. 113 * </p> 114 * <pre> 115 * // Print the Thai Buddhist date 116 * ChronoLocalDate now1 = Chronology.of("ThaiBuddhist").dateNow(); 117 * int day = now1.get(ChronoField.DAY_OF_MONTH); 118 * int dow = now1.get(ChronoField.DAY_OF_WEEK); 119 * int month = now1.get(ChronoField.MONTH_OF_YEAR); 120 * int year = now1.get(ChronoField.YEAR); 121 * System.out.printf(" Today is %s %s %d-%s-%d%n", now1.getChronology().getId(), 122 * dow, day, month, year); 123 * // Print today's date and the last day of the year for the Thai Buddhist Calendar. 124 * ChronoLocalDate first = now1 125 * .with(ChronoField.DAY_OF_MONTH, 1) 126 * .with(ChronoField.MONTH_OF_YEAR, 1); 127 * ChronoLocalDate last = first 128 * .plus(1, ChronoUnit.YEARS) 129 * .minus(1, ChronoUnit.DAYS); 130 * System.out.printf(" %s: 1st of year: %s; end of year: %s%n", last.getChronology().getId(), 131 * first, last); 132 * </pre> 133 * 134 * <p> 135 * This example creates and uses a date in a specific ThaiBuddhist calendar system. 136 * </p> 137 * <pre> 138 * // Print the Thai Buddhist date 139 * ThaiBuddhistDate now1 = ThaiBuddhistDate.now(); 140 * int day = now1.get(ChronoField.DAY_OF_MONTH); 141 * int dow = now1.get(ChronoField.DAY_OF_WEEK); 142 * int month = now1.get(ChronoField.MONTH_OF_YEAR); 143 * int year = now1.get(ChronoField.YEAR); 144 * System.out.printf(" Today is %s %s %d-%s-%d%n", now1.getChronology().getId(), 145 * dow, day, month, year); 146 * 147 * // Print today's date and the last day of the year for the Thai Buddhist Calendar. 148 * ThaiBuddhistDate first = now1 149 * .with(ChronoField.DAY_OF_MONTH, 1) 150 * .with(ChronoField.MONTH_OF_YEAR, 1); 151 * ThaiBuddhistDate last = first 152 * .plus(1, ChronoUnit.YEARS) 153 * .minus(1, ChronoUnit.DAYS); 154 * System.out.printf(" %s: 1st of year: %s; end of year: %s%n", last.getChronology().getId(), 155 * first, last); 156 * </pre> 157 * 158 * <h3>Package specification</h3> 159 * <p> 160 * Unless otherwise noted, passing a null argument to a constructor or method in any class or interface 161 * in this package will cause a {@link java.lang.NullPointerException NullPointerException} to be thrown. 162 * The Javadoc "@param" definition is used to summarise the null-behavior. 163 * The "@throws {@link java.lang.NullPointerException}" is not explicitly documented in each method. 164 * </p> 165 * <p> 166 * All calculations should check for numeric overflow and throw either an {@link java.lang.ArithmeticException} 167 * or a {@link java.time.DateTimeException}. 168 * </p> 169 * @since JDK1.8 170 */ 171 package java.time.chrono; 172