aboutsummaryrefslogtreecommitdiff
path: root/libjava/java/util/Calendar.java
blob: b5eaa4d39d62b1f4587089801236aabf28832a5b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
/* Copyright (C) 1998, 1999, 2000  Free Software Foundation

   This file is part of libgcj.

This software is copyrighted work licensed under the terms of the
Libgcj License.  Please consult the file "LIBGCJ_LICENSE" for
details.  */

package java.util;

/**
 * @author Per Bothner <bothner@cygnus.com>
 * @date October 24, 1998.
 */

/* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3,
 * and "The Java Language Specification", ISBN 0-201-63451-1.
 * Status:  Unimplemented:  getAvailableLocales.
 *   No Locale knowledge.
 */

public abstract class Calendar implements java.io.Serializable, Cloneable
{
  public final static int JANUARY = 0;
  public final static int FEBRUARY = 1;
  public final static int MARCH = 2;
  public final static int APRIL = 3;
  public final static int MAY = 4;
  public final static int JUNE = 5;
  public final static int JULY = 6;
  public final static int AUGUST = 7;
  public final static int SEPTEMBER = 8;
  public final static int OCTOBER = 9;
  public final static int NOVEMBER = 10;
  public final static int DECEMBER = 11;
  public final static int UNDECIMBER = 12;

  public final static int SUNDAY = 1;
  public final static int MONDAY = 2;
  public final static int TUESDAY = 3;
  public final static int WEDNESDAY = 4;
  public final static int THURSDAY = 5;
  public final static int FRIDAY = 6;
  public final static int SATURDAY = 7;

  public final static int AM = 0;
  public final static int PM = 1;

  public final static int FIELD_COUNT = 17;

  // These constants are not docuemnted, but were determined using
  // a simple test program.
  public final static int ERA = 0;
  public final static int YEAR = 1;
  public final static int MONTH = 2;
  public final static int WEEK_OF_YEAR = 3;
  public final static int WEEK_OF_MONTH = 4;
  public final static int DATE = 5;
  public final static int DAY_OF_MONTH = 5;
  public final static int DAY_OF_YEAR = 6;
  public final static int DAY_OF_WEEK = 7;
  public final static int DAY_OF_WEEK_IN_MONTH = 8;
  public final static int AM_PM = 9;
  public final static int HOUR = 10;
  public final static int HOUR_OF_DAY = 11;
  public final static int MINUTE = 12;
  public final static int SECOND = 13;
  public final static int MILLISECOND = 14;
  public final static int ZONE_OFFSET = 15;
  public final static int DST_OFFSET = 16;

  // The fields are as specified in Sun's "Serialized Form"
  // in the JDK 1.2 beta 4 API specification.
  protected boolean areFieldsSet;
  protected int[] fields;
  private int firstDayOfWeek;
  protected boolean[] isSet;
  protected boolean isTimeSet;
  private boolean lenient;
  private int minimalDaysInFirstWeek;
  private int nextStamp;
  //private int serialVersionOnStream;
  protected long time;
  private TimeZone zone;

  protected Calendar ()
  {
    this (null, null);
  }

  protected Calendar (TimeZone zone, Locale loc)
  {
    fields = new int[FIELD_COUNT];
    isSet = new boolean[FIELD_COUNT];
    firstDayOfWeek = SUNDAY;  // Locale-dependent.  FIXME.
    this.zone = zone != null ? zone : TimeZone.getDefault();
  }

  public Object clone ()
  {
    try
      {
	return super.clone();
      }
    catch (CloneNotSupportedException ex)
      {
	throw new RuntimeException("internal error - "+ex);
      }
  }

  public String toString ()
  {
    // We have much latitude in how we implement this.
    return ("areFieldsSet " + areFieldsSet
	    + "; fields " + fields
	    + "; firstDayOfWeek " + firstDayOfWeek
	    + "; isSet " + isSet
	    + "; isTimeSet " + isTimeSet
	    + "; lenient " + lenient
	    + "; minimalDaysInFirstWeek " + minimalDaysInFirstWeek
	    + "; nextStamp " + nextStamp
	    + "; time " + time
	    + "; zone " + zone);
  }

  public static Calendar getInstance ()
  {
    return new GregorianCalendar ();
  }

  public static Calendar getInstance (TimeZone zone)
  {
    return new GregorianCalendar (zone);
  }

  public static Calendar getInstance (Locale locale)
  {
    return new GregorianCalendar (locale);
  }

  public static Calendar getInstance (TimeZone zone, Locale locale)
  {
    return new GregorianCalendar (zone, locale);
  }

  public boolean isLenient() { return lenient; }
  public void setLenient (boolean lenient) { this.lenient = lenient; }

  public int getFirstDayOfWeek ()
  {
    return firstDayOfWeek;
  }

  public void setFirstDayOfWeek (int value)
  {
    firstDayOfWeek = value;
  }

  public int getMinimalDaysInFirstWeek ()
  {
    return minimalDaysInFirstWeek;
  }

  public void setMinimalDaysInFirstWeek (int value)
  {
    minimalDaysInFirstWeek = value;
  }

  public TimeZone getTimeZone ()
  {
    return zone;
  }

  public void setTimeZone (TimeZone tz)
  {
    zone = tz;
  }

  abstract public void add(int fld, int amount);
  abstract public void roll (int fld, boolean up);

  public final void set (int year, int month, int date)
  {
    set(YEAR, year);
    set(MONTH, month);
    set(DATE, date);
  }

  public final void set (int year, int month, int date, int hour, int minute)
  {
    set(year, month, date);
    set(HOUR_OF_DAY, hour);
    set(MINUTE, minute);
  }

  public final void set (int year, int month, int date,
			 int hour, int minute, int second)
  {
    set(year, month, date, hour, minute);
    set(SECOND, second);
  }

  public final void set (int fld, int value)
  {
    if (! areFieldsSet) computeFields();
    fields[fld] = value;
    isTimeSet = false;
  }

  public final void clear (int fld)
  {
    fields[fld] = 0;
    isSet[fld] = false;
    areFieldsSet = false;
  }

  public final void clear ()
  {
    for (int fld = FIELD_COUNT;  --fld >= 0; )
      {
	fields[fld] = 0;
	isSet[fld] = false;
      }
    areFieldsSet = false;
  }

  protected void complete()
  {
    if (!isTimeSet) computeTime();
    if (!areFieldsSet) computeFields();
  }

  protected abstract void computeFields();
  protected abstract void computeTime();

  protected final int internalGet (int fld) { return fields[fld]; }

  public final int get(int fld)
  {
    complete();
    return fields[fld];
  }

  public abstract boolean after (Object cal);
  public abstract boolean before (Object cal);
  public abstract boolean equals (Object obj);

  protected long getTimeInMillis()
  {
    if (!isTimeSet) computeTime();
    return time;
  }

  public final Date getTime() { return new Date(getTimeInMillis()); }

  public final void setTime (Date date)
  {
    setTimeInMillis(date.getTime());
  }

  protected void setTimeInMillis (long millis)
  {
    time = millis;
    isTimeSet = true;
    clear();
  }

  abstract public int getMaximum(int fld);
  abstract public int getMinimum(int fld);
  abstract public int getGreatestMinimum(int fld);
  abstract public int getLeastMaximum(int fld);

  public final boolean isSet(int fld) { return isSet[fld]; }
}