| Index: src/date.js
|
| ===================================================================
|
| --- src/date.js (revision 4205)
|
| +++ src/date.js (working copy)
|
| @@ -260,88 +260,48 @@
|
| }
|
|
|
|
|
| -var four_year_cycle_table = CalculateDateTable();
|
| +var ymd_from_time_cache = [$NaN, $NaN, $NaN];
|
| +var ymd_from_time_cached_time = $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;
|
| + }
|
|
|
| -function CalculateDateTable() {
|
| - var month_lengths = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
|
| - var four_year_cycle_table = new $Array(1461);
|
| + %DateYMDFromTime(t, ymd_from_time_cache);
|
| + ymd_from_time_cached_time = t
|
| + }
|
|
|
| - var cumulative = 0;
|
| - var position = 0;
|
| - var leap_position = 0;
|
| - for (var month = 0; month < 12; month++) {
|
| - var month_bits = month << kMonthShift;
|
| - var length = month_lengths[month];
|
| - for (var day = 1; day <= length; day++) {
|
| - four_year_cycle_table[leap_position] =
|
| - month_bits + day;
|
| - four_year_cycle_table[366 + position] =
|
| - (1 << kYearShift) + month_bits + day;
|
| - four_year_cycle_table[731 + position] =
|
| - (2 << kYearShift) + month_bits + day;
|
| - four_year_cycle_table[1096 + position] =
|
| - (3 << kYearShift) + month_bits + day;
|
| - leap_position++;
|
| - position++;
|
| + 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;
|
| }
|
| - if (month == 1) {
|
| - four_year_cycle_table[leap_position++] = month_bits + 29;
|
| - }
|
| + %DateYMDFromTime(t, ymd_from_time_cache);
|
| + ymd_from_time_cached_time = t
|
| }
|
| - return four_year_cycle_table;
|
| -}
|
|
|
| -
|
| -// 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;
|
| + return ymd_from_time_cache[1];
|
| }
|
|
|
| -var julian_day_cache_triplet;
|
| -var julian_day_cache_day = $NaN;
|
| +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;
|
| + }
|
|
|
| -// 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);
|
| - }
|
| - julian_day_cache_day = julian;
|
| - julian_day_cache_triplet = result;
|
| - return result;
|
| +
|
| + return ymd_from_time_cache[2];
|
| }
|
|
|
|
|
| @@ -577,11 +537,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 +549,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);
|
| }
|
|
|
|
|
|
|