12d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert// © 2016 and later: Unicode, Inc. and others.
22d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html#License
37935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/*
47935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *******************************************************************************
57935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Copyright (C) 1996-2014, International Business Machines Corporation and    *
67935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * others. All Rights Reserved.                                                *
77935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *******************************************************************************
87935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */
97935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpackage com.ibm.icu.util;
117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Date;
137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Locale;
147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.ULocale.Category;
167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/**
187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * <code>PersianCalendar</code> is a subclass of <code>Calendar</code> that
197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * that implements the Persian calendar.  It is used as the main civil
207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * calendar in Iran and Afghanistan, and by Iranians and Afghans worldwide.
217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * <p>
227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * The Persian calendar is solar, and is similar to the Gregorian calendar
237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * in various ways, except its leap year rule, which is determined
247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * astronomically.  The Persian year starts around the March equinox.
257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * <p>
267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * The modern Persian calendar (used in Iran since 1925 CE and in
277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Afghanistan since 1957 CE), has the lengths of the months fixed.  The
287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * first six months are 31 days each, the next five months are 30 days each,
297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * and the final month is 29 days in non-leap years and 30 days in leap
307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * ones.  Historically, the lengths of the month differed in different
317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * years, but they were finally fixed at the times mentioned above.  Partial
327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * information is available about the historical lengths.
337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * <p>
347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * The official rule for determination of the beginning of the Persian year
357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * is locale dependent, but at the same time, it has not specified a locale.
367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Iranians around the world traditionally follow the calendar authorities
377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * of Iran, which haven't officially specified the locale.  Some
387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * calendarists use some point in Tehran as the locale, while others have
397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * tried the more neutral 52.5 degrees east meridian.  It is not clear which
407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * locale should be used for the Persian calendar of Afghanistan, but it is
417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * expected that for about one year in every twenty-four years, the Afghan
427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * calendar may become different from the Iranian one.
437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * <p>
447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * The exact locale to be used for the Iranian calendar starts to make a
457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * difference at around 2090 CE.  The specific arithmetic method implemented
467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * here, commonly known as the 33-year cycle rule, matches the astronomical
477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * calendar at least for the whole period that the calendar has been both
487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * well-defined and official, from 1925 to around 2090 CE.  The other
497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * commonly known algorithm, the 2820-year cycle, has been incorrectly
507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * designed to follow the tropical year instead of the spring equinoctial
517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * year, and fails to match the astronomical one as early as 2025 CE.
527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * <p>
537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * This class should not be subclassed.</p>
547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * <p>
557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * PersianCalendar usually should be instantiated using
567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * {@link com.ibm.icu.util.Calendar#getInstance(ULocale)} passing in a
577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * <code>ULocale</code> with the tag <code>"@calendar=persian"</code>.</p>
587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *
597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see com.ibm.icu.util.GregorianCalendar
607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see com.ibm.icu.util.Calendar
617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *
627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @author Roozbeh Pournader
637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *
647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @internal
657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @deprecated This API is ICU internal only.
667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */
677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert@Deprecated
687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpublic class PersianCalendar extends Calendar {
697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final long serialVersionUID = -6727306982975111643L;
707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    //-------------------------------------------------------------------------
727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // Constants...
737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    //-------------------------------------------------------------------------
747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final int[][] MONTH_COUNT = {
767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //len len2   st
777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {  31,  31,   0 }, // Farvardin
787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {  31,  31,  31 }, // Ordibehesht
797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {  31,  31,  62 }, // Khordad
807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {  31,  31,  93 }, // Tir
817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {  31,  31, 124 }, // Mordad
827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {  31,  31, 155 }, // Shahrivar
837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {  30,  30, 186 }, // Mehr
847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {  30,  30, 216 }, // Aban
857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {  30,  30, 246 }, // Azar
867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {  30,  30, 276 }, // Dey
877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {  30,  30, 306 }, // Bahman
887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {  29,  30, 336 }  // Esfand
897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // len  length of month
907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // len2 length of month in a leap year
917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // st   days in year before start of month
927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    };
937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final int PERSIAN_EPOCH = 1948320;
957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    //-------------------------------------------------------------------------
977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // Constructors...
987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    //-------------------------------------------------------------------------
997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
1017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Constructs a default <code>PersianCalendar</code> using the current time
1027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * in the default time zone with the default <code>FORMAT</code> locale.
1037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see Category#FORMAT
1047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
1057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @internal
1067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @deprecated This API is ICU internal only.
1077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
1087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    @Deprecated
1097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public PersianCalendar()
1107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
1117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        this(TimeZone.getDefault(), ULocale.getDefault(Category.FORMAT));
1127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
1157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Constructs a <code>PersianCalendar</code> based on the current time
1167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * in the given time zone with the default <code>FORMAT</code> locale.
1177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param zone the given time zone.
1187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see Category#FORMAT
1197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
1207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @internal
1217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @deprecated This API is ICU internal only.
1227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
1237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    @Deprecated
1247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public PersianCalendar(TimeZone zone)
1257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
1267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        this(zone, ULocale.getDefault(Category.FORMAT));
1277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
1307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Constructs a <code>PersianCalendar</code> based on the current time
1317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * in the default time zone with the given locale.
1327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
1337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param aLocale the given locale.
1347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
1357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @internal
1367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @deprecated This API is ICU internal only.
1377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
1387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    @Deprecated
1397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public PersianCalendar(Locale aLocale)
1407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
1417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        this(TimeZone.getDefault(), aLocale);
1427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
1457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Constructs a <code>PersianCalendar</code> based on the current time
1467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * in the default time zone with the given locale.
1477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
1487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param locale the given ulocale.
1497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
1507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @internal
1517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @deprecated This API is ICU internal only.
1527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
1537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    @Deprecated
1547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public PersianCalendar(ULocale locale)
1557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
1567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        this(TimeZone.getDefault(), locale);
1577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
1607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Constructs a <code>PersianCalendar</code> based on the current time
1617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * in the given time zone with the given locale.
1627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
1637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param zone the given time zone.
1647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param aLocale the given locale.
1657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
1667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @internal
1677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @deprecated This API is ICU internal only.
1687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
1697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    @Deprecated
1707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public PersianCalendar(TimeZone zone, Locale aLocale)
1717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
1727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        super(zone, aLocale);
1737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        setTimeInMillis(System.currentTimeMillis());
1747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
1777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Constructs a <code>PersianCalendar</code> based on the current time
1787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * in the given time zone with the given locale.
1797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
1807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param zone the given time zone.
1817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param locale the given ulocale.
1827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
1837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @internal
1847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @deprecated This API is ICU internal only.
1857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
1867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    @Deprecated
1877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public PersianCalendar(TimeZone zone, ULocale locale)
1887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
1897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        super(zone, locale);
1907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        setTimeInMillis(System.currentTimeMillis());
1917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
1947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Constructs a <code>PersianCalendar</code> with the given date set
1957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * in the default time zone with the default <code>FORMAT</code> locale.
1967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
1977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param date      The date to which the new calendar is set.
1987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see Category#FORMAT
1997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
2007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @internal
2017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @deprecated This API is ICU internal only.
2027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
2037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    @Deprecated
2047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public PersianCalendar(Date date) {
2057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        super(TimeZone.getDefault(), ULocale.getDefault(Category.FORMAT));
2067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        this.setTime(date);
2077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
2107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Constructs a <code>PersianCalendar</code> with the given date set
2117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * in the default time zone with the default <code>FORMAT</code> locale.
2127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
2137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param year the value used to set the {@link #YEAR YEAR} time field in the calendar.
2147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param month the value used to set the {@link #MONTH MONTH} time field in the calendar.
2157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *              Note that the month value is 0-based. e.g., 0 for Farvardin.
2167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param date the value used to set the {@link #DATE DATE} time field in the calendar.
2177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see Category#FORMAT
2187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
2197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @internal
2207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @deprecated This API is ICU internal only.
2217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
2227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    @Deprecated
2237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public PersianCalendar(int year, int month, int date)
2247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
2257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        super(TimeZone.getDefault(), ULocale.getDefault(Category.FORMAT));
2267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        this.set(Calendar.YEAR, year);
2277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        this.set(Calendar.MONTH, month);
2287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        this.set(Calendar.DATE, date);
2297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
2327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Constructs a <code>PersianCalendar</code> with the given date
2337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * and time set for the default time zone with the default <code>FORMAT</code> locale.
2347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
2357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param year  the value used to set the {@link #YEAR YEAR} time field in the calendar.
2367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param month the value used to set the {@link #MONTH MONTH} time field in the calendar.
2377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *              Note that the month value is 0-based. e.g., 0 for Farvardin.
2387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param date  the value used to set the {@link #DATE DATE} time field in the calendar.
2397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param hour  the value used to set the {@link #HOUR_OF_DAY HOUR_OF_DAY} time field
2407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *              in the calendar.
2417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param minute the value used to set the {@link #MINUTE MINUTE} time field
2427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *              in the calendar.
2437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param second the value used to set the {@link #SECOND SECOND} time field
2447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *              in the calendar.
2457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @see Category#FORMAT
2467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
2477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @internal
2487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @deprecated This API is ICU internal only.
2497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
2507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    @Deprecated
2517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public PersianCalendar(int year, int month, int date, int hour,
2527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                           int minute, int second)
2537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
2547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        super(TimeZone.getDefault(), ULocale.getDefault(Category.FORMAT));
2557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        this.set(Calendar.YEAR, year);
2567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        this.set(Calendar.MONTH, month);
2577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        this.set(Calendar.DATE, date);
2587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        this.set(Calendar.HOUR_OF_DAY, hour);
2597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        this.set(Calendar.MINUTE, minute);
2607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        this.set(Calendar.SECOND, second);
2617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    //-------------------------------------------------------------------------
2647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // Minimum / Maximum access functions
2657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    //-------------------------------------------------------------------------
2667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final int LIMITS[][] = {
2687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Minimum  Greatest     Least   Maximum
2697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //           Minimum   Maximum
2707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {        0,        0,        0,        0}, // ERA
2717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        { -5000000, -5000000,  5000000,  5000000}, // YEAR
2727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {        0,        0,       11,       11}, // MONTH
2737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {        1,        1,       52,       53}, // WEEK_OF_YEAR
2747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {/*                                   */}, // WEEK_OF_MONTH
2757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {        1,        1,       29,       31}, // DAY_OF_MONTH
2767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {        1,        1,      365,      366}, // DAY_OF_YEAR
2777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {/*                                   */}, // DAY_OF_WEEK
2787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {       -1,       -1,        5,        5}, // DAY_OF_WEEK_IN_MONTH
2797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {/*                                   */}, // AM_PM
2807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {/*                                   */}, // HOUR
2817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {/*                                   */}, // HOUR_OF_DAY
2827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {/*                                   */}, // MINUTE
2837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {/*                                   */}, // SECOND
2847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {/*                                   */}, // MILLISECOND
2857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {/*                                   */}, // ZONE_OFFSET
2867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {/*                                   */}, // DST_OFFSET
2877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        { -5000000, -5000000,  5000000,  5000000}, // YEAR_WOY
2887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {/*                                   */}, // DOW_LOCAL
2897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        { -5000000, -5000000,  5000000,  5000000}, // EXTENDED_YEAR
2907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {/*                                   */}, // JULIAN_DAY
2917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {/*                                   */}, // MILLISECONDS_IN_DAY
2927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    };
2937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
2957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @internal
2967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @deprecated This API is ICU internal only.
2977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
2987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    @Deprecated
2997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    protected int handleGetLimit(int field, int limitType) {
3007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return LIMITS[field][limitType];
3017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
3027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    //-------------------------------------------------------------------------
3047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // Assorted calculation utilities
3057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    //
3067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
3087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Determine whether a year is a leap year in the Persian calendar
3097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
3107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private final static boolean isLeapYear(int year)
3117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
3127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int[] remainder = new int[1];
3137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        floorDivide(25 * year + 11, 33, remainder);
3147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return remainder[0] < 8;
3157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
3177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    //----------------------------------------------------------------------
3197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // Calendar framework
3207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    //----------------------------------------------------------------------
3217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
3237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Return the length (in days) of the given month.
3247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
3257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param extendedYear  The Persian year
3267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param month The Persian month, 0-based
3277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
3287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @internal
3297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @deprecated This API is ICU internal only.
3307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
3317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    @Deprecated
3327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    protected int handleGetMonthLength(int extendedYear, int month) {
3337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // If the month is out of range, adjust it into range, and
3347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // modify the extended year value accordingly.
3357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (month < 0 || month > 11) {
3367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int[] rem = new int[1];
3377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            extendedYear += floorDivide(month, 12, rem);
3387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            month = rem[0];
3397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
3407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return MONTH_COUNT[month][isLeapYear(extendedYear)?1:0];
3427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
3437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
3457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Return the number of days in the given Persian year
3467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
3477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @internal
3487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @deprecated This API is ICU internal only.
3497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
3507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    @Deprecated
3517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    protected int handleGetYearLength(int extendedYear) {
3527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return isLeapYear(extendedYear) ? 366 : 365;
3537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
3547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    //-------------------------------------------------------------------------
3567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // Functions for converting from field values to milliseconds....
3577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    //-------------------------------------------------------------------------
3587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
3607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Return JD of start of given month/year
3617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
3627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @internal
3637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @deprecated This API is ICU internal only.
3647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
3657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    @Deprecated
3667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    protected int handleComputeMonthStart(int eyear, int month, boolean useMonth) {
3677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // If the month is out of range, adjust it into range, and
3687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // modify the extended year value accordingly.
3697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (month < 0 || month > 11) {
3707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int[] rem = new int[1];
3717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            eyear += floorDivide(month, 12, rem);
3727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            month = rem[0];
3737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
3747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int julianDay = PERSIAN_EPOCH - 1 + 365 * (eyear - 1) + floorDivide(8 * eyear + 21, 33);
3767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (month != 0) {
3777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            julianDay += MONTH_COUNT[month][2];
3787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
3797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return julianDay;
3807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
3817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    //-------------------------------------------------------------------------
3837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // Functions for converting from milliseconds to field values
3847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    //-------------------------------------------------------------------------
3857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
3877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @internal
3887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @deprecated This API is ICU internal only.
3897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
3907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    @Deprecated
3917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    protected int handleGetExtendedYear() {
3927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int year;
3937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (newerField(EXTENDED_YEAR, YEAR) == EXTENDED_YEAR) {
3947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            year = internalGet(EXTENDED_YEAR, 1); // Default to year 1
3957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } else {
3967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            year = internalGet(YEAR, 1); // Default to year 1
3977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
3987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return year;
3997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
4007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
4027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Override Calendar to compute several fields specific to the Persian
4037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * calendar system.  These are:
4047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
4057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * <ul><li>ERA
4067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * <li>YEAR
4077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * <li>MONTH
4087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * <li>DAY_OF_MONTH
4097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * <li>DAY_OF_YEAR
4107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * <li>EXTENDED_YEAR</ul>
4117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
4127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * The DAY_OF_WEEK and DOW_LOCAL fields are already set when this
4137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * method is called.
4147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
4157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @internal
4167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @deprecated This API is ICU internal only.
4177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
4187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    @Deprecated
4197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    protected void handleComputeFields(int julianDay) {
4207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int year, month, dayOfMonth, dayOfYear;
4217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        long daysSinceEpoch = julianDay - PERSIAN_EPOCH;
4237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        year = 1 + (int) floorDivide(33 * daysSinceEpoch + 3, 12053);
4247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4252d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert        long farvardin1 = 365L * (year - 1L) + floorDivide(8L * year + 21, 33L);
4267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        dayOfYear = (int)(daysSinceEpoch - farvardin1); // 0-based
4277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (dayOfYear < 216) { // Compute 0-based month
4287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            month = dayOfYear / 31;
4297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } else {
4307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            month = (dayOfYear - 6) / 30;
4317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
4327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        dayOfMonth = dayOfYear - MONTH_COUNT[month][2] + 1;
4337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ++dayOfYear; // Make it 1-based now
4347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        internalSet(ERA, 0);
4367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        internalSet(YEAR, year);
4377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        internalSet(EXTENDED_YEAR, year);
4387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        internalSet(MONTH, month);
4397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        internalSet(DAY_OF_MONTH, dayOfMonth);
4407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        internalSet(DAY_OF_YEAR, dayOfYear);
4417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
4427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
4447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * {@inheritDoc}
4457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
4467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @internal
4477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @deprecated This API is ICU internal only.
4487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
4497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    @Deprecated
4507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public String getType() {
4517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return "persian";
4527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
4537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert}
454