| Index: src/date-delay.js
|
| ===================================================================
|
| --- src/date-delay.js (revision 4103)
|
| +++ src/date-delay.js (working copy)
|
| @@ -293,58 +293,51 @@
|
| }
|
|
|
|
|
| -// Constructor for creating objects holding year, month, and date.
|
| -// Introduced to ensure the two return points in FromJulianDay match same map.
|
| -function DayTriplet(year, month, date) {
|
| - this.year = year;
|
| - this.month = month;
|
| - this.date = date;
|
| -}
|
| +var ymd_from_time_cache = [$NaN, $NaN, $NaN];
|
| +var ymd_from_time_cached_time = $NaN;
|
|
|
| -var julian_day_cache_triplet;
|
| -var julian_day_cache_day = $NaN;
|
| +function YearFromTime(t) {
|
| + if (t !== ymd_from_time_cached_time) {
|
| + // Limits according to ECMA 262 15.9.1.1
|
| + if (!$isFinite(t) || t < -8640000000000000 || t > 8640000000000000) {
|
| + return $NaN;
|
| + }
|
|
|
| -// Compute year, month, and day from modified Julian day.
|
| -// The missing days in 1582 are ignored for JavaScript compatibility.
|
| -function FromJulianDay(julian) {
|
| - if (julian_day_cache_day == julian) {
|
| - return julian_day_cache_triplet;
|
| + %DateYMDFromTime(t, ymd_from_time_cache);
|
| + ymd_from_time_cached_time = t
|
| }
|
| - var result;
|
| - // Avoid floating point and non-Smi maths in common case. This is also a period of
|
| - // time where leap years are very regular. The range is not too large to avoid overflow
|
| - // when doing the multiply-to-divide trick.
|
| - if (julian > kDayZeroInJulianDay &&
|
| - (julian - kDayZeroInJulianDay) < 40177) { // 1970 - 2080
|
| - var jsimple = (julian - kDayZeroInJulianDay) + 731; // Day 0 is 1st January 1968
|
| - var y = 1968;
|
| - // Divide by 1461 by multiplying with 22967 and shifting down by 25!
|
| - var after_1968 = (jsimple * 22967) >> 25;
|
| - y += after_1968 << 2;
|
| - jsimple -= 1461 * after_1968;
|
| - var four_year_cycle = four_year_cycle_table[jsimple];
|
| - result = new DayTriplet(y + (four_year_cycle >> kYearShift),
|
| - (four_year_cycle & kMonthMask) >> kMonthShift,
|
| - four_year_cycle & kDayMask);
|
| - } else {
|
| - var jalpha = FLOOR((julian - 1867216.25) / 36524.25);
|
| - var jb = julian + 1 + jalpha - FLOOR(0.25 * jalpha) + 1524;
|
| - var jc = FLOOR(6680.0 + ((jb-2439870) - 122.1)/365.25);
|
| - var jd = FLOOR(365 * jc + (0.25 * jc));
|
| - var je = FLOOR((jb - jd)/30.6001);
|
| - var m = je - 1;
|
| - if (m > 12) m -= 13;
|
| - var y = jc - 4715;
|
| - if (m > 2) { --y; --m; }
|
| - var d = jb - jd - FLOOR(30.6001 * je);
|
| - result = new DayTriplet(y, m, d);
|
| +
|
| + return ymd_from_time_cache[0];
|
| +}
|
| +
|
| +function MonthFromTime(t) {
|
| + if (t !== ymd_from_time_cached_time) {
|
| + // Limits according to ECMA 262 15.9.1.1
|
| + if (!$isFinite(t) || t < -8640000000000000 || t > 8640000000000000) {
|
| + return $NaN;
|
| + }
|
| + %DateYMDFromTime(t, ymd_from_time_cache);
|
| + ymd_from_time_cached_time = t
|
| }
|
| - julian_day_cache_day = julian;
|
| - julian_day_cache_triplet = result;
|
| - return result;
|
| +
|
| + return ymd_from_time_cache[1];
|
| }
|
|
|
| +function DateFromTime(t) {
|
| + if (t !== ymd_from_time_cached_time) {
|
| + // Limits according to ECMA 262 15.9.1.1
|
| + if (!$isFinite(t) || t < -8640000000000000 || t > 8640000000000000) {
|
| + return $NaN;
|
| + }
|
|
|
| + %DateYMDFromTime(t, ymd_from_time_cache);
|
| + ymd_from_time_cached_time = t
|
| + }
|
| +
|
| + return ymd_from_time_cache[2];
|
| +}
|
| +
|
| +
|
| // Compute number of days given a year, month, date.
|
| // Note that month and date can lie outside the normal range.
|
| // For example:
|
| @@ -577,11 +570,10 @@
|
|
|
|
|
| function DateString(time) {
|
| - var YMD = FromJulianDay(DAY(time) + kDayZeroInJulianDay);
|
| return WeekDays[WeekDay(time)] + ' '
|
| - + Months[YMD.month] + ' '
|
| - + TwoDigitString(YMD.date) + ' '
|
| - + YMD.year;
|
| + + Months[MonthFromTime(time)] + ' '
|
| + + TwoDigitString(DateFromTime(time)) + ' '
|
| + + YearFromTime(time);
|
| }
|
|
|
|
|
| @@ -590,11 +582,10 @@
|
|
|
|
|
| function LongDateString(time) {
|
| - var YMD = FromJulianDay(DAY(time) + kDayZeroInJulianDay);
|
| return LongWeekDays[WeekDay(time)] + ', '
|
| - + LongMonths[YMD.month] + ' '
|
| - + TwoDigitString(YMD.date) + ', '
|
| - + YMD.year;
|
| + + LongMonths[MonthFromTime(time)] + ' '
|
| + + TwoDigitString(DateFromTime(time)) + ', '
|
| + + YearFromTime(time);
|
| }
|
|
|
|
|
|
|