OSDN Git Service

Initial revision
[pf3gnuchains/gcc-fork.git] / libjava / java / util / Calendar.java
1 /* Copyright (C) 1998, 1999  Cygnus Solutions
2
3    This file is part of libgcj.
4
5 This software is copyrighted work licensed under the terms of the
6 Libgcj License.  Please consult the file "LIBGCJ_LICENSE" for
7 details.  */
8
9 package java.util;
10
11 /**
12  * @author Per Bothner <bothner@cygnus.com>
13  * @date October 24, 1998.
14  */
15
16 /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3,
17  * and "The Java Language Specification", ISBN 0-201-63451-1.
18  * Status:  Unimplemented:  getAvailableLocales.
19  *   No Locale knowledge.
20  */
21
22 public abstract class Calendar implements java.io.Serializable, Cloneable
23 {
24   public final static int JANUARY = 0;
25   public final static int FEBRUARY = 1;
26   public final static int MARCH = 2;
27   public final static int APRIL = 3;
28   public final static int MAY = 4;
29   public final static int JUNE = 5;
30   public final static int JULY = 6;
31   public final static int AUGUST = 7;
32   public final static int SEPTEMBER = 8;
33   public final static int OCTOBER = 9;
34   public final static int NOVEMBER = 10;
35   public final static int DECEMBER = 11;
36   public final static int UNDECIMBER = 12;
37
38   public final static int SUNDAY = 1;
39   public final static int MONDAY = 2;
40   public final static int TUESDAY = 3;
41   public final static int WEDNESDAY = 4;
42   public final static int THURSDAY = 5;
43   public final static int FRIDAY = 6;
44   public final static int SATURDAY = 7;
45
46   public final static int AM = 0;
47   public final static int PM = 1;
48
49   public final static int FIELD_COUNT = 17;
50
51   // These constants are not docuemnted, but were determined using
52   // a simple test program.
53   public final static int ERA = 0;
54   public final static int YEAR = 1;
55   public final static int MONTH = 2;
56   public final static int WEEK_OF_YEAR = 3;
57   public final static int WEEK_OF_MONTH = 4;
58   public final static int DATE = 5;
59   public final static int DAY_OF_MONTH = 5;
60   public final static int DAY_OF_YEAR = 6;
61   public final static int DAY_OF_WEEK = 7;
62   public final static int DAY_OF_WEEK_IN_MONTH = 8;
63   public final static int AM_PM = 9;
64   public final static int HOUR = 10;
65   public final static int HOUR_OF_DAY = 11;
66   public final static int MINUTE = 12;
67   public final static int SECOND = 13;
68   public final static int MILLISECOND = 14;
69   public final static int ZONE_OFFSET = 15;
70   public final static int DST_OFFSET = 16;
71
72   // The fields are as specified in Sun's "Serialized Form"
73   // in the JDK 1.2 beta 4 API specification.
74   protected boolean areFieldsSet;
75   protected int[] fields;
76   private int firstDayOfWeek;
77   protected boolean[] isSet;
78   protected boolean isTimeSet;
79   private boolean lenient;
80   private int minimalDaysInFirstWeek;
81   private int nextStamp;
82   //private int serialVersionOnStream;
83   protected long time;
84   private TimeZone zone;
85
86   protected Calendar ()
87   {
88     this (null, null);
89   }
90
91   protected Calendar (TimeZone tx, Locale loc)
92   {
93     fields = new int[FIELD_COUNT];
94     isSet = new boolean[FIELD_COUNT];
95     firstDayOfWeek = SUNDAY;  // Locale-dependent.  FIXME.
96     this.zone = zone != null ? zone : TimeZone.getDefault();
97   }
98
99   public Object clone ()
100   {
101     try
102       {
103         return super.clone();
104       }
105     catch (CloneNotSupportedException ex)
106       {
107         throw new RuntimeException("internal error - "+ex);
108       }
109   }
110
111   public static Calendar getInstance ()
112   {
113     return new GregorianCalendar ();
114   }
115
116   public static Calendar getInstance (TimeZone zone)
117   {
118     return new GregorianCalendar (zone);
119   }
120
121   public static Calendar getInstance (Locale locale)
122   {
123     return new GregorianCalendar (locale);
124   }
125
126   public static Calendar getInstance (TimeZone zone, Locale locale)
127   {
128     return new GregorianCalendar (zone, locale);
129   }
130
131   public boolean isLenient() { return lenient; }
132   public void setLenient (boolean lenient) { this.lenient = lenient; }
133
134   public int getFirstDayOfWeek ()
135   {
136     return firstDayOfWeek;
137   }
138
139   public void setFirstDayOfWeek (int value)
140   {
141     firstDayOfWeek = value;
142   }
143
144   public int getMinimalDaysInFirstWeek ()
145   {
146     return minimalDaysInFirstWeek;
147   }
148
149   public void setMinimalDaysInFirstWeek (int value)
150   {
151     minimalDaysInFirstWeek = value;
152   }
153
154   public TimeZone getTimeZone ()
155   {
156     return zone;
157   }
158
159   public void setTimeZone (TimeZone tz)
160   {
161     zone = tz;
162   }
163
164   abstract public void add(int fld, int amount);
165   abstract public void roll (int fld, boolean up);
166
167   public final void set (int year, int month, int date)
168   {
169     set(YEAR, year);
170     set(MONTH, month);
171     set(DATE, date);
172   }
173
174   public final void set (int year, int month, int date, int hour, int minute)
175   {
176     set(year, month, date);
177     set(HOUR_OF_DAY, hour);
178     set(MINUTE, minute);
179   }
180
181   public final void set (int year, int month, int date,
182                          int hour, int minute, int second)
183   {
184     set(year, month, date, hour, minute);
185     set(SECOND, second);
186   }
187
188   public final void set (int fld, int value)
189   {
190     fields[fld] = value;
191     isTimeSet = false;
192   }
193
194   public final void clear (int fld)
195   {
196     fields[fld] = 0;
197     isSet[fld] = false;
198     areFieldsSet = false;
199   }
200
201   public final void clear ()
202   {
203     for (int fld = FIELD_COUNT;  --fld >= 0; )
204       {
205         fields[fld] = 0;
206         isSet[fld] = false;
207       }
208     areFieldsSet = false;
209   }
210
211   protected void complete()
212   {
213     if (!isTimeSet) computeTime();
214     if (!areFieldsSet) computeFields();
215   }
216
217   protected abstract void computeFields();
218   protected abstract void computeTime();
219
220   protected final int internalGet (int fld) { return fields[fld]; }
221
222   public final int get(int fld)
223   {
224     complete();
225     return fields[fld];
226   }
227
228   public abstract boolean after (Object cal);
229   public abstract boolean before (Object cal);
230   public abstract boolean equals (Object obj);
231
232   protected long getTimeInMillis()
233   {
234     if (!isTimeSet) computeTime();
235     return time;
236   }
237
238   public final Date getTime() { return new Date(getTimeInMillis()); }
239
240   public final void setTime (Date date)
241   {
242     setTimeInMillis(date.getTime());
243   }
244
245   protected void setTimeInMillis (long millis)
246   {
247     time = millis;
248     isTimeSet = true;
249     clear();
250   }
251
252   abstract public int getMaximum(int fld);
253   abstract public int getMinimum(int fld);
254   abstract public int getGreatestMinimum(int fld);
255   abstract public int getLeastMaximum(int fld);
256
257   public final boolean isSet(int fld) { return isSet[fld]; }
258 }