CalendarSystem.java revision 2c87ad3a45cecf9e344487cad1abfdebe79f2c7c
151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/* 22c87ad3a45cecf9e344487cad1abfdebe79f2c7cNarayan Kamath * Copyright (C) 2014 The Android Open Source Project 351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Copyright (c) 2000, 2005, Oracle and/or its affiliates. All rights reserved. 451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is free software; you can redistribute it and/or modify it 751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * under the terms of the GNU General Public License version 2 only, as 851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * published by the Free Software Foundation. Oracle designates this 951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * particular file as subject to the "Classpath" exception as provided 1051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * by Oracle in the LICENSE file that accompanied this code. 1151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is distributed in the hope that it will be useful, but WITHOUT 1351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * version 2 for more details (a copy is included in the LICENSE file that 1651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * accompanied this code). 1751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * You should have received a copy of the GNU General Public License version 1951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2 along with this work; if not, write to the Free Software Foundation, 2051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 2151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 2351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or visit www.oracle.com if you need additional information or have any 2451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * questions. 2551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 2651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipackage sun.util.calendar; 2851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.lang.reflect.Field; 3051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.HashMap; 3151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.Locale; 3251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.Map; 3351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.MissingResourceException; 3451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.ResourceBundle; 3551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.Set; 3651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.TimeZone; 3751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.concurrent.ConcurrentHashMap; 3851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.concurrent.ConcurrentMap; 3951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 4051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/** 4151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>CalendarSystem</code> is an abstract class that defines the 4251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * programming interface to deal with calendar date and time. 4351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 4451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p><code>CalendarSystem</code> instances are singletons. For 4551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * example, there exists only one Gregorian calendar instance in the 4651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Java runtime environment. A singleton instance can be obtained 4751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * calling one of the static factory methods. 4851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 4951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <h4>CalendarDate</h4> 5051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 5151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p>For the methods in a <code>CalendarSystem</code> that manipulate 5251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * a <code>CalendarDate</code>, <code>CalendarDate</code>s that have 5351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * been created by the <code>CalendarSystem</code> must be 5451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * specified. Otherwise, the methods throw an exception. This is 5551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * because, for example, a Chinese calendar date can't be understood 5651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * by the Hebrew calendar system. 5751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 5851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <h4>Calendar names</h4> 5951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 6051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Each calendar system has a unique name to be identified. The Java 6151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * runtime in this release supports the following calendar systems. 6251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 6351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <pre> 6451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Name Calendar System 6551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * --------------------------------------- 6651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * gregorian Gregorian Calendar 6751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * julian Julian Calendar 6851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * japanese Japanese Imperial Calendar 6951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </pre> 7051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 7151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see CalendarDate 7251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @author Masayoshi Okutsu 7351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.5 7451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 7551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 7651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipublic abstract class CalendarSystem { 7751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 7851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /////////////////////// Calendar Factory Methods ///////////////////////// 7951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 80f9f13fe9eeabbf65b0d6bc2dd5704ee407c608eeNarayan Kamath // Map of calendar names and calendar classes; 81f9f13fe9eeabbf65b0d6bc2dd5704ee407c608eeNarayan Kamath private static final Map<String, Class<?>> names; 82f9f13fe9eeabbf65b0d6bc2dd5704ee407c608eeNarayan Kamath 83f9f13fe9eeabbf65b0d6bc2dd5704ee407c608eeNarayan Kamath // Android changed : Don't use reflection for Class.forName every time. 84f9f13fe9eeabbf65b0d6bc2dd5704ee407c608eeNarayan Kamath 85f9f13fe9eeabbf65b0d6bc2dd5704ee407c608eeNarayan Kamath static { 86f9f13fe9eeabbf65b0d6bc2dd5704ee407c608eeNarayan Kamath names = new HashMap<>(); 87f9f13fe9eeabbf65b0d6bc2dd5704ee407c608eeNarayan Kamath names.put("gregorian", Gregorian.class); 88f9f13fe9eeabbf65b0d6bc2dd5704ee407c608eeNarayan Kamath names.put("japanese", LocalGregorianCalendar.class); 89f9f13fe9eeabbf65b0d6bc2dd5704ee407c608eeNarayan Kamath names.put("julian", JulianCalendar.class); 90f9f13fe9eeabbf65b0d6bc2dd5704ee407c608eeNarayan Kamath // names.put("hebrew", "HebrewCalendar"); 91f9f13fe9eeabbf65b0d6bc2dd5704ee407c608eeNarayan Kamath // names.put("iso8601", "ISOCalendar"); 92f9f13fe9eeabbf65b0d6bc2dd5704ee407c608eeNarayan Kamath // names.put("taiwanese", "LocalGregorianCalendar"); 93f9f13fe9eeabbf65b0d6bc2dd5704ee407c608eeNarayan Kamath // names.put("thaibuddhist", "LocalGregorianCalendar"); 94f9f13fe9eeabbf65b0d6bc2dd5704ee407c608eeNarayan Kamath } 9551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 9651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Map of calendar names and CalendarSystem instances 97f9f13fe9eeabbf65b0d6bc2dd5704ee407c608eeNarayan Kamath private static final ConcurrentMap<String, CalendarSystem> calendars = 98f9f13fe9eeabbf65b0d6bc2dd5704ee407c608eeNarayan Kamath new ConcurrentHashMap<>(); 9951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 10051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private final static Gregorian GREGORIAN_INSTANCE = new Gregorian(); 10151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 10251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 10351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns the singleton instance of the <code>Gregorian</code> 10451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * calendar system. 10551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 10651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the <code>Gregorian</code> instance 10751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 10851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static Gregorian getGregorianCalendar() { 10951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return GREGORIAN_INSTANCE; 11051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 11151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 11251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 11351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns a <code>CalendarSystem</code> specified by the calendar 11451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * name. The calendar name has to be one of the supported calendar 11551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * names. 11651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 11751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param calendarName the calendar name 11851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the <code>CalendarSystem</code> specified by 11951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>calendarName</code>, or null if there is no 12051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>CalendarSystem</code> associated with the given calendar name. 12151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 12251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static CalendarSystem forName(String calendarName) { 12351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if ("gregorian".equals(calendarName)) { 12451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return GREGORIAN_INSTANCE; 12551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 12651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 12751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski CalendarSystem cal = calendars.get(calendarName); 12851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (cal != null) { 12951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return cal; 13051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 13151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 132f9f13fe9eeabbf65b0d6bc2dd5704ee407c608eeNarayan Kamath Class<?> calendarClass = names.get(calendarName); 133f9f13fe9eeabbf65b0d6bc2dd5704ee407c608eeNarayan Kamath if (calendarClass == null) { 13451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return null; // Unknown calendar name 13551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 13651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 137f9f13fe9eeabbf65b0d6bc2dd5704ee407c608eeNarayan Kamath if (calendarClass.isAssignableFrom(LocalGregorianCalendar.class)) { 13851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Create the specific kind of local Gregorian calendar system 13951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski cal = LocalGregorianCalendar.getLocalGregorianCalendar(calendarName); 14051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 14151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try { 142f9f13fe9eeabbf65b0d6bc2dd5704ee407c608eeNarayan Kamath cal = (CalendarSystem) calendarClass.newInstance(); 14351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } catch (Exception e) { 14451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new RuntimeException("internal error", e); 14551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 14651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 14751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (cal == null) { 14851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return null; 14951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 150f9f13fe9eeabbf65b0d6bc2dd5704ee407c608eeNarayan Kamath 15151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski CalendarSystem cs = calendars.putIfAbsent(calendarName, cal); 15251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return (cs == null) ? cal : cs; 15351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 15451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 15551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski //////////////////////////////// Calendar API ////////////////////////////////// 15651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 15751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 15851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns the name of this calendar system. 15951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 16051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public abstract String getName(); 16151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 16251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public abstract CalendarDate getCalendarDate(); 16351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 16451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 16551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Calculates calendar fields from the specified number of 16651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * milliseconds since the Epoch, January 1, 1970 00:00:00 UTC 16751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * (Gregorian). This method doesn't check overflow or underflow 16851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * when adjusting the millisecond value (representing UTC) with 16951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the time zone offsets (i.e., the GMT offset and amount of 17051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * daylight saving). 17151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 17251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param millis the offset value in milliseconds from January 1, 17351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1970 00:00:00 UTC (Gregorian). 17451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return a <code>CalendarDate</code> instance that contains the 17551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * calculated calendar field values. 17651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 17751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public abstract CalendarDate getCalendarDate(long millis); 17851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 17951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public abstract CalendarDate getCalendarDate(long millis, CalendarDate date); 18051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 18151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public abstract CalendarDate getCalendarDate(long millis, TimeZone zone); 18251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 18351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 18451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Constructs a <code>CalendarDate</code> that is specific to this 18551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * calendar system. All calendar fields have their initial 18651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * values. The {@link TimeZone#getDefault() default time zone} is 18751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * set to the instance. 18851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 18951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return a <code>CalendarDate</code> instance that contains the initial 19051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * calendar field values. 19151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 19251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public abstract CalendarDate newCalendarDate(); 19351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 19451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public abstract CalendarDate newCalendarDate(TimeZone zone); 19551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 19651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 19751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns the number of milliseconds since the Epoch, January 1, 19851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1970 00:00:00 UTC (Gregorian), represented by the specified 19951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>CalendarDate</code>. 20051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 20151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param date the <code>CalendarDate</code> from which the time 20251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * value is calculated 20351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the number of milliseconds since the Epoch. 20451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 20551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public abstract long getTime(CalendarDate date); 20651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 20751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 20851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns the length in days of the specified year by 20951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>date</code>. This method does not perform the 21051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * normalization with the specified <code>CalendarDate</code>. The 21151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>CalendarDate</code> must be normalized to get a correct 21251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * value. 21351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 21451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public abstract int getYearLength(CalendarDate date); 21551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 21651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 21751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns the number of months of the specified year. This method 21851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * does not perform the normalization with the specified 21951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>CalendarDate</code>. The <code>CalendarDate</code> must 22051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * be normalized to get a correct value. 22151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 22251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public abstract int getYearLengthInMonths(CalendarDate date); 22351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 22451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 22551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns the length in days of the month specified by the calendar 22651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * date. This method does not perform the normalization with the 22751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * specified calendar date. The <code>CalendarDate</code> must 22851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * be normalized to get a correct value. 22951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 23051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param date the date from which the month value is obtained 23151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the number of days in the month 23251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception IllegalArgumentException if the specified calendar date 23351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * doesn't have a valid month value in this calendar system. 23451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 23551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public abstract int getMonthLength(CalendarDate date); // no setter 23651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 23751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 23851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns the length in days of a week in this calendar 23951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * system. If this calendar system has multiple radix weeks, this 24051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * method returns only one of them. 24151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 24251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public abstract int getWeekLength(); 24351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 24451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 24551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns the <code>Era</code> designated by the era name that 24651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * has to be known to this calendar system. If no Era is 24751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * applicable to this calendar system, null is returned. 24851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 24951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param eraName the name of the era 25051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the <code>Era</code> designated by 25151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>eraName</code>, or <code>null</code> if no Era is 25251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * applicable to this calendar system or the specified era name is 25351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * not known to this calendar system. 25451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 25551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public abstract Era getEra(String eraName); 25651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 25751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 25851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns valid <code>Era</code>s of this calendar system. The 25951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * return value is sorted in the descendant order. (i.e., the first 26051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * element of the returned array is the oldest era.) If no era is 26151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * applicable to this calendar system, <code>null</code> is returned. 26251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 26351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return an array of valid <code>Era</code>s, or 26451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>null</code> if no era is applicable to this calendar 26551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * system. 26651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 26751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public abstract Era[] getEras(); 26851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 26951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 27051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws IllegalArgumentException if the specified era name is 27151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * unknown to this calendar system. 27251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see Era 27351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 27451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public abstract void setEra(CalendarDate date, String eraName); 27551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 27651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 27751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns a <code>CalendarDate</code> of the n-th day of week 27851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * which is on, after or before the specified date. For example, the 27951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * first Sunday in April 2002 (Gregorian) can be obtained as 28051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * below: 28151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 28251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <pre><code> 28351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Gregorian cal = CalendarSystem.getGregorianCalendar(); 28451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * CalendarDate date = cal.newCalendarDate(); 28551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * date.setDate(2004, cal.APRIL, 1); 28651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * CalendarDate firstSun = cal.getNthDayOfWeek(1, cal.SUNDAY, date); 28751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * // firstSun represents April 4, 2004. 28851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </code></pre> 28951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 29051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This method returns a new <code>CalendarDate</code> instance 29151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * and doesn't modify the original date. 29251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 29351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param nth specifies the n-th one. A positive number specifies 29451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <em>on or after</em> the <code>date</code>. A non-positive number 29551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * specifies <em>on or before</em> the <code>date</code>. 29651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param dayOfWeek the day of week 29751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param date the date 29851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the date of the nth <code>dayOfWeek</code> after 29951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or before the specified <code>CalendarDate</code> 30051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 30151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public abstract CalendarDate getNthDayOfWeek(int nth, int dayOfWeek, 30251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski CalendarDate date); 30351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 30451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public abstract CalendarDate setTimeOfDay(CalendarDate date, int timeOfDay); 30551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 30651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 30751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Checks whether the calendar fields specified by <code>date</code> 30851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * represents a valid date and time in this calendar system. If the 30951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * given date is valid, <code>date</code> is marked as <em>normalized</em>. 31051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 31151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param date the <code>CalendarDate</code> to be validated 31251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return <code>true</code> if all the calendar fields are consistent, 31351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * otherwise, <code>false</code> is returned. 31451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception NullPointerException if the specified 31551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>date</code> is <code>null</code> 31651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 31751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public abstract boolean validate(CalendarDate date); 31851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 31951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 32051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Normalizes calendar fields in the specified 32151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>date</code>. Also all {@link CalendarDate#FIELD_UNDEFINED 32251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * undefined} fields are set to correct values. The actual 32351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * normalization process is calendar system dependent. 32451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 32551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param date the calendar date to be validated 32651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return <code>true</code> if all fields have been normalized; 32751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>false</code> otherwise. 32851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception NullPointerException if the specified 32951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>date</code> is <code>null</code> 33051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 33151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public abstract boolean normalize(CalendarDate date); 33251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski} 333