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