ICU-55 added support for corrected year and localized day of week

X-SVN-Rev: 192
This commit is contained in:
Vladimir Weinstein 1999-11-20 00:10:39 +00:00
parent 925f2cf8c1
commit 08104f4e36
5 changed files with 46 additions and 9 deletions

View File

@ -20,7 +20,9 @@
* 05/01/97 aliu Made equals(), before(), after() arguments const.
* 05/20/97 aliu Replaced fAreFieldsSet with fAreFieldsInSync and
* fAreAllFieldsSet.
* 07/27/98 stephen Sync up with JDK 1.2
* 07/27/98 stephen Sync up with JDK 1.2
* 11/15/99 weiv added YEAR_WOY and DOW_LOCAL
* to EDateFields
********************************************************************************
*/
@ -168,6 +170,9 @@ public:
MILLISECOND, // Example: 0..999
ZONE_OFFSET, // Example: -12*U_MILLIS_PER_HOUR..12*U_MILLIS_PER_HOUR
DST_OFFSET, // Example: 0 or U_MILLIS_PER_HOUR
// here will go names for 'Y' and 'e'
YEAR_WOY, // 'Y' Example: 1..big number
DOW_LOCAL, // 'e' Example: 1..7
FIELD_COUNT,
DAY_OF_MONTH = DATE // Synonyms

View File

@ -19,6 +19,7 @@
* 02/19/97 aliu Converted from java.
* 04/01/97 aliu Added support for centuries.
* 07/23/98 stephen JDK 1.2 sync
* 11/15/99 weiv Added support for week of year/day of week formatting
********************************************************************************
*/
@ -143,6 +144,9 @@ public:
// HOUR0_FIELD is used for the zero-based 12-hour clock.
// For example, 11:30 PM + 1 hour results in 00:30 AM.
kTimezoneField, // TIMEZONE field alignment.
kYearWOYField, // Corrected year for week representation
kDOWLocalField, // localized day of week
/**

View File

@ -33,7 +33,8 @@
// generic date-format pattern symbols. For their meanings, see class docs
// for SimpleDateFormat
UnicodeString DateFormatSymbols::fgPatternChars = "GyMdkHmsSEDFwWahKz";
//UnicodeString DateFormatSymbols::fgPatternChars = "GyMdkHmsSEDFwWahKz";
UnicodeString DateFormatSymbols::fgPatternChars = "GyMdkHmsSEDFwWahKzYe";
//------------------------------------------------------
// Strings of last resort. These are only used if we have no resource

View File

@ -36,6 +36,8 @@
* 10/15/99 aliu Fixed j31, incorrect WEEK_OF_YEAR computation.
* 10/15/99 aliu Fixed j32, cannot set date to Feb 29 2000 AD.
* {JDK bug 4210209 4209272}
* 11/15/99 weiv Added YEAR_WOY and DOW_LOCAL computation
* to timeToFields method, updated kMinValues, kMaxValues & kLeastMaxValues
********************************************************************************
*/
@ -106,17 +108,19 @@ const UDate GregorianCalendar::LATEST_SUPPORTED_MILLIS = 4503599627370495.0
* MILLISECOND 0 0 999 999
* ZONE_OFFSET -12* -12* 12* 12*
* DST_OFFSET 0 0 1* 1*
* YEAR_WOY 1 1 140742 144683
* DOW_LOCAL 1 1 7 7
* </pre>
* (*) In units of one-hour
*/
const int32_t GregorianCalendar::kMinValues[] = {
0,1,0,1,0,1,1,1,-1,0,0,0,0,0,0,-12*U_MILLIS_PER_HOUR,0
0,1,0,1,0,1,1,1,-1,0,0,0,0,0,0,-12*U_MILLIS_PER_HOUR,0,1,1
};
const int32_t GregorianCalendar::kLeastMaxValues[] = {
1,140742,11,52,4,28,365,7,4,1,11,23,59,59,999,12*U_MILLIS_PER_HOUR,1*U_MILLIS_PER_HOUR
1,140742,11,52,4,28,365,7,4,1,11,23,59,59,999,12*U_MILLIS_PER_HOUR,1*U_MILLIS_PER_HOUR,140742,7
};
const int32_t GregorianCalendar::kMaxValues[] = {
1,144683,11,53,6,31,366,7,6,1,11,23,59,59,999,12*U_MILLIS_PER_HOUR,1*U_MILLIS_PER_HOUR
1,144683,11,53,6,31,366,7,6,1,11,23,59,59,999,12*U_MILLIS_PER_HOUR,1*U_MILLIS_PER_HOUR, 144683,7
};
char GregorianCalendar::fgClassID = 0; // Value is irrelevant
@ -386,7 +390,7 @@ GregorianCalendar::timeToFields(UDate theTime, bool_t quick, UErrorCode& status)
return;
int32_t rawYear;
int32_t year, month, date, dayOfWeek, dayOfYear, era;
int32_t year, yearOfWeekOfYear, month, date, dayOfWeek, locDayOfWeek, dayOfYear, era;
bool_t isLeap;
// Compute the year, month, and day of month from the given millis
@ -448,6 +452,7 @@ GregorianCalendar::timeToFields(UDate theTime, bool_t quick, UErrorCode& status)
// Normalize day of week
dayOfWeek += (dayOfWeek < 0) ? (SUNDAY+7) : SUNDAY;
era = AD;
year = rawYear;
@ -456,6 +461,9 @@ GregorianCalendar::timeToFields(UDate theTime, bool_t quick, UErrorCode& status)
year = 1 - year;
}
// Calculate year of week of year
internalSet(ERA, era);
internalSet(YEAR, year);
internalSet(MONTH, month + JANUARY); // 0-based
@ -465,6 +473,8 @@ GregorianCalendar::timeToFields(UDate theTime, bool_t quick, UErrorCode& status)
if (quick)
return;
yearOfWeekOfYear = year;
// Compute the week of the year. Valid week numbers run from 1 to 52
// or 53, depending on the year, the first day of the week, and the
// minimal days in the first week. Days at the start of the year may
@ -483,17 +493,29 @@ GregorianCalendar::timeToFields(UDate theTime, bool_t quick, UErrorCode& status)
if (lastRelDow < 0) lastRelDow += 7;
if (dayOfYear > 359 && // Fast check which eliminates most cases
(6 - lastRelDow) >= getMinimalDaysInFirstWeek() &&
(dayOfYear + 7 - relDow) > lastDoy) woy = 1;
(dayOfYear + 7 - relDow) > lastDoy) {
woy = 1;
yearOfWeekOfYear++;
}
}
else if (woy == 0) {
// We are the last week of the previous year.
int32_t prevDoy = dayOfYear + yearLength(rawYear - 1);
woy = weekNumber(prevDoy, dayOfWeek);
yearOfWeekOfYear--;
}
internalSet(WEEK_OF_YEAR, woy);
internalSet(YEAR_WOY, yearOfWeekOfYear);
internalSet(WEEK_OF_MONTH, weekNumber(date, dayOfWeek));
internalSet(DAY_OF_WEEK_IN_MONTH, (date-1) / 7 + 1);
// Calculate localized day of week
locDayOfWeek = dayOfWeek-getFirstDayOfWeek()+1;
locDayOfWeek += (locDayOfWeek<1?7:0);
internalSet(DOW_LOCAL, locDayOfWeek);
}
// -------------------------------------

View File

@ -27,6 +27,7 @@
* 02/22/99 stephen Removed character literals for EBCDIC safety
* 10/14/99 aliu Updated 2-digit year parsing so that only "00" thru
* "99" are recognized. {j28 4182066}
* 11/15/99 weiv Added support for week of year/day of week format
********************************************************************************
*/
@ -478,7 +479,8 @@ SimpleDateFormat::fgPatternIndexToCalendarField[] =
Calendar::SECOND, Calendar::MILLISECOND, Calendar::DAY_OF_WEEK,
Calendar::DAY_OF_YEAR, Calendar::DAY_OF_WEEK_IN_MONTH,
Calendar::WEEK_OF_YEAR, Calendar::WEEK_OF_MONTH,
Calendar::AM_PM, Calendar::HOUR, Calendar::HOUR, Calendar::ZONE_OFFSET
Calendar::AM_PM, Calendar::HOUR, Calendar::HOUR, Calendar::ZONE_OFFSET,
Calendar::YEAR_WOY, Calendar::DOW_LOCAL
};
// Map index into pattern character string to DateFormat field number
@ -492,7 +494,8 @@ SimpleDateFormat::fgPatternIndexToDateFormatField[] = {
DateFormat::kDayOfWeekInMonthField, DateFormat::kWeekOfYearField,
DateFormat::kWeekOfMonthField, DateFormat::kAmPmField,
DateFormat::kHour1Field, DateFormat::kHour0Field,
DateFormat::kTimezoneField,
DateFormat::kTimezoneField, DateFormat::kYearWOYField,
DateFormat::kDOWLocalField
};
@ -534,6 +537,7 @@ SimpleDateFormat::subFormat(UnicodeString& result,
// for "yyyy", write out the whole year; for "yy", write out the last 2 digits
case kYearField:
case kYearWOYField:
if (count >= 4)
zeroPaddingNumber(result, value, 4, maxIntCount);
else
@ -648,6 +652,7 @@ SimpleDateFormat::subFormat(UnicodeString& result,
// case kWeekOfYearField:
// case kWeekOfMonthField:
// case kHour0Field:
// case kDOWLocalField:
zeroPaddingNumber(result, value, count, maxIntCount);
break;
}