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