492 |
*/ |
*/ |
493 |
protected synchronized void computeTime() |
protected synchronized void computeTime() |
494 |
{ |
{ |
|
// 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 |
|
495 |
int millisInDay = 0; |
int millisInDay = 0; |
496 |
int era = fields[ERA]; |
int era = fields[ERA]; |
497 |
int year = fields[YEAR]; |
int year = fields[YEAR]; |
510 |
|
|
511 |
if (! isSet[MONTH]) |
if (! isSet[MONTH]) |
512 |
{ |
{ |
513 |
|
// 5: YEAR + DAY_OF_WEEK + WEEK_OF_YEAR |
514 |
if (isSet[DAY_OF_WEEK] || isSet[WEEK_OF_YEAR]) |
if (isSet[DAY_OF_WEEK] || isSet[WEEK_OF_YEAR]) |
515 |
{ // case 5 |
{ |
516 |
int first = getFirstDayOfMonth(year, 0); |
int first = getFirstDayOfMonth(year, 0); |
517 |
int offs; |
int offs; |
518 |
if ((8 - first) >= getMinimalDaysInFirstWeek()) |
if ((8 - first) >= getMinimalDaysInFirstWeek()) |
526 |
day += fields[DAY_OF_WEEK] - first; |
day += fields[DAY_OF_WEEK] - first; |
527 |
} |
} |
528 |
else |
else |
529 |
{ // case 4 |
{ |
530 |
|
// 4: YEAR + DAY_OF_YEAR |
531 |
month = 0; |
month = 0; |
532 |
day = fields[DAY_OF_YEAR]; |
day = fields[DAY_OF_YEAR]; |
533 |
} |
} |
538 |
{ |
{ |
539 |
int first = getFirstDayOfMonth(year, month); |
int first = getFirstDayOfMonth(year, month); |
540 |
|
|
541 |
|
// 3: YEAR + MONTH + DAY_OF_WEEK_IN_MONTH + DAY_OF_WEEK |
542 |
if (isSet[DAY_OF_WEEK_IN_MONTH]) |
if (isSet[DAY_OF_WEEK_IN_MONTH]) |
543 |
{ // case 3 |
{ |
544 |
int offs = fields[DAY_OF_WEEK] - first; |
int offs = fields[DAY_OF_WEEK] - first; |
545 |
if (offs < 0) |
if (offs < 0) |
546 |
offs += 7; |
offs += 7; |
548 |
day += offs; |
day += offs; |
549 |
} |
} |
550 |
else |
else |
551 |
{ // case 2 |
{ // 2: YEAR + MONTH + WEEK_OF_MONTH + DAY_OF_WEEK |
552 |
day = 1 + 7 * (fields[WEEK_OF_MONTH] - 1); |
day = 1 + 7 * (fields[WEEK_OF_MONTH] - 1); |
553 |
day += fields[DAY_OF_WEEK] - first; |
day += fields[DAY_OF_WEEK] - first; |
554 |
} |
} |
555 |
} |
} |
556 |
|
|
557 |
// case 1 |
// 1: YEAR + MONTH + DAY_OF_MONTH |
558 |
} |
} |
559 |
if (era == BC && year > 0) |
if (era == BC && year > 0) |
560 |
year = 1 - year; |
year = 1 - year; |
638 |
|
|
639 |
time = relativeDay * (24 * 60 * 60 * 1000L) + millisInDay; |
time = relativeDay * (24 * 60 * 60 * 1000L) + millisInDay; |
640 |
|
|
|
TimeZone zone = getTimeZone(); |
|
|
int rawOffset = isSet[ZONE_OFFSET] ? fields[ZONE_OFFSET] |
|
|
: zone.getRawOffset(); |
|
|
|
|
641 |
// the epoch was a Thursday. |
// the epoch was a Thursday. |
642 |
int weekday = (int) (relativeDay + THURSDAY) % 7; |
int weekday = (int) (relativeDay + THURSDAY) % 7; |
643 |
if (weekday <= 0) |
if (weekday <= 0) |
644 |
weekday += 7; |
weekday += 7; |
645 |
fields[DAY_OF_WEEK] = weekday; |
fields[DAY_OF_WEEK] = weekday; |
646 |
|
|
647 |
int dstOffset = isSet[DST_OFFSET] ? fields[DST_OFFSET] |
TimeZone zone = getTimeZone(); |
648 |
: (zone.getOffset((year < 1) ? BC : AD, |
int rawOffset = zone.getRawOffset(); |
649 |
(year < 1) ? 1 - year |
int dstOffset = zone.getOffset((year < 1) ? BC : AD, |
650 |
: year, |
(year < 1) ? 1 - year : year, month, day, |
651 |
month, day, weekday, |
weekday, millisInDay) - zone.getRawOffset(); |
|
millisInDay) |
|
|
- zone.getRawOffset()); |
|
652 |
time -= (rawOffset + dstOffset); |
time -= (rawOffset + dstOffset); |
653 |
|
|
654 |
isTimeSet = true; |
isTimeSet = true; |
655 |
} |
} |
656 |
|
|