[multiple changes]

2005-02-21  Mark Wielaard  <mark@klomp.org>

	* gnu/java/locale/LocaleInformation_en.java: Extend
	localPatternChars to "GyMdkHmsSEDFwWahKzYeugAZ".

2005-02-21  Mark Wielaard  <mark@klomp.org>

	* java/text/SimpleDateFormat.java
	(SimpleDateFormat(String, DateFormatSymbols)): Throw
	NullPointerException when formatData is null.

2005-02-21  Mark Wielaard  <mark@klomp.org>

	* java/util/SimpleTimeZone.java (getOffset): Calculate beforeEnd by
	taking dstSavings into account.

2005-02-21  Sven de Marothy <sven@physto.se>

	* java/text/SimpleDateFormat.java,
	(parse): Set correct DST_OFFSET to the correct value.

2005-02-21  Mark Wielaard  <mark@klomp.org>

	* java/util/SimpleTimeZone.java (checkRule): Throw
	IllegalArgumentException when month out of range.

2005-02-21  Sven de Marothy  <sven@physto.se>

	* java/util/GregorianCalendar.java,
	(add): Don't set fields directly anymore. Use set()

2005-02-21  Mark Wielaard  <mark@klomp.org>

	* java/text/SimpleDateFormat.java (CompiledField.toString):
	Use StringBuffer, not StringBuilder.
	(toString): Likewise.

2005-02-21  Sven de Marothy  <sven@physto.se>

	* java/util/Calendar.java
	(clear): Dates should clear to local time.
	* java/util/GregorianCalendar.java
	(computeTime): Fix priority problem with DAY_OF_WEEK,
	Handle non-sunday-startig weeks and minimumDaysInFirstWeek.

2005-02-21  Sven de Marothy  <sven@physto.se>

	* java/util/Calendar.java
	(Calendar): Constructor should clear fields.

2005-02-21  Sven de Marothy  <sven@physto.se>

	* java/text/SimpleDateFormat.java
	(parse): Tweak handling of 2-year dates
	* java/util/Calendar.java
	(clear): Clear fields to correct value.
	* java/util/GregorianCalendar.java
	(computeTime): Correct handling of time zones.
	Correct field minimum values.

2005-02-21  Sven de Marothy  <sven@physto.se>

	* java/util/Calendar.java
	(set) Invalidate all fields on first call to set().

2005-02-21  Sven de Marothy  <sven@physto.se>

	* java/util/GregorianCalendar.java
	(computeTime): Fixed handling of time zones.

2005-02-21  Sven de Marothy  <sven@physto.se>

	* java/util/Calendar.java
	(clear): Set values to Epoch instead of zero.
	(set): Set isSet to the relevant field pattern instead of just
	the field.
	* java/util/GregorianCalendar.java
	(getBundle): Removed.
	(getDayOfYear): Removed.
	(getFirstDayOfMonth): New private method.
	(nonLeniencyCheck): New private method.
	(computeTime): Correct handling of insufficient data.

2005-02-21  Sven de Marothy <sven@physto.se>

	* java/util/Calendar.java: Invalidate ERA field on setting
	the YEAR.
	* java/util/SimpleTimeZone.java:
	(getDaysInMonth): Reimplemented.
	* java/util/GregorianCalendar.java:
	(getLinearTime): Removed.
	(isLeapYear(int,boolean)): Removed.
	(before(), after()): Removed.
	(computeTime): Reimplemented.

2005-02-21  Sven de Marothy <sven@physto.se>

	* java/util/Calendar.java: Reformatted.
	* java/util/GregorianCalendar.java: Reformatted.
	* java/util/SimpleTimeZone.java: Reformatted.

2005-02-21  Sven de Marothy <sven@physto.se>

        * java/util/GregorianCalendar.java
        (GregorianCalendar): Update fields in the constructor

2005-02-21  Noa Resare  <noa@resare.com>

        * java/util/Calendar.java (explicitDSTOffset): New instance field.
        (set(int,int)): Set and use new field.
        (set(int,int,int)): Check new field.

2005-02-21  Noa Resare  <address@hidden>

	* java/util/Calendar.java(set):
	Fix for DST related regression.

2005-02-21  Jeroen Frijters  <jeroen@frijters.net>

	* java/util/Calendar.java
	(setTimeInMillis): Added call to clear, removed computeFields call.
	* java/util/Date.java
	(Date(int,int,int,int,int,int)): Removed workaround for
	GregorianCalendar bug.
	* java/util/GregorianCalendar.java
	(GregorianCalendar): Chained all constructors to a (new)
	common constructor.
	(computeTime): Fixed support for lenient month treatment.
	(getLinearDay): Return long instead of int.
	(calculateDay): Added fields argument and changed day argument
	to long.

2005-02-21  Andrew John Hughes  <gnu_andrew@member.fsf.org>

	* java/text/SimpleDateFormat.java
	Lots of documentation updates.
	(readObject(java.io.ObjectInputStream)): Wraps
	IllegalArgumentException as specified.
	(compileFormat(String)): Uses standardChars
	rather than the local pattern characters.
	Throws IllegalArgumentException rather than
	storing a -1 field.
	(toString()): Extended to include all variables
	in a better format.
	(translateLocalizedPattern(String, String, String)):
	Renamed to better define the use of this method.

2005-02-21  Andrew John Hughes  <gnu_andrew@member.fsf.org>

	* java/text/DateFormat.java:
	Documented pattern character offset constants and
	added new ones.
	(Field): Added new static fields for new pattern chars.
	* java/text/SimpleDateFormat.java:
	(CompiledField): Changed name of FieldSizePair class
	to CompiledField after adding the character as an
	attribute.  Changed fields to private and added
	accessors to give encapsulation.
	(CompiledField.CompiledField(int,int,char)): Extended
	with character field.
	(CompiledField.getField()): New accessor method.
	(CompiledField.getSize()): New acceessor method.
	(CompiledField.getCharacter()): New accessor method.
	(CompiledField.toString()): Added primarily for debugging.
	(standardChars): Now uses extended 24 character sequence.
	(compileFormat(String)): Changed to use CompiledField.
	(formatWithAttribute(java.util.Date, gnu.java.text.FormatBuffer,
	java.text.FieldPosition)): Changed to use CompiledField.
	New handler for RFC 822 timezones added.

2005-02-21  Andrew John Hughes  <gnu_andrew@member.fsf.org>

	* java/text/SimpleDateFormat.java:
	(parse(String, java.text.ParsePosition)):
	Changed 'E' and 'M' cases to use both
	short and long names.  Extended 'z'
	case to also handle 'Z', and deal
	with simple GMT offsets such as +0100.
	(computeOffset(String)): New private method,
	which converts a GMT offset specification,
	such as GMT-0500 to a numeric offset in
	milliseconds.
	* java/util/TimeZone.java:
	(timezones()): Added "CEST", the daylight
	savings time version of "CET", or Central
	European Time.

2005-02-21  Ito Kazumitsu  <kaz@maczuka.gcd.org>

	* java/text/SimpleDateFormat.java:
	(parse): Set the DST offset to 0 when parsing
	GMT offset timezones.

2005-02-21  Ito Kazumitsu  <kaz@maczuka.gcd.org>

	* java/text/SimpleDateFormat.java:
	(parse): Use offset to set ZONE_OFFSET
	rather than the DST_OFFSET, so that
	GMT offset timezones change the right
	one.

2005-02-21  Andrew John Hughes  <gnu_andrew@member.fsf.org>

	* java/text/SimpleDateFormat.java:
	(getDateFormatSymbols()): return a copy
	(setDateFormatSymbols(java.text.DateFormatSymbols)):
	throw exception on null input
	(clone()): implemented to clone
	internal fields

2005-02-21  Sven de Marothy <sven@physto.se>

	* java/text/SimpleDateFormat.java
	(parse): comparison should be case-insensitive, ignore null
	strings.

From-SVN: r95368
This commit is contained in:
Mark Wielaard 2005-02-22 00:58:36 +00:00
parent 665794a6c4
commit 933e5b284a
8 changed files with 1853 additions and 917 deletions

View File

@ -1,3 +1,219 @@
2005-02-21 Mark Wielaard <mark@klomp.org>
* gnu/java/locale/LocaleInformation_en.java: Extend
localPatternChars to "GyMdkHmsSEDFwWahKzYeugAZ".
2005-02-21 Mark Wielaard <mark@klomp.org>
* java/text/SimpleDateFormat.java
(SimpleDateFormat(String, DateFormatSymbols)): Throw
NullPointerException when formatData is null.
2005-02-21 Mark Wielaard <mark@klomp.org>
* java/util/SimpleTimeZone.java (getOffset): Calculate beforeEnd by
taking dstSavings into account.
2005-02-21 Sven de Marothy <sven@physto.se>
* java/text/SimpleDateFormat.java,
(parse): Set correct DST_OFFSET to the correct value.
2005-02-21 Mark Wielaard <mark@klomp.org>
* java/util/SimpleTimeZone.java (checkRule): Throw
IllegalArgumentException when month out of range.
2005-02-21 Sven de Marothy <sven@physto.se>
* java/util/GregorianCalendar.java,
(add): Don't set fields directly anymore. Use set()
2005-02-21 Mark Wielaard <mark@klomp.org>
* java/text/SimpleDateFormat.java (CompiledField.toString):
Use StringBuffer, not StringBuilder.
(toString): Likewise.
2005-02-21 Sven de Marothy <sven@physto.se>
* java/util/Calendar.java
(clear): Dates should clear to local time.
* java/util/GregorianCalendar.java
(computeTime): Fix priority problem with DAY_OF_WEEK,
Handle non-sunday-startig weeks and minimumDaysInFirstWeek.
2005-02-21 Sven de Marothy <sven@physto.se>
* java/util/Calendar.java
(Calendar): Constructor should clear fields.
2005-02-21 Sven de Marothy <sven@physto.se>
* java/text/SimpleDateFormat.java
(parse): Tweak handling of 2-year dates
* java/util/Calendar.java
(clear): Clear fields to correct value.
* java/util/GregorianCalendar.java
(computeTime): Correct handling of time zones.
Correct field minimum values.
2005-02-21 Sven de Marothy <sven@physto.se>
* java/util/Calendar.java
(set) Invalidate all fields on first call to set().
2005-02-21 Sven de Marothy <sven@physto.se>
* java/util/GregorianCalendar.java
(computeTime): Fixed handling of time zones.
2005-02-21 Sven de Marothy <sven@physto.se>
* java/util/Calendar.java
(clear): Set values to Epoch instead of zero.
(set): Set isSet to the relevant field pattern instead of just
the field.
* java/util/GregorianCalendar.java
(getBundle): Removed.
(getDayOfYear): Removed.
(getFirstDayOfMonth): New private method.
(nonLeniencyCheck): New private method.
(computeTime): Correct handling of insufficient data.
2005-02-21 Sven de Marothy <sven@physto.se>
* java/util/Calendar.java: Invalidate ERA field on setting
the YEAR.
* java/util/SimpleTimeZone.java:
(getDaysInMonth): Reimplemented.
* java/util/GregorianCalendar.java:
(getLinearTime): Removed.
(isLeapYear(int,boolean)): Removed.
(before(), after()): Removed.
(computeTime): Reimplemented.
2005-02-21 Sven de Marothy <sven@physto.se>
* java/util/Calendar.java: Reformatted.
* java/util/GregorianCalendar.java: Reformatted.
* java/util/SimpleTimeZone.java: Reformatted.
2005-02-21 Sven de Marothy <sven@physto.se>
* java/util/GregorianCalendar.java
(GregorianCalendar): Update fields in the constructor
2005-02-21 Noa Resare <noa@resare.com>
* java/util/Calendar.java (explicitDSTOffset): New instance field.
(set(int,int)): Set and use new field.
(set(int,int,int)): Check new field.
2005-02-21 Noa Resare <address@hidden>
* java/util/Calendar.java(set):
Fix for DST related regression.
2005-02-21 Jeroen Frijters <jeroen@frijters.net>
* java/util/Calendar.java
(setTimeInMillis): Added call to clear, removed computeFields call.
* java/util/Date.java
(Date(int,int,int,int,int,int)): Removed workaround for
GregorianCalendar bug.
* java/util/GregorianCalendar.java
(GregorianCalendar): Chained all constructors to a (new)
common constructor.
(computeTime): Fixed support for lenient month treatment.
(getLinearDay): Return long instead of int.
(calculateDay): Added fields argument and changed day argument
to long.
2005-02-21 Andrew John Hughes <gnu_andrew@member.fsf.org>
* java/text/SimpleDateFormat.java
Lots of documentation updates.
(readObject(java.io.ObjectInputStream)): Wraps
IllegalArgumentException as specified.
(compileFormat(String)): Uses standardChars
rather than the local pattern characters.
Throws IllegalArgumentException rather than
storing a -1 field.
(toString()): Extended to include all variables
in a better format.
(translateLocalizedPattern(String, String, String)):
Renamed to better define the use of this method.
2005-02-21 Andrew John Hughes <gnu_andrew@member.fsf.org>
* java/text/DateFormat.java:
Documented pattern character offset constants and
added new ones.
(Field): Added new static fields for new pattern chars.
* java/text/SimpleDateFormat.java:
(CompiledField): Changed name of FieldSizePair class
to CompiledField after adding the character as an
attribute. Changed fields to private and added
accessors to give encapsulation.
(CompiledField.CompiledField(int,int,char)): Extended
with character field.
(CompiledField.getField()): New accessor method.
(CompiledField.getSize()): New acceessor method.
(CompiledField.getCharacter()): New accessor method.
(CompiledField.toString()): Added primarily for debugging.
(standardChars): Now uses extended 24 character sequence.
(compileFormat(String)): Changed to use CompiledField.
(formatWithAttribute(java.util.Date, gnu.java.text.FormatBuffer,
java.text.FieldPosition)): Changed to use CompiledField.
New handler for RFC 822 timezones added.
2005-02-21 Andrew John Hughes <gnu_andrew@member.fsf.org>
* java/text/SimpleDateFormat.java:
(parse(String, java.text.ParsePosition)):
Changed 'E' and 'M' cases to use both
short and long names. Extended 'z'
case to also handle 'Z', and deal
with simple GMT offsets such as +0100.
(computeOffset(String)): New private method,
which converts a GMT offset specification,
such as GMT-0500 to a numeric offset in
milliseconds.
* java/util/TimeZone.java:
(timezones()): Added "CEST", the daylight
savings time version of "CET", or Central
European Time.
2005-02-21 Ito Kazumitsu <kaz@maczuka.gcd.org>
* java/text/SimpleDateFormat.java:
(parse): Set the DST offset to 0 when parsing
GMT offset timezones.
2005-02-21 Ito Kazumitsu <kaz@maczuka.gcd.org>
* java/text/SimpleDateFormat.java:
(parse): Use offset to set ZONE_OFFSET
rather than the DST_OFFSET, so that
GMT offset timezones change the right
one.
2005-02-21 Andrew John Hughes <gnu_andrew@member.fsf.org>
* java/text/SimpleDateFormat.java:
(getDateFormatSymbols()): return a copy
(setDateFormatSymbols(java.text.DateFormatSymbols)):
throw exception on null input
(clone()): implemented to clone
internal fields
2005-02-21 Sven de Marothy <sven@physto.se>
* java/text/SimpleDateFormat.java
(parse): comparison should be case-insensitive, ignore null
strings.
2005-02-21 Robert Schuster <theBohemian@gmx.net>
* gnu/java/beans/IntrospectionIncubator.java

View File

@ -159,7 +159,7 @@ public class LocaleInformation_en extends ListResourceBundle
{ "shortWeekdays", shortWeekdays },
{ "ampms", ampms },
{ "eras", eras },
{ "localPatternChars", "GyMdkHmsSEDFwWahKz" },
{ "localPatternChars", "GyMdkHmsSEDFwWahKzYeugAZ" },
{ "zoneStrings", zoneStrings },
{ "shortDateFormat", "M/d/yy" }, // Java's Y2K bug.

View File

@ -70,29 +70,221 @@ public abstract class DateFormat extends Format implements Cloneable
/* These constants need to have these exact values. They
* correspond to index positions within the localPatternChars
* string for a given locale. For example, the US locale uses
* the string "GyMdkHmsSEDFwWahKz", where 'G' is the character
* for era, 'y' for year, and so on down to 'z' for time zone.
* string for a given locale. Each locale may specify its
* own character for a particular field, but the position
* of these characters must correspond to an appropriate field
* number (as listed below), in order for their meaning to
* be determined. For example, the US locale uses
* the string "GyMdkHmsSEDFwWahKzYeugAZ", where 'G' is the character
* for era, 'y' for year, and so on down to 'Z' for time zone.
*/
/**
* Represents the position of the era
* pattern character in the array of
* localized pattern characters.
* For example, 'AD' is an era used
* in the Gregorian calendar system.
* In the U.S. locale, this is 'G'.
*/
public static final int ERA_FIELD = 0;
/**
* Represents the position of the year
* pattern character in the array of
* localized pattern characters.
* In the U.S. locale, this is 'y'.
*/
public static final int YEAR_FIELD = 1;
/**
* Represents the position of the month
* pattern character in the array of
* localized pattern characters.
* In the U.S. locale, this is 'M'.
*/
public static final int MONTH_FIELD = 2;
/**
* Represents the position of the date
* or day of the month pattern character
* in the array of localized pattern
* characters. In the U.S. locale,
* this is 'd'.
*/
public static final int DATE_FIELD = 3;
/**
* Represents the position of the 24
* hour pattern character in the array of
* localized pattern characters.
* In the U.S. locale, this is 'k'.
* This field numbers hours from 1 to 24.
*/
public static final int HOUR_OF_DAY1_FIELD = 4;
/**
* Represents the position of the 24
* hour pattern character in the array of
* localized pattern characters.
* In the U.S. locale, this is 'H'.
* This field numbers hours from 0 to 23.
*/
public static final int HOUR_OF_DAY0_FIELD = 5;
/**
* Represents the position of the minute
* pattern character in the array of
* localized pattern characters.
* In the U.S. locale, this is 'm'.
*/
public static final int MINUTE_FIELD = 6;
/**
* Represents the position of the second
* pattern character in the array of
* localized pattern characters.
* In the U.S. locale, this is 's'.
*/
public static final int SECOND_FIELD = 7;
/**
* Represents the position of the millisecond
* pattern character in the array of
* localized pattern characters.
* In the U.S. locale, this is 'S'.
*/
public static final int MILLISECOND_FIELD = 8;
/**
* Represents the position of the day of the
* week pattern character in the array of
* localized pattern characters.
* In the U.S. locale, this is 'E'.
*/
public static final int DAY_OF_WEEK_FIELD = 9;
/**
* Represents the position of the day of the
* year pattern character in the array of
* localized pattern characters.
* In the U.S. locale, this is 'D'.
*/
public static final int DAY_OF_YEAR_FIELD = 10;
/**
* Represents the position of the day of the
* week in the month pattern character in the
* array of localized pattern characters.
* In the U.S. locale, this is 'F'.
*/
public static final int DAY_OF_WEEK_IN_MONTH_FIELD = 11;
/**
* Represents the position of the week of the
* year pattern character in the array of
* localized pattern characters.
* In the U.S. locale, this is 'w'.
*/
public static final int WEEK_OF_YEAR_FIELD = 12;
/**
* Represents the position of the week of the
* month pattern character in the array of
* localized pattern characters.
* In the U.S. locale, this is 'W'.
*/
public static final int WEEK_OF_MONTH_FIELD = 13;
/**
* Represents the position of the am/pm
* pattern character in the array of
* localized pattern characters.
* In the U.S. locale, this is 'a'.
*/
public static final int AM_PM_FIELD = 14;
/**
* Represents the position of the 12
* hour pattern character in the array of
* localized pattern characters.
* In the U.S. locale, this is 'h'.
* This field numbers hours from 1 to 12.
*/
public static final int HOUR1_FIELD = 15;
/**
* Represents the position of the 12
* hour pattern character in the array of
* localized pattern characters.
* In the U.S. locale, this is 'K'.
* This field numbers hours from 0 to 11.
*/
public static final int HOUR0_FIELD = 16;
/**
* Represents the position of the generic
* timezone pattern character in the array of
* localized pattern characters.
* In the U.S. locale, this is 'z'.
*/
public static final int TIMEZONE_FIELD = 17;
/**
* Represents the position of the ISO year
* pattern character in the array of
* localized pattern characters.
* In the U.S. locale, this is 'Y'.
* This is a GNU extension in accordance with
* the CLDR data used. This value may
* differ from the normal year value.
*/
public static final int ISO_YEAR_FIELD = 18;
/**
* Represents the position of the localized
* day of the week pattern character in the
* array of localized pattern characters.
* In the U.S. locale, this is 'e'.
* This is a GNU extension in accordance with
* the CLDR data used. This value only
* differs from the day of the week with
* numeric formatting, in which case the
* locale's first day of the week is used.
*/
public static final int LOCALIZED_DAY_OF_WEEK_FIELD = 19;
/**
* Represents the position of the extended year
* pattern character in the array of
* localized pattern characters.
* In the U.S. locale, this is 'u'.
* This is a GNU extension in accordance with
* the CLDR data used. This value modifies
* the year value, so as to incorporate the era.
* For example, in the Gregorian calendar system,
* the extended year is negative instead of being
* marked as BC.
*/
public static final int EXTENDED_YEAR_FIELD = 20;
/**
* Represents the position of the modified Julian
* day pattern character in the array of
* localized pattern characters.
* In the U.S. locale, this is 'g'.
* This is a GNU extension in accordance with
* the CLDR data used. This value differs
* from the standard Julian day in that days
* are marked from midnight onwards rather than
* noon, and the local time zone affects the value.
* In simple terms, it can be thought of as all
* the date fields represented as a single number.
*/
public static final int MODIFIED_JULIAN_DAY_FIELD = 21;
/**
* Represents the position of the millisecond
* in the day pattern character in the array of
* localized pattern characters.
* In the U.S. locale, this is 'A'.
* This is a GNU extension in accordance with
* the CLDR data used. This value represents
* all the time fields (excluding the time zone)
* numerically, giving the number of milliseconds
* into the day (e.g. 10 in the morning would
* be 10 * 60 * 60 * 1000). Any daylight savings
* offset also affects this value.
*/
public static final int MILLISECOND_IN_DAY_FIELD = 22;
/**
* Represents the position of the RFC822
* timezone pattern character in the array of
* localized pattern characters.
* In the U.S. locale, this is 'Z'.
* This is a GNU extension in accordance with
* the CLDR data used. The value is the offset
* of the current time from GMT e.g. -0500 would
* be five hours prior to GMT.
*/
public static final int RFC822_TIMEZONE_FIELD = 23;
public static class Field extends Format.Field
{
@ -136,14 +328,28 @@ public abstract class DateFormat extends Format implements Cloneable
= new Field("hour0", Calendar.HOUR);
public static final DateFormat.Field TIME_ZONE
= new Field("timezone", Calendar.ZONE_OFFSET);
public static final DateFormat.Field ISO_YEAR
= new Field("iso year", Calendar.YEAR);
public static final DateFormat.Field LOCALIZED_DAY_OF_WEEK
= new Field("localized day of week", Calendar.DAY_OF_WEEK);
public static final DateFormat.Field EXTENDED_YEAR
= new Field("extended year", Calendar.YEAR);
public static final DateFormat.Field MODIFIED_JULIAN_DAY
= new Field("julian day", -1);
public static final DateFormat.Field MILLISECOND_IN_DAY
= new Field("millisecond in day", -1);
public static final DateFormat.Field RFC822_TIME_ZONE
= new Field("rfc822 timezone", Calendar.ZONE_OFFSET);
static final DateFormat.Field[] allFields =
{
ERA, YEAR, MONTH, DAY_OF_MONTH, HOUR_OF_DAY1,
HOUR_OF_DAY0, MINUTE, SECOND, MILLISECOND,
DAY_OF_WEEK, DAY_OF_YEAR, DAY_OF_WEEK_IN_MONTH,
WEEK_OF_YEAR, WEEK_OF_MONTH, AM_PM, HOUR1, HOUR0,
TIME_ZONE
TIME_ZONE, ISO_YEAR, LOCALIZED_DAY_OF_WEEK,
EXTENDED_YEAR, MODIFIED_JULIAN_DAY, MILLISECOND_IN_DAY,
RFC822_TIME_ZONE
};
// For deserialization

File diff suppressed because it is too large Load Diff

View File

@ -51,7 +51,7 @@ import java.lang.reflect.InvocationTargetException;
* integer fields which represent <code>YEAR</code>,
* <code>MONTH</code>, <code>DAY</code>, etc. The <code>Date</code>
* object represents a time in milliseconds since the Epoch. <br>
*
*
* This class is locale sensitive. To get the Object matching the
* current locale you can use <code>getInstance</code>. You can even provide
* a locale or a timezone. <code>getInstance</code> returns currently
@ -78,13 +78,13 @@ import java.lang.reflect.InvocationTargetException;
* and for the first line all fields are set, that line is used to
* compute the day. <br>
*
*
*
<pre>month + day_of_month
month + week_of_month + day_of_week
month + day_of_week_of_month + day_of_week
day_of_year
day_of_week + week_of_year</pre>
*
*
* The hour_of_day-field takes precedence over the ampm and
* hour_of_ampm fields. <br>
*
@ -92,7 +92,7 @@ day_of_week + week_of_year</pre>
*
* To convert a calendar to a human readable form and vice versa, use
* the <code>java.text.DateFormat</code> class. <br>
*
*
* Other useful things you can do with an calendar, is
* <code>roll</code>ing fields (that means increase/decrease a
* specific field by one, propagating overflows), or
@ -101,7 +101,7 @@ day_of_week + week_of_year</pre>
* @see Date
* @see GregorianCalendar
* @see TimeZone
* @see java.text.DateFormat
* @see java.text.DateFormat
*/
public abstract class Calendar implements Serializable, Cloneable
{
@ -109,43 +109,52 @@ public abstract class Calendar implements Serializable, Cloneable
* Constant representing the era time field.
*/
public static final int ERA = 0;
/**
* Constant representing the year time field.
*/
public static final int YEAR = 1;
/**
* Constant representing the month time field. This field
* should contain one of the JANUARY,...,DECEMBER constants below.
*/
public static final int MONTH = 2;
/**
* Constant representing the week of the year field.
* @see #setFirstDayOfWeek(int)
*/
public static final int WEEK_OF_YEAR = 3;
/**
* Constant representing the week of the month time field.
* @see #setFirstDayOfWeek(int)
*/
public static final int WEEK_OF_MONTH = 4;
/**
* Constant representing the day time field, synonym for DAY_OF_MONTH.
*/
public static final int DATE = 5;
/**
* Constant representing the day time field.
*/
public static final int DAY_OF_MONTH = 5;
/**
* Constant representing the day of year time field. This is
* 1 for the first day in month.
*/
public static final int DAY_OF_YEAR = 6;
/**
* Constant representing the day of week time field. This field
* should contain one of the SUNDAY,...,SATURDAY constants below.
*/
public static final int DAY_OF_WEEK = 7;
/**
* Constant representing the day-of-week-in-month field. For
* instance this field contains 2 for the second thursday in a
@ -153,42 +162,51 @@ public abstract class Calendar implements Serializable, Cloneable
* from the end of the month.
*/
public static final int DAY_OF_WEEK_IN_MONTH = 8;
/**
* Constant representing the part of the day for 12-hour clock. This
* should be one of AM or PM.
*/
public static final int AM_PM = 9;
/**
* Constant representing the hour time field for 12-hour clock.
*/
public static final int HOUR = 10;
/**
* Constant representing the hour of day time field for 24-hour clock.
*/
public static final int HOUR_OF_DAY = 11;
/**
* Constant representing the minute of hour time field.
*/
public static final int MINUTE = 12;
/**
* Constant representing the second time field.
*/
public static final int SECOND = 13;
/**
* Constant representing the millisecond time field.
*/
public static final int MILLISECOND = 14;
/**
* Constant representing the time zone offset time field for the
* time given in the other fields. It is measured in
* milliseconds. The default is the offset of the time zone.
* milliseconds. The default is the offset of the time zone.
*/
public static final int ZONE_OFFSET = 15;
/**
* Constant representing the daylight saving time offset in
* milliseconds. The default is the value given by the time zone.
* milliseconds. The default is the value given by the time zone.
*/
public static final int DST_OFFSET = 16;
/**
* Number of time fields.
*/
@ -198,26 +216,32 @@ public abstract class Calendar implements Serializable, Cloneable
* Constant representing Sunday.
*/
public static final int SUNDAY = 1;
/**
* Constant representing Monday.
*/
public static final int MONDAY = 2;
/**
* Constant representing Tuesday.
*/
public static final int TUESDAY = 3;
/**
* Constant representing Wednesday.
*/
public static final int WEDNESDAY = 4;
/**
* Constant representing Thursday.
*/
public static final int THURSDAY = 5;
/**
* Constant representing Friday.
*/
public static final int FRIDAY = 6;
/**
* Constant representing Saturday.
*/
@ -227,50 +251,62 @@ public abstract class Calendar implements Serializable, Cloneable
* Constant representing January.
*/
public static final int JANUARY = 0;
/**
* Constant representing February.
*/
public static final int FEBRUARY = 1;
/**
* Constant representing March.
*/
public static final int MARCH = 2;
/**
* Constant representing April.
*/
public static final int APRIL = 3;
/**
* Constant representing May.
*/
public static final int MAY = 4;
/**
* Constant representing June.
*/
public static final int JUNE = 5;
/**
* Constant representing July.
*/
public static final int JULY = 6;
/**
* Constant representing August.
*/
public static final int AUGUST = 7;
/**
* Constant representing September.
*/
public static final int SEPTEMBER = 8;
/**
* Constant representing October.
*/
public static final int OCTOBER = 9;
/**
* Constant representing November.
*/
public static final int NOVEMBER = 10;
/**
* Constant representing December.
*/
public static final int DECEMBER = 11;
/**
* Constant representing Undecimber. This is an artificial name useful
* for lunar calendars.
@ -281,6 +317,7 @@ public abstract class Calendar implements Serializable, Cloneable
* Useful constant for 12-hour clock.
*/
public static final int AM = 0;
/**
* Useful constant for 12-hour clock.
*/
@ -292,21 +329,25 @@ public abstract class Calendar implements Serializable, Cloneable
* @serial
*/
protected int[] fields = new int[FIELD_COUNT];
/**
* The flags which tell if the fields above have a value.
* @serial
*/
protected boolean[] isSet = new boolean[FIELD_COUNT];
/**
* The time in milliseconds since the epoch.
* @serial
*/
protected long time;
/**
* Tells if the above field has a valid value.
* @serial
*/
protected boolean isTimeSet;
/**
* Tells if the fields have a valid value. This superseeds the isSet
* array.
@ -332,7 +373,7 @@ public abstract class Calendar implements Serializable, Cloneable
/**
* Sets what the first day of week is. This is used for
* WEEK_OF_MONTH and WEEK_OF_YEAR fields.
* WEEK_OF_MONTH and WEEK_OF_YEAR fields.
* @serial
*/
private int firstDayOfWeek;
@ -347,7 +388,14 @@ public abstract class Calendar implements Serializable, Cloneable
private int minimalDaysInFirstWeek;
/**
* The version of the serialized data on the stream.
* Is set to true if DST_OFFSET is explicitly set. In that case
* it's value overrides the value computed from the current
* time and the timezone.
*/
private boolean explicitDSTOffset = false;
/**
* The version of the serialized data on the stream.
* <dl><dt>0 or not present</dt>
* <dd> JDK 1.1.5 or later.</dd>
* <dl><dt>1</dt>
@ -371,14 +419,14 @@ public abstract class Calendar implements Serializable, Cloneable
private static final String bundleName = "gnu.java.locale.Calendar";
/**
* get resource bundle:
* get resource bundle:
* The resources should be loaded via this method only. Iff an application
* uses this method, the resourcebundle is required.
* uses this method, the resourcebundle is required.
*/
private static ResourceBundle getBundle(Locale locale)
private static ResourceBundle getBundle(Locale locale)
{
return ResourceBundle.getBundle(bundleName, locale,
ClassLoader.getSystemClassLoader());
ClassLoader.getSystemClassLoader());
}
/**
@ -404,8 +452,9 @@ public abstract class Calendar implements Serializable, Cloneable
ResourceBundle rb = getBundle(locale);
firstDayOfWeek = ((Integer) rb.getObject("firstDayOfWeek")).intValue();
minimalDaysInFirstWeek =
((Integer) rb.getObject("minimalDaysInFirstWeek")).intValue();
minimalDaysInFirstWeek = ((Integer) rb.getObject("minimalDaysInFirstWeek"))
.intValue();
clear();
}
/**
@ -437,15 +486,17 @@ public abstract class Calendar implements Serializable, Cloneable
return getInstance(TimeZone.getDefault(), locale);
}
/**
/**
* Cache of locale->calendar-class mappings. This avoids having to do a ResourceBundle
* lookup for every getInstance call.
* lookup for every getInstance call.
*/
private static HashMap cache = new HashMap();
/** Preset argument types for calendar-class constructor lookup. */
private static Class[] ctorArgTypes
= new Class[] {TimeZone.class, Locale.class};
private static Class[] ctorArgTypes = new Class[]
{
TimeZone.class, Locale.class
};
/**
* Creates a calendar representing the actual time, using the given
@ -473,7 +524,7 @@ public abstract class Calendar implements Serializable, Cloneable
}
}
// GregorianCalendar is by far the most common case. Optimize by
// GregorianCalendar is by far the most common case. Optimize by
// avoiding reflection.
if (calendarClass == GregorianCalendar.class)
return new GregorianCalendar(zone, locale);
@ -481,7 +532,7 @@ public abstract class Calendar implements Serializable, Cloneable
if (Calendar.class.isAssignableFrom(calendarClass))
{
Constructor ctor = calendarClass.getConstructor(ctorArgTypes);
return (Calendar) ctor.newInstance(new Object[] {zone, locale});
return (Calendar) ctor.newInstance(new Object[] { zone, locale });
}
}
catch (ClassNotFoundException ex)
@ -504,9 +555,9 @@ public abstract class Calendar implements Serializable, Cloneable
{
exception = ex;
}
throw new RuntimeException("Error instantiating calendar for locale " +
locale, exception);
throw new RuntimeException("Error instantiating calendar for locale "
+ locale, exception);
}
/**
@ -530,7 +581,7 @@ public abstract class Calendar implements Serializable, Cloneable
* Converts the milliseconds since the epoch UTC
* (<code>time</code>) to time fields
* (<code>fields</code>). Override this method if you write your
* own Calendar.
* own Calendar.
*/
protected abstract void computeFields();
@ -541,7 +592,7 @@ public abstract class Calendar implements Serializable, Cloneable
*/
public final Date getTime()
{
if (!isTimeSet)
if (! isTimeSet)
computeTime();
return new Date(time);
}
@ -562,7 +613,7 @@ public abstract class Calendar implements Serializable, Cloneable
*/
public long getTimeInMillis()
{
if (!isTimeSet)
if (! isTimeSet)
computeTime();
return time;
}
@ -575,9 +626,9 @@ public abstract class Calendar implements Serializable, Cloneable
*/
public void setTimeInMillis(long time)
{
clear();
this.time = time;
isTimeSet = true;
computeFields();
}
/**
@ -593,14 +644,14 @@ public abstract class Calendar implements Serializable, Cloneable
public int get(int field)
{
// If the requested field is invalid, force all fields to be recomputed.
if (!isSet[field])
if (! isSet[field])
areFieldsSet = false;
complete();
return fields[field];
}
/**
* Gets the value of the specified field. This method doesn't
* Gets the value of the specified field. This method doesn't
* recompute the fields, if they are invalid.
* @param field the time field. One of the time field constants.
* @return the value of the specified field, undefined if
@ -626,21 +677,72 @@ public abstract class Calendar implements Serializable, Cloneable
*/
public void set(int field, int value)
{
if (isTimeSet)
for (int i = 0; i < FIELD_COUNT; i++)
isSet[i] = false;
isTimeSet = false;
fields[field] = value;
isSet[field] = true;
// The five valid date patterns, in order of priority
// 1 YEAR + MONTH + DAY_OF_MONTH
// 2 YEAR + MONTH + WEEK_OF_MONTH + DAY_OF_WEEK
// 3 YEAR + MONTH + DAY_OF_WEEK_IN_MONTH + DAY_OF_WEEK
// 4 YEAR + DAY_OF_YEAR
// 5 YEAR + DAY_OF_WEEK + WEEK_OF_YEAR
switch (field)
{
case YEAR:
case MONTH:
case DATE:
isSet[WEEK_OF_YEAR] = false;
case MONTH: // pattern 1,2 or 3
isSet[DAY_OF_YEAR] = false;
isSet[WEEK_OF_MONTH] = false;
isSet[WEEK_OF_YEAR] = false;
break;
case DAY_OF_MONTH: // pattern 1
isSet[YEAR] = true;
isSet[MONTH] = true;
isSet[WEEK_OF_MONTH] = true;
isSet[DAY_OF_WEEK] = false;
isSet[DAY_OF_WEEK_IN_MONTH] = false;
isSet[DAY_OF_YEAR] = false;
isSet[WEEK_OF_YEAR] = false;
break;
case WEEK_OF_MONTH: // pattern 2
isSet[YEAR] = true;
isSet[MONTH] = true;
isSet[DAY_OF_WEEK] = true;
isSet[DAY_OF_MONTH] = false;
isSet[DAY_OF_WEEK_IN_MONTH] = false;
isSet[DAY_OF_YEAR] = false;
isSet[WEEK_OF_YEAR] = false;
break;
case DAY_OF_WEEK_IN_MONTH: // pattern 3
isSet[YEAR] = true;
isSet[MONTH] = true;
isSet[DAY_OF_WEEK] = true;
isSet[DAY_OF_YEAR] = false;
isSet[DAY_OF_MONTH] = false;
isSet[WEEK_OF_MONTH] = false;
isSet[WEEK_OF_YEAR] = false;
break;
case DAY_OF_YEAR: // pattern 4
isSet[YEAR] = true;
isSet[MONTH] = false;
isSet[WEEK_OF_MONTH] = false;
isSet[DAY_OF_MONTH] = false;
isSet[DAY_OF_WEEK] = false;
isSet[WEEK_OF_YEAR] = false;
isSet[DAY_OF_WEEK_IN_MONTH] = false;
break;
case WEEK_OF_YEAR: // pattern 5
isSet[YEAR] = true;
isSet[DAY_OF_WEEK] = true;
isSet[MONTH] = false;
isSet[DAY_OF_MONTH] = false;
isSet[WEEK_OF_MONTH] = false;
isSet[DAY_OF_YEAR] = false;
isSet[DAY_OF_WEEK_IN_MONTH] = false;
break;
case AM_PM:
isSet[HOUR] = true;
isSet[HOUR_OF_DAY] = false;
break;
case HOUR_OF_DAY:
@ -648,12 +750,15 @@ public abstract class Calendar implements Serializable, Cloneable
isSet[HOUR] = false;
break;
case HOUR:
isSet[AM_PM] = true;
isSet[HOUR_OF_DAY] = false;
break;
case DST_OFFSET:
explicitDSTOffset = true;
}
// May have crossed over a DST boundary.
if (field != DST_OFFSET && field != ZONE_OFFSET)
if (! explicitDSTOffset && (field != DST_OFFSET && field != ZONE_OFFSET))
isSet[DST_OFFSET] = false;
}
@ -675,8 +780,10 @@ public abstract class Calendar implements Serializable, Cloneable
isSet[WEEK_OF_MONTH] = false;
isSet[DAY_OF_WEEK] = false;
isSet[DAY_OF_WEEK_IN_MONTH] = false;
isSet[ERA] = false;
isSet[DST_OFFSET] = false; // May have crossed a DST boundary.
if (! explicitDSTOffset)
isSet[DST_OFFSET] = false; // May have crossed a DST boundary.
}
/**
@ -706,8 +813,8 @@ public abstract class Calendar implements Serializable, Cloneable
* @param minute the minute.
* @param second the second.
*/
public final void set(int year, int month, int date,
int hour, int minute, int second)
public final void set(int year, int month, int date, int hour, int minute,
int second)
{
set(year, month, date, hour, minute);
fields[SECOND] = second;
@ -721,11 +828,15 @@ public abstract class Calendar implements Serializable, Cloneable
{
isTimeSet = false;
areFieldsSet = false;
int zoneOffs = zone.getRawOffset();
int[] tempFields =
{
1, 1970, JANUARY, 1, 1, 1, 1, THURSDAY, 1, AM, 0, 0, 0,
0, 0, zoneOffs, 0
};
fields = tempFields;
for (int i = 0; i < FIELD_COUNT; i++)
{
isSet[i] = false;
fields[i] = 0;
}
isSet[i] = false;
}
/**
@ -737,10 +848,15 @@ public abstract class Calendar implements Serializable, Cloneable
*/
public final void clear(int field)
{
int[] tempFields =
{
1, 1970, JANUARY, 1, 1, 1, 1, THURSDAY, 1, AM, 0, 0, 0,
0, 0, zone.getRawOffset(), 0
};
isTimeSet = false;
areFieldsSet = false;
isSet[field] = false;
fields[field] = 0;
fields[field] = tempFields[field];
}
/**
@ -757,18 +873,18 @@ public abstract class Calendar implements Serializable, Cloneable
/**
* Fills any unset fields in the time field list
* @return true if the specified field has a value.
* @return true if the specified field has a value.
*/
protected void complete()
{
if (!isTimeSet)
if (! isTimeSet)
computeTime();
if (!areFieldsSet)
if (! areFieldsSet)
computeFields();
}
/**
* Compares the given calendar with this.
* Compares the given calendar with this.
* @param o the object to that we should compare.
* @return true, if the given object is a calendar, that represents
* the same time (but doesn't necessary have the same fields).
@ -776,12 +892,12 @@ public abstract class Calendar implements Serializable, Cloneable
public boolean equals(Object o)
{
return (o instanceof Calendar)
&& getTimeInMillis() == ((Calendar) o).getTimeInMillis();
&& getTimeInMillis() == ((Calendar) o).getTimeInMillis();
}
/**
* Returns a hash code for this calendar.
* @return a hash code, which fullfits the general contract of
* @return a hash code, which fullfits the general contract of
* <code>hashCode()</code>
*/
public int hashCode()
@ -791,7 +907,7 @@ public abstract class Calendar implements Serializable, Cloneable
}
/**
* Compares the given calendar with this.
* Compares the given calendar with this.
* @param o the object to that we should compare.
* @return true, if the given object is a calendar, and this calendar
* represents a smaller time than the calendar o.
@ -804,7 +920,7 @@ public abstract class Calendar implements Serializable, Cloneable
}
/**
* Compares the given calendar with this.
* Compares the given calendar with this.
* @param o the object to that we should compare.
* @return true, if the given object is a calendar, and this calendar
* represents a bigger time than the calendar o.
@ -831,11 +947,11 @@ public abstract class Calendar implements Serializable, Cloneable
/**
* Rolls the specified time field up or down. This means add one
* to the specified field, but don't change the other fields. If
* the maximum for this field is reached, start over with the
* the maximum for this field is reached, start over with the
* minimum value. <br>
*
* <strong>Note:</strong> There may be situation, where the other
* fields must be changed, e.g rolling the month on May, 31.
* fields must be changed, e.g rolling the month on May, 31.
* The date June, 31 is automatically converted to July, 1.
* @param field the time field. One of the time field constants.
* @param up the direction, true for up, false for down.
@ -854,7 +970,7 @@ public abstract class Calendar implements Serializable, Cloneable
*
* @param field the time field. One of the time field constants.
* @param amount the amount to roll by, positive for rolling up,
* negative for rolling down.
* negative for rolling down.
* @throws ArrayIndexOutOfBoundsException if the field is outside
* the valid range. The value of field must be >= 0 and
* <= <code>FIELD_COUNT</code>.
@ -874,7 +990,6 @@ public abstract class Calendar implements Serializable, Cloneable
}
}
/**
* Sets the time zone to the specified value.
* @param zone the new time zone
@ -918,7 +1033,7 @@ public abstract class Calendar implements Serializable, Cloneable
/**
* Sets what the first day of week is. This is used for
* WEEK_OF_MONTH and WEEK_OF_YEAR fields.
* WEEK_OF_MONTH and WEEK_OF_YEAR fields.
* @param value the first day of week. One of SUNDAY to SATURDAY.
*/
public void setFirstDayOfWeek(int value)
@ -928,7 +1043,7 @@ public abstract class Calendar implements Serializable, Cloneable
/**
* Gets what the first day of week is. This is used for
* WEEK_OF_MONTH and WEEK_OF_YEAR fields.
* WEEK_OF_MONTH and WEEK_OF_YEAR fields.
* @return the first day of week. One of SUNDAY to SATURDAY.
*/
public int getFirstDayOfWeek()
@ -972,7 +1087,6 @@ public abstract class Calendar implements Serializable, Cloneable
*/
public abstract int getMaximum(int field);
/**
* Gets the greatest minimum value that is allowed for the specified field.
* @param field the time field. One of the time field constants.
@ -984,7 +1098,7 @@ public abstract class Calendar implements Serializable, Cloneable
* Gets the smallest maximum value that is allowed for the
* specified field. For example this is 28 for DAY_OF_MONTH.
* @param field the time field. One of the time field constants.
* @return the least maximum value.
* @return the least maximum value.
*/
public abstract int getLeastMaximum(int field);
@ -1000,16 +1114,15 @@ public abstract class Calendar implements Serializable, Cloneable
*/
public int getActualMinimum(int field)
{
Calendar tmp = (Calendar)clone(); // To avoid restoring state
Calendar tmp = (Calendar) clone(); // To avoid restoring state
int min = tmp.getGreatestMinimum(field);
int end = tmp.getMinimum(field);
tmp.set(field, min);
for (; min > end; min--)
{
tmp.add(field, -1); // Try to get smaller
tmp.add(field, -1); // Try to get smaller
if (tmp.get(field) != min - 1)
break; // Done if not successful
break; // Done if not successful
}
return min;
}
@ -1018,7 +1131,7 @@ public abstract class Calendar implements Serializable, Cloneable
* Gets the actual maximum value that is allowed for the specified field.
* This value is dependent on the values of the other fields.
* @param field the time field. One of the time field constants.
* @return the actual maximum value.
* @return the actual maximum value.
* @throws ArrayIndexOutOfBoundsException if the field is outside
* the valid range. The value of field must be >= 0 and
* <= <code>FIELD_COUNT</code>.
@ -1026,7 +1139,7 @@ public abstract class Calendar implements Serializable, Cloneable
*/
public int getActualMaximum(int field)
{
Calendar tmp = (Calendar)clone(); // To avoid restoring state
Calendar tmp = (Calendar) clone(); // To avoid restoring state
int max = tmp.getLeastMaximum(field);
int end = tmp.getMaximum(field);
tmp.set(field, max);
@ -1048,7 +1161,7 @@ public abstract class Calendar implements Serializable, Cloneable
{
Calendar cal = (Calendar) super.clone();
cal.fields = (int[]) fields.clone();
cal.isSet = (boolean[])isSet.clone();
cal.isSet = (boolean[]) isSet.clone();
return cal;
}
catch (CloneNotSupportedException ex)
@ -1057,16 +1170,19 @@ public abstract class Calendar implements Serializable, Cloneable
}
}
private static final String[] fieldNames = {
",ERA=", ",YEAR=", ",MONTH=",
",WEEK_OF_YEAR=", ",WEEK_OF_MONTH=",
",DAY_OF_MONTH=", ",DAY_OF_YEAR=", ",DAY_OF_WEEK=",
",DAY_OF_WEEK_IN_MONTH=",
",AM_PM=", ",HOUR=", ",HOUR_OF_DAY=",
",MINUTE=", ",SECOND=", ",MILLISECOND=",
",ZONE_OFFSET=", ",DST_OFFSET="
};
private static final String[] fieldNames =
{
",ERA=", ",YEAR=", ",MONTH=",
",WEEK_OF_YEAR=",
",WEEK_OF_MONTH=",
",DAY_OF_MONTH=",
",DAY_OF_YEAR=", ",DAY_OF_WEEK=",
",DAY_OF_WEEK_IN_MONTH=",
",AM_PM=", ",HOUR=",
",HOUR_OF_DAY=", ",MINUTE=",
",SECOND=", ",MILLISECOND=",
",ZONE_OFFSET=", ",DST_OFFSET="
};
/**
* Returns a string representation of this object. It is mainly
@ -1109,7 +1225,7 @@ public abstract class Calendar implements Serializable, Cloneable
* says, that it could be omitted. */
private void writeObject(ObjectOutputStream stream) throws IOException
{
if (!isTimeSet)
if (! isTimeSet)
computeTime();
stream.defaultWriteObject();
}
@ -1121,7 +1237,7 @@ public abstract class Calendar implements Serializable, Cloneable
throws IOException, ClassNotFoundException
{
stream.defaultReadObject();
if (!isTimeSet)
if (! isTimeSet)
computeTime();
if (serialVersionOnStream > 1)
@ -1130,7 +1246,6 @@ public abstract class Calendar implements Serializable, Cloneable
// Sun wants to remove all fields from the stream someday
// and will then increase the serialVersion number again.
// We prepare to be compatible.
fields = new int[FIELD_COUNT];
isSet = new boolean[FIELD_COUNT];
areFieldsSet = false;

File diff suppressed because it is too large Load Diff

View File

@ -38,6 +38,7 @@ exception statement from your version. */
package java.util;
/**
* This class represents a simple time zone offset and handles
* daylight savings. It can only handle one daylight savings rule, so
@ -49,14 +50,14 @@ package java.util;
* lying in the AD era.
*
* @see Calendar
* @see GregorianCalender
* @see GregorianCalender
* @author Jochen Hoenicke
*/
public class SimpleTimeZone extends TimeZone
{
/**
* The raw time zone offset in milliseconds to GMT, ignoring
* daylight savings.
* daylight savings.
* @serial
*/
private int rawOffset;
@ -70,23 +71,22 @@ public class SimpleTimeZone extends TimeZone
/**
* The daylight savings offset. This is a positive offset in
* milliseconds with respect to standard time. Typically this
* is one hour, but for some time zones this may be half an hour.
* is one hour, but for some time zones this may be half an our.
* @serial
* @since JDK1.1.4
*/
private int dstSavings = 60 * 60 * 1000;
/**
* The first year, in which daylight savings rules applies.
* The first year, in which daylight savings rules applies.
* @serial
*/
private int startYear;
private static final int DOM_MODE = 1;
private static final int DOW_IN_MONTH_MODE = 2;
private static final int DOW_GE_DOM_MODE = 3;
private static final int DOW_LE_DOM_MODE = 4;
/**
* The mode of the start rule. This takes one of the following values:
* <dl>
@ -119,7 +119,7 @@ public class SimpleTimeZone extends TimeZone
/**
* The month in which daylight savings start. This is one of the
* constants Calendar.JANUARY, ..., Calendar.DECEMBER.
* constants Calendar.JANUARY, ..., Calendar.DECEMBER.
* @serial
*/
private int startMonth;
@ -128,21 +128,21 @@ public class SimpleTimeZone extends TimeZone
* This variable can have different meanings. See startMode for details
* @see #startMode;
* @serial
*/
*/
private int startDay;
/**
* This variable specifies the day of week the change takes place. If
* This variable specifies the day of week the change takes place. If
* startMode == DOM_MODE, this is undefined.
* @serial
* @see #startMode;
*/
*/
private int startDayOfWeek;
/**
* This variable specifies the time of change to daylight savings.
* This time is given in milliseconds after midnight local
* standard time.
* standard time.
* @serial
*/
private int startTime;
@ -157,9 +157,9 @@ public class SimpleTimeZone extends TimeZone
/**
* The month in which daylight savings ends. This is one of the
* constants Calendar.JANUARY, ..., Calendar.DECEMBER.
* constants Calendar.JANUARY, ..., Calendar.DECEMBER.
* @serial
*/
*/
private int endMonth;
/**
@ -167,7 +167,7 @@ public class SimpleTimeZone extends TimeZone
* It can take the same values as startMode.
* @serial
* @see #startMode
*/
*/
private int endMode;
/**
@ -176,19 +176,19 @@ public class SimpleTimeZone extends TimeZone
* @see #startMode;
*/
private int endDay;
/**
* This variable specifies the day of week the change takes place. If
* This variable specifies the day of week the change takes place. If
* endMode == DOM_MODE, this is undefined.
* @serial
* @see #startMode;
*/
private int endDayOfWeek;
/**
* This variable specifies the time of change back to standard time.
* This time is given in milliseconds after midnight local
* standard time.
* standard time.
* @serial
*/
private int endTime;
@ -210,8 +210,11 @@ public class SimpleTimeZone extends TimeZone
* @serial
*/
private byte[] monthLength = monthArr;
private static final byte[] monthArr =
{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
private static final byte[] monthArr =
{
31, 28, 31, 30, 31, 30, 31, 31, 30,
31, 30, 31
};
/**
* The version of the serialized data on the stream.
@ -232,10 +235,9 @@ public class SimpleTimeZone extends TimeZone
* When streaming out this class it is always written in the latest
* version.
* @serial
* @since JDK1.1.4
* @since JDK1.1.4
*/
private int serialVersionOnStream = 2;
private static final long serialVersionUID = -403250971215465050L;
/**
@ -257,9 +259,9 @@ public class SimpleTimeZone extends TimeZone
/**
* Create a <code>SimpleTimeZone</code> with the given time offset
* from GMT and without daylight savings.
* from GMT and without daylight savings.
* @param rawOffset the time offset from GMT in milliseconds.
* @param id The identifier of this time zone.
* @param id The identifier of this time zone.
*/
public SimpleTimeZone(int rawOffset, String id)
{
@ -273,7 +275,7 @@ public class SimpleTimeZone extends TimeZone
* Create a <code>SimpleTimeZone</code> with the given time offset
* from GMT and with daylight savings. The start/end parameters
* can have different meaning (replace WEEKDAY with a real day of
* week). Only the first two meanings were supported by earlier
* week). Only the first two meanings were supported by earlier
* versions of jdk.
*
* <dl>
@ -296,12 +298,12 @@ public class SimpleTimeZone extends TimeZone
* must make sure that this day lies in the same month. </dd>
* </dl>
*
* If you give a non existing month, a day that is zero, or too big,
* If you give a non existing month, a day that is zero, or too big,
* or a dayOfWeek that is too big, the result is undefined.
*
* The start rule must have a different month than the end rule.
* This restriction shouldn't hurt for all possible time zones.
*
*
* @param rawOffset The time offset from GMT in milliseconds.
* @param id The identifier of this time zone.
* @param startMonth The start month of daylight savings; use the
@ -312,29 +314,26 @@ public class SimpleTimeZone extends TimeZone
* @param startTime A time in millis in standard time.
* @param endMonth The end month of daylight savings; use the
* constants in Calendar.
* @param endday A day in month or a day of week number, as
* @param endday A day in month or a day of week number, as
* described above.
* @param endDayOfWeek The end rule day of week; see above.
* @param endTime A time in millis in standard time.
* @throws IllegalArgumentException if parameters are invalid or out of
* range.
*/
public SimpleTimeZone(int rawOffset, String id,
int startMonth, int startDayOfWeekInMonth,
int startDayOfWeek, int startTime,
int endMonth, int endDayOfWeekInMonth,
int endDayOfWeek, int endTime)
public SimpleTimeZone(int rawOffset, String id, int startMonth,
int startDayOfWeekInMonth, int startDayOfWeek,
int startTime, int endMonth, int endDayOfWeekInMonth,
int endDayOfWeek, int endTime)
{
this.rawOffset = rawOffset;
setID(id);
useDaylight = true;
setStartRule(startMonth, startDayOfWeekInMonth,
startDayOfWeek, startTime);
setStartRule(startMonth, startDayOfWeekInMonth, startDayOfWeek, startTime);
setEndRule(endMonth, endDayOfWeekInMonth, endDayOfWeek, endTime);
if (startMonth == endMonth)
throw new IllegalArgumentException
("startMonth and endMonth must be different");
throw new IllegalArgumentException("startMonth and endMonth must be different");
this.startYear = 0;
}
@ -347,15 +346,13 @@ public class SimpleTimeZone extends TimeZone
* time in milliseconds. This must be positive.
* @since 1.2
*/
public SimpleTimeZone(int rawOffset, String id,
int startMonth, int startDayOfWeekInMonth,
int startDayOfWeek, int startTime,
int endMonth, int endDayOfWeekInMonth,
int endDayOfWeek, int endTime, int dstSavings)
public SimpleTimeZone(int rawOffset, String id, int startMonth,
int startDayOfWeekInMonth, int startDayOfWeek,
int startTime, int endMonth, int endDayOfWeekInMonth,
int endDayOfWeek, int endTime, int dstSavings)
{
this(rawOffset, id,
startMonth, startDayOfWeekInMonth, startDayOfWeek, startTime,
endMonth, endDayOfWeekInMonth, endDayOfWeek, endTime);
this(rawOffset, id, startMonth, startDayOfWeekInMonth, startDayOfWeek,
startTime, endMonth, endDayOfWeekInMonth, endDayOfWeek, endTime);
this.dstSavings = dstSavings;
}
@ -376,12 +373,11 @@ public class SimpleTimeZone extends TimeZone
* range.
* @since 1.4
*/
public SimpleTimeZone(int rawOffset, String id,
int startMonth, int startDayOfWeekInMonth,
int startDayOfWeek, int startTime, int startTimeMode,
int endMonth, int endDayOfWeekInMonth,
int endDayOfWeek, int endTime, int endTimeMode,
int dstSavings)
public SimpleTimeZone(int rawOffset, String id, int startMonth,
int startDayOfWeekInMonth, int startDayOfWeek,
int startTime, int startTimeMode, int endMonth,
int endDayOfWeekInMonth, int endDayOfWeek,
int endTime, int endTimeMode, int dstSavings)
{
this.rawOffset = rawOffset;
setID(id);
@ -394,12 +390,10 @@ public class SimpleTimeZone extends TimeZone
this.startTimeMode = startTimeMode;
this.endTimeMode = endTimeMode;
setStartRule(startMonth, startDayOfWeekInMonth,
startDayOfWeek, startTime);
setStartRule(startMonth, startDayOfWeekInMonth, startDayOfWeek, startTime);
setEndRule(endMonth, endDayOfWeekInMonth, endDayOfWeek, endTime);
if (startMonth == endMonth)
throw new IllegalArgumentException
("startMonth and endMonth must be different");
throw new IllegalArgumentException("startMonth and endMonth must be different");
this.startYear = 0;
this.dstSavings = dstSavings;
@ -432,6 +426,7 @@ public class SimpleTimeZone extends TimeZone
{
if (month < 0 || month > 11)
throw new IllegalArgumentException("month out of range");
int daysInMonth = getDaysInMonth(month, 1);
if (dayOfWeek == 0)
{
@ -460,7 +455,6 @@ public class SimpleTimeZone extends TimeZone
}
}
/**
* Sets the daylight savings start rule. You must also set the
* end rule with <code>setEndRule</code> or the result of
@ -514,14 +508,16 @@ public class SimpleTimeZone extends TimeZone
* @since 1.2
* @see SimpleTimeZone
*/
public void setStartRule(int month, int day, int dayOfWeek, int time, boolean after)
public void setStartRule(int month, int day, int dayOfWeek, int time,
boolean after)
{
// FIXME: XXX: Validate that checkRule and offset processing work with on
// or before mode.
this.startDay = after ? Math.abs(day) : -Math.abs(day);
this.startDayOfWeek = after ? Math.abs(dayOfWeek) : -Math.abs(dayOfWeek);
this.startMode = (dayOfWeek != 0) ? (after ? DOW_GE_DOM_MODE : DOW_LE_DOM_MODE)
: checkRule(month, day, dayOfWeek);
this.startMode = (dayOfWeek != 0)
? (after ? DOW_GE_DOM_MODE : DOW_LE_DOM_MODE)
: checkRule(month, day, dayOfWeek);
this.startDay = Math.abs(this.startDay);
this.startDayOfWeek = Math.abs(this.startDayOfWeek);
@ -591,7 +587,7 @@ public class SimpleTimeZone extends TimeZone
*
* Note that this API isn't incredibly well specified. It appears that the
* after flag must override the parameters, since normally, the day and
* dayofweek can select this. I.e., if day &lt; 0 and dayOfWeek &lt; 0, on or
* dayofweek can select this. I.e., if day < 0 and dayOfWeek < 0, on or
* before mode is chosen. But if after == true, this implementation
* overrides the signs of the other arguments. And if dayOfWeek == 0, it
* falls back to the behavior in the other APIs. I guess this should be
@ -606,14 +602,16 @@ public class SimpleTimeZone extends TimeZone
* @since 1.2
* @see #setStartRule
*/
public void setEndRule(int month, int day, int dayOfWeek, int time, boolean after)
public void setEndRule(int month, int day, int dayOfWeek, int time,
boolean after)
{
// FIXME: XXX: Validate that checkRule and offset processing work with on
// or before mode.
this.endDay = after ? Math.abs(day) : -Math.abs(day);
this.endDayOfWeek = after ? Math.abs(dayOfWeek) : -Math.abs(dayOfWeek);
this.endMode = (dayOfWeek != 0) ? (after ? DOW_GE_DOM_MODE : DOW_LE_DOM_MODE)
: checkRule(month, day, dayOfWeek);
this.endMode = (dayOfWeek != 0)
? (after ? DOW_GE_DOM_MODE : DOW_LE_DOM_MODE)
: checkRule(month, day, dayOfWeek);
this.endDay = Math.abs(this.endDay);
this.endDayOfWeek = Math.abs(endDayOfWeek);
@ -648,7 +646,7 @@ public class SimpleTimeZone extends TimeZone
}
/**
* Gets the time zone offset, for current date, modified in case of
* Gets the time zone offset, for current date, modified in case of
* daylight savings. This is the offset to add to UTC to get the local
* time.
*
@ -674,8 +672,8 @@ public class SimpleTimeZone extends TimeZone
* @return the time zone offset in milliseconds.
* @throws IllegalArgumentException if arguments are incorrect.
*/
public int getOffset(int era, int year, int month,
int day, int dayOfWeek, int millis)
public int getOffset(int era, int year, int month, int day, int dayOfWeek,
int millis)
{
int daysInMonth = getDaysInMonth(month, year);
if (day < 1 || day > daysInMonth)
@ -683,7 +681,7 @@ public class SimpleTimeZone extends TimeZone
if (dayOfWeek < Calendar.SUNDAY || dayOfWeek > Calendar.SATURDAY)
throw new IllegalArgumentException("dayOfWeek out of range");
if (month < Calendar.JANUARY || month > Calendar.DECEMBER)
throw new IllegalArgumentException("month out of range");
throw new IllegalArgumentException("month out of range:" + month);
// This method is called by Calendar, so we mustn't use that class.
int daylightSavings = 0;
@ -691,27 +689,22 @@ public class SimpleTimeZone extends TimeZone
{
// This does only work for Gregorian calendars :-(
// This is mainly because setStartYear doesn't take an era.
boolean afterStart = !isBefore(year, month, day, dayOfWeek, millis,
startMode, startMonth,
startDay, startDayOfWeek, startTime);
boolean afterStart = ! isBefore(year, month, day, dayOfWeek, millis,
startMode, startMonth, startDay,
startDayOfWeek, startTime);
boolean beforeEnd = isBefore(year, month, day, dayOfWeek,
millis + dstSavings,
endMode, endMonth,
endDay, endDayOfWeek, endTime);
endMode, endMonth, endDay, endDayOfWeek,
endTime);
if (startMonth < endMonth)
{
// use daylight savings, if the date is after the start of
// savings, and before the end of savings.
daylightSavings = afterStart && beforeEnd ? dstSavings : 0;
}
// use daylight savings, if the date is after the start of
// savings, and before the end of savings.
daylightSavings = afterStart && beforeEnd ? dstSavings : 0;
else
{
// use daylight savings, if the date is before the end of
// savings, or after the start of savings.
daylightSavings = beforeEnd || afterStart ? dstSavings : 0;
}
// use daylight savings, if the date is before the end of
// savings, or after the start of savings.
daylightSavings = beforeEnd || afterStart ? dstSavings : 0;
}
return rawOffset + daylightSavings;
}
@ -740,7 +733,7 @@ public class SimpleTimeZone extends TimeZone
* milliseconds with respect to standard time. Typically this
* is one hour, but for some time zones this may be half an our.
* @return the daylight savings offset in milliseconds.
*
*
* @since 1.2
*/
public int getDSTSavings()
@ -760,7 +753,7 @@ public class SimpleTimeZone extends TimeZone
{
if (dstSavings <= 0)
throw new IllegalArgumentException("illegal value for dstSavings");
this.dstSavings = dstSavings;
}
@ -774,23 +767,28 @@ public class SimpleTimeZone extends TimeZone
}
/**
* Returns the number of days in the given month. It does always
* use the Gregorian leap year rule.
* Returns the number of days in the given month.
* Uses gregorian rules prior to 1582 (The default and earliest cutover)
* @param month The month, zero based; use one of the Calendar constants.
* @param year The year.
*/
private int getDaysInMonth(int month, int year)
{
// Most of this is copied from GregorianCalendar.getActualMaximum()
if (month == Calendar.FEBRUARY)
{
return ((year & 3) == 0 && (year % 100 != 0 || year % 400 == 0))
? 29 : 28;
if ((year & 3) != 0)
return 28;
// Assume default Gregorian cutover,
// all years prior to this must be Julian
if (year < 1582)
return 29;
// Gregorian rules
return ((year % 100) != 0 || (year % 400) == 0) ? 29 : 28;
}
else if (month < Calendar.AUGUST)
return 31 - (month & 1);
else
return 30 + (month & 1);
return monthArr[month];
}
/**
@ -804,23 +802,19 @@ public class SimpleTimeZone extends TimeZone
* @param mode the change mode; same semantic as startMode.
* @param month the change month; same semantic as startMonth.
* @param day the change day; same semantic as startDay.
* @param dayOfWeek the change day of week;
* @param dayOfWeek the change day of week;
* @param millis the change time in millis since midnight standard time.
* same semantic as startDayOfWeek.
* @return true, if cal is before the change, false if cal is on
* or after the change.
*/
private boolean isBefore(int calYear,
int calMonth, int calDayOfMonth, int calDayOfWeek,
int calMillis, int mode, int month,
int day, int dayOfWeek, int millis)
private boolean isBefore(int calYear, int calMonth, int calDayOfMonth,
int calDayOfWeek, int calMillis, int mode,
int month, int day, int dayOfWeek, int millis)
{
// This method is called by Calendar, so we mustn't use that class.
// We have to do all calculations by hand.
// check the months:
// XXX - this is not correct:
// for the DOW_GE_DOM and DOW_LE_DOM modes the change date may
// be in a different month.
@ -835,7 +829,7 @@ public class SimpleTimeZone extends TimeZone
return calDayOfMonth < day;
break;
case DOW_IN_MONTH_MODE:
{
{
// This computes the day of month of the day of type
// "dayOfWeek" that lies in the same (sunday based) week as cal.
calDayOfMonth += (dayOfWeek - calDayOfWeek);
@ -844,7 +838,6 @@ public class SimpleTimeZone extends TimeZone
// after dividing by 7). If we count from the end of the
// month, we get want a -7 based number counting the days from
// the end:
if (day < 0)
calDayOfMonth -= getDaysInMonth(calMonth, calYear) + 7;
else
@ -857,9 +850,9 @@ public class SimpleTimeZone extends TimeZone
// 20 21 22 23 24 25 26 -23-22-21-20-19-18-17
// 27 28 29 30 31 32 33 -16-15-14-13-12-11-10
// 34 35 36 -9 -8 -7
// Now we calculate the day of week in month:
int week = calDayOfMonth / 7;
// day > 0 day < 0
// S M T W T F S S M T W T F S
// 1 1 1 1 1 1 -5 -5 -4 -4 -4 -4
@ -867,7 +860,6 @@ public class SimpleTimeZone extends TimeZone
// 2 3 3 3 3 3 3 -3 -3 -3 -2 -2 -2 -2
// 3 4 4 4 4 4 4 -2 -2 -2 -1 -1 -1 -1
// 4 5 5 -1 -1 -1
if (week != day)
return week < day;
@ -876,26 +868,25 @@ public class SimpleTimeZone extends TimeZone
// daylight savings starts/ends on the given day.
break;
}
}
case DOW_LE_DOM_MODE:
// The greatest sunday before or equal December, 12
// is the same as smallest sunday after or equal December, 6.
day = Math.abs(day) - 6;
case DOW_GE_DOM_MODE:
// Calculate the day of month of the day of type
// "dayOfWeek" that lies before (or on) the given date.
calDayOfMonth -= (calDayOfWeek < dayOfWeek ? 7 : 0)
+ calDayOfWeek - dayOfWeek;
calDayOfMonth -= (calDayOfWeek < dayOfWeek ? 7 : 0) + calDayOfWeek
- dayOfWeek;
if (calDayOfMonth < day)
return true;
if (calDayOfWeek != dayOfWeek || calDayOfMonth >= day + 7)
return false;
// now we have the same day
break;
}
// the millis decides:
return (calMillis < millis);
}
@ -914,40 +905,35 @@ public class SimpleTimeZone extends TimeZone
/**
* Generates the hashCode for the SimpleDateFormat object. It is
* the rawOffset, possibly, if useDaylightSavings is true, xored
* with startYear, startMonth, startDayOfWeekInMonth, ..., endTime.
* with startYear, startMonth, startDayOfWeekInMonth, ..., endTime.
*/
public synchronized int hashCode()
{
return rawOffset ^
(useDaylight ?
startMonth ^ startDay ^ startDayOfWeek ^ startTime
^ endMonth ^ endDay ^ endDayOfWeek ^ endTime : 0);
return rawOffset
^ (useDaylight
? startMonth ^ startDay ^ startDayOfWeek ^ startTime ^ endMonth
^ endDay ^ endDayOfWeek ^ endTime : 0);
}
public synchronized boolean equals(Object o)
{
if (this == o)
return true;
if (!(o instanceof SimpleTimeZone))
if (! (o instanceof SimpleTimeZone))
return false;
SimpleTimeZone zone = (SimpleTimeZone) o;
if (zone.hashCode() != hashCode()
|| !getID().equals(zone.getID())
|| rawOffset != zone.rawOffset || useDaylight != zone.useDaylight)
if (zone.hashCode() != hashCode() || ! getID().equals(zone.getID())
|| rawOffset != zone.rawOffset || useDaylight != zone.useDaylight)
return false;
if (!useDaylight)
if (! useDaylight)
return true;
return (startYear == zone.startYear
&& startMonth == zone.startMonth
&& startDay == zone.startDay
&& startDayOfWeek == zone.startDayOfWeek
&& startTime == zone.startTime
&& startTimeMode == zone.startTimeMode
&& endMonth == zone.endMonth
&& endDay == zone.endDay
&& endDayOfWeek == zone.endDayOfWeek
&& endTime == zone.endTime
&& endTimeMode == zone.endTimeMode);
return (startYear == zone.startYear && startMonth == zone.startMonth
&& startDay == zone.startDay
&& startDayOfWeek == zone.startDayOfWeek
&& startTime == zone.startTime
&& startTimeMode == zone.startTimeMode && endMonth == zone.endMonth
&& endDay == zone.endDay && endDayOfWeek == zone.endDayOfWeek
&& endTime == zone.endTime && endTimeMode == zone.endTimeMode);
}
/**
@ -962,25 +948,21 @@ public class SimpleTimeZone extends TimeZone
{
if (this == other)
return true;
if (!(other instanceof SimpleTimeZone))
if (! (other instanceof SimpleTimeZone))
return false;
SimpleTimeZone zone = (SimpleTimeZone) other;
if (zone.hashCode() != hashCode()
|| rawOffset != zone.rawOffset || useDaylight != zone.useDaylight)
if (zone.hashCode() != hashCode() || rawOffset != zone.rawOffset
|| useDaylight != zone.useDaylight)
return false;
if (!useDaylight)
if (! useDaylight)
return true;
return (startYear == zone.startYear
&& startMonth == zone.startMonth
&& startDay == zone.startDay
&& startDayOfWeek == zone.startDayOfWeek
&& startTime == zone.startTime
&& startTimeMode == zone.startTimeMode
&& endMonth == zone.endMonth
&& endDay == zone.endDay
&& endDayOfWeek == zone.endDayOfWeek
&& endTime == zone.endTime
&& endTimeMode == zone.endTimeMode);
return (startYear == zone.startYear && startMonth == zone.startMonth
&& startDay == zone.startDay
&& startDayOfWeek == zone.startDayOfWeek
&& startTime == zone.startTime
&& startTimeMode == zone.startTimeMode && endMonth == zone.endMonth
&& endDay == zone.endDay && endDayOfWeek == zone.endDayOfWeek
&& endTime == zone.endTime && endTimeMode == zone.endTimeMode);
}
/**
@ -991,26 +973,17 @@ public class SimpleTimeZone extends TimeZone
{
// the test for useDaylight is an incompatibility to jdk1.2, but
// I think this shouldn't hurt.
return getClass().getName() + "["
+ "id=" + getID()
+ ",offset=" + rawOffset
+ ",dstSavings=" + dstSavings
+ ",useDaylight=" + useDaylight
+ (useDaylight ?
",startYear=" + startYear
+ ",startMode=" + startMode
+ ",startMonth=" + startMonth
+ ",startDay=" + startDay
+ ",startDayOfWeek=" + startDayOfWeek
+ ",startTime=" + startTime
+ ",startTimeMode=" + startTimeMode
+ ",endMode=" + endMode
+ ",endMonth=" + endMonth
+ ",endDay=" + endDay
+ ",endDayOfWeek=" + endDayOfWeek
+ ",endTime=" + endTime
+ ",endTimeMode=" + endTimeMode
: "") + "]";
return getClass().getName() + "[" + "id=" + getID() + ",offset="
+ rawOffset + ",dstSavings=" + dstSavings + ",useDaylight="
+ useDaylight
+ (useDaylight
? ",startYear=" + startYear + ",startMode=" + startMode
+ ",startMonth=" + startMonth + ",startDay=" + startDay
+ ",startDayOfWeek=" + startDayOfWeek + ",startTime="
+ startTime + ",startTimeMode=" + startTimeMode + ",endMode="
+ endMode + ",endMonth=" + endMonth + ",endDay=" + endDay
+ ",endDayOfWeek=" + endDayOfWeek + ",endTime=" + endTime
+ ",endTimeMode=" + endTimeMode : "") + "]";
}
/**
@ -1029,7 +1002,8 @@ public class SimpleTimeZone extends TimeZone
startMode = DOW_IN_MONTH_MODE;
startTimeMode = WALL_TIME;
endTimeMode = WALL_TIME;
serialVersionOnStream = 2; }
serialVersionOnStream = 2;
}
else
{
int length = input.readInt();
@ -1054,29 +1028,31 @@ public class SimpleTimeZone extends TimeZone
* <code>start/endDay(OfWeek)</code>-Fields are written in the
* DOW_IN_MONTH_MODE rule, since this was the only supported rule
* in 1.1.
*
*
* In the optional section, we write first the length of an byte
* array as int and afterwards the byte array itself. The byte
* array contains in this release four elements, namely the real
* startDay, startDayOfWeek endDay, endDayOfWeek in that Order.
* These fields are needed, because for compatibility reasons only
* approximative values are written to the required section, as
* described above.
* described above.
*/
private void writeObject(java.io.ObjectOutputStream output)
throws java.io.IOException
{
byte[] byteArray = new byte[]
{
(byte) startDay, (byte) startDayOfWeek,
(byte) endDay, (byte) endDayOfWeek};
{
(byte) startDay, (byte) startDayOfWeek, (byte) endDay,
(byte) endDayOfWeek
};
/* calculate the approximation for JDK 1.1 */
switch (startMode)
{
case DOM_MODE:
startDayOfWeek = Calendar.SUNDAY; // random day of week
// fall through
startDayOfWeek = Calendar.SUNDAY; // random day of week
// fall through
case DOW_GE_DOM_MODE:
case DOW_LE_DOM_MODE:
startDay = (startDay + 6) / 7;
@ -1085,7 +1061,8 @@ public class SimpleTimeZone extends TimeZone
{
case DOM_MODE:
endDayOfWeek = Calendar.SUNDAY;
// fall through
// fall through
case DOW_GE_DOM_MODE:
case DOW_LE_DOM_MODE:
endDay = (endDay + 6) / 7;

View File

@ -447,6 +447,7 @@ public abstract class TimeZone implements java.io.Serializable, Cloneable
Calendar.MARCH, -1, Calendar.SUNDAY, 2000 * 3600,
Calendar.OCTOBER, -1, Calendar.SUNDAY, 2000 * 3600);
timezones0.put("CET", tz);
timezones0.put("CEST", tz);
timezones0.put("ECT", tz);
timezones0.put("MET", tz);
timezones0.put("Africa/Ceuta", tz);