• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* GENERATED SOURCE. DO NOT MODIFY. */
2 // © 2016 and later: Unicode, Inc. and others.
3 // License & terms of use: http://www.unicode.org/copyright.html#License
4 /*
5  *******************************************************************************
6  * Copyright (C) 2005-2011, International Business Machines Corporation and    *
7  * others. All Rights Reserved.                                                *
8  *******************************************************************************
9  */
10 package ohos.global.icu.util;
11 
12 import java.util.Date;
13 import java.util.Locale;
14 
15 import ohos.global.icu.util.ULocale.Category;
16 
17 /**
18  * Base class for EthiopicCalendar and CopticCalendar.
19  */
20 abstract class CECalendar extends Calendar {
21     // jdk1.4.2 serialver
22     private static final long serialVersionUID = -999547623066414271L;
23 
24     private static final int LIMITS[][] = {
25         // Minimum  Greatest    Least  Maximum
26         //           Minimum  Maximum
27         {        0,        0,       1,       1 }, // ERA
28         {        1,        1, 5000000, 5000000 }, // YEAR
29         {        0,        0,      12,      12 }, // MONTH
30         {        1,        1,      52,      53 }, // WEEK_OF_YEAR
31         {/*                                  */}, // WEEK_OF_MONTH
32         {        1,        1,       5,      30 }, // DAY_OF_MONTH
33         {        1,        1,     365,     366 }, // DAY_OF_YEAR
34         {/*                                  */}, // DAY_OF_WEEK
35         {       -1,       -1,       1,       5 }, // DAY_OF_WEEK_IN_MONTH
36         {/*                                  */}, // AM_PM
37         {/*                                  */}, // HOUR
38         {/*                                  */}, // HOUR_OF_DAY
39         {/*                                  */}, // MINUTE
40         {/*                                  */}, // SECOND
41         {/*                                  */}, // MILLISECOND
42         {/*                                  */}, // ZONE_OFFSET
43         {/*                                  */}, // DST_OFFSET
44         { -5000000, -5000000, 5000000, 5000000 }, // YEAR_WOY
45         {/*                                  */}, // DOW_LOCAL
46         { -5000000, -5000000, 5000000, 5000000 }, // EXTENDED_YEAR
47         {/*                                  */}, // JULIAN_DAY
48         {/*                                  */}, // MILLISECONDS_IN_DAY
49     };
50 
51     //-------------------------------------------------------------------------
52     // Constructors...
53     //-------------------------------------------------------------------------
54 
55     /**
56      * Constructs a default <code>CECalendar</code> using the current time
57      * in the default time zone with the default <code>FORMAT</code> locale.
58      */
CECalendar()59     protected CECalendar() {
60         this(TimeZone.getDefault(), ULocale.getDefault(Category.FORMAT));
61     }
62 
63     /**
64      * Constructs a <code>CECalendar</code> based on the current time
65      * in the given time zone with the default <code>FORMAT</code> locale.
66      *
67      * @param zone The time zone for the new calendar.
68      */
CECalendar(TimeZone zone)69     protected CECalendar(TimeZone zone) {
70         this(zone, ULocale.getDefault(Category.FORMAT));
71     }
72 
73     /**
74      * Constructs a <code>CECalendar</code> based on the current time
75      * in the default time zone with the given locale.
76      *
77      * @param aLocale The locale for the new calendar.
78      */
CECalendar(Locale aLocale)79     protected CECalendar(Locale aLocale) {
80         this(TimeZone.getDefault(), aLocale);
81     }
82 
83     /**
84      * Constructs a <code>CECalendar</code> based on the current time
85      * in the default time zone with the given locale.
86      *
87      * @param locale The locale for the new calendar.
88      */
CECalendar(ULocale locale)89     protected CECalendar(ULocale locale) {
90         this(TimeZone.getDefault(), locale);
91     }
92 
93     /**
94      * Constructs a <code>CECalendar</code> based on the current time
95      * in the given time zone with the given locale.
96      *
97      * @param zone The time zone for the new calendar.
98      *
99      * @param aLocale The locale for the new calendar.
100      */
CECalendar(TimeZone zone, Locale aLocale)101     protected CECalendar(TimeZone zone, Locale aLocale) {
102         super(zone, aLocale);
103         setTimeInMillis(System.currentTimeMillis());
104     }
105 
106     /**
107      * Constructs a <code>CECalendar</code> based on the current time
108      * in the given time zone with the given locale.
109      *
110      * @param zone The time zone for the new calendar.
111      *
112      * @param locale The locale for the new calendar.
113      */
CECalendar(TimeZone zone, ULocale locale)114     protected CECalendar(TimeZone zone, ULocale locale) {
115         super(zone, locale);
116         setTimeInMillis(System.currentTimeMillis());
117     }
118 
119     /**
120      * Constructs a <code>CECalendar</code> with the given date set
121      * in the default time zone with the default <code>FORMAT</code> locale.
122      *
123      * @param year      The value used to set the calendar's {@link #YEAR YEAR} time field.
124      *
125      * @param month     The value used to set the calendar's {@link #MONTH MONTH} time field.
126      *                  The value is 0-based. e.g., 0 for Tishri.
127      *
128      * @param date      The value used to set the calendar's {@link #DATE DATE} time field.
129      */
CECalendar(int year, int month, int date)130     protected CECalendar(int year, int month, int date) {
131         super(TimeZone.getDefault(), ULocale.getDefault(Category.FORMAT));
132         this.set(year, month, date);
133     }
134 
135     /**
136      * Constructs a <code>CECalendar</code> with the given date set
137      * in the default time zone with the default <code>FORMAT</code> locale.
138      *
139      * @param date      The date to which the new calendar is set.
140      */
CECalendar(Date date)141     protected CECalendar(Date date) {
142         super(TimeZone.getDefault(), ULocale.getDefault(Category.FORMAT));
143         this.setTime(date);
144     }
145 
146     /**
147      * Constructs a <code>CECalendar</code> with the given date
148      * and time set for the default time zone with the default <code>FORMAT</code> locale.
149      *
150      * @param year      The value used to set the calendar's {@link #YEAR YEAR} time field.
151      * @param month     The value used to set the calendar's {@link #MONTH MONTH} time field.
152      *                  The value is 0-based. e.g., 0 for Tishri.
153      * @param date      The value used to set the calendar's {@link #DATE DATE} time field.
154      * @param hour      The value used to set the calendar's {@link #HOUR_OF_DAY HOUR_OF_DAY} time field.
155      * @param minute    The value used to set the calendar's {@link #MINUTE MINUTE} time field.
156      * @param second    The value used to set the calendar's {@link #SECOND SECOND} time field.
157      */
CECalendar(int year, int month, int date, int hour, int minute, int second)158     protected CECalendar(int year, int month, int date, int hour,
159                          int minute, int second)
160     {
161         super(TimeZone.getDefault(), ULocale.getDefault(Category.FORMAT));
162         this.set(year, month, date, hour, minute, second);
163     }
164 
165     //-------------------------------------------------------------------------
166     // Calendar framework
167     //-------------------------------------------------------------------------
168 
169     /**
170      * The Coptic and Ethiopic calendars differ only in their epochs.
171      * This method must be implemented by CECalendar subclasses to
172      * return the date offset from Julian.
173      * @hide unsupported on OHOS
174      */
getJDEpochOffset()175     abstract protected int getJDEpochOffset();
176 
177     /**
178      * Return JD of start of given month/extended year
179      */
handleComputeMonthStart(int eyear, int emonth, boolean useMonth)180     protected int handleComputeMonthStart(int eyear,
181                                           int emonth,
182                                           boolean useMonth) {
183         return ceToJD(eyear, emonth, 0, getJDEpochOffset());
184     }
185 
186     /**
187      * Calculate the limit for a specified type of limit and field
188      */
handleGetLimit(int field, int limitType)189     protected int handleGetLimit(int field, int limitType) {
190         return LIMITS[field][limitType];
191     }
192 
193     // (The following method is not called because all existing subclasses
194     // override it.
195     ///CLOVER:OFF
196     /**
197      * Return the number of days in the given month of the given extended
198      * year of this calendar system.  Subclasses should override this
199      * method if they can provide a more correct or more efficient
200      * implementation than the default implementation in Calendar.
201      */
handleGetMonthLength(int extendedYear, int month)202     protected int handleGetMonthLength(int extendedYear, int month)
203     {
204 
205         // The Ethiopian and Coptic calendars have 13 months, 12 of 30 days each and
206         // an intercalary month at the end of the year of 5 or 6 days, depending whether
207         // the year is a leap year or not. The Leap Year follows the same rules as the
208         // Julian Calendar so that the extra month always has six days in the year before
209         // a Julian Leap Year.
210         if ((month + 1) % 13 != 0)
211         {
212             // not intercalary month
213             return 30;
214         }
215         else
216         {
217             // intercalary month 5 days + possible leap day
218             return ((extendedYear % 4) / 3) + 5;
219         }
220 
221     }
222     ///CLOVER:ON
223 
224     //-------------------------------------------------------------------------
225     // Calendar framework
226     //-------------------------------------------------------------------------
227 
228     /**
229      * Convert an Coptic/Ethiopic year, month and day to a Julian day
230      * @param year the extended year
231      * @param month the month
232      * @param day the day
233      * @return Julian day
234      * @hide unsupported on OHOS
235      */
ceToJD(long year, int month, int day, int jdEpochOffset)236     public static int ceToJD(long year, int month, int day, int jdEpochOffset) {
237 
238         // Julian<->Ethiopic algorithms from:
239         // "Calendars in Ethiopia", Berhanu Beyene, Manfred Kudlek, International Conference
240         // of Ethiopian Studies XV, Hamburg, 2003
241 
242         // handle month > 12, < 0 (e.g. from add/set)
243         if ( month >= 0 ) {
244             year += month/13;
245             month %= 13;
246         } else {
247             ++month;
248             year += month/13 - 1;
249             month = month%13 + 12;
250         }
251         return (int) (
252             jdEpochOffset           // difference from Julian epoch to 1,1,1
253             + 365 * year            // number of days from years
254             + floorDivide(year, 4)  // extra day of leap year
255             + 30 * month            // number of days from months (months are 0-based)
256             + day - 1               // number of days for present month (1 based)
257             );
258     }
259 
260     /**
261      * Convert a Julian day to an Coptic/Ethiopic year, month and day
262      * @hide unsupported on OHOS
263      */
jdToCE(int julianDay, int jdEpochOffset, int[] fields)264     public static void jdToCE(int julianDay, int jdEpochOffset, int[] fields) {
265         int c4; // number of 4 year cycle (1461 days)
266         int[] r4 = new int[1]; // remainder of 4 year cycle, always positive
267 
268         c4 = floorDivide(julianDay - jdEpochOffset, 1461, r4);
269 
270         // exteded year
271         fields[0] = 4 * c4 + (r4[0]/365 - r4[0]/1460); // 4 * <number of 4year cycle> + <years within the last cycle>
272 
273         int doy = (r4[0] == 1460) ? 365 : (r4[0] % 365); // days in present year
274 
275         // month
276         fields[1] = doy / 30; // 30 -> Coptic/Ethiopic month length up to 12th month
277         // day
278         fields[2] = (doy % 30) + 1; // 1-based days in a month
279     }
280 }
281