OLD | NEW |
1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 27 matching lines...) Expand all Loading... |
38 // Keep reference to original values of some global properties. This | 38 // Keep reference to original values of some global properties. This |
39 // has the added benefit that the code in this file is isolated from | 39 // has the added benefit that the code in this file is isolated from |
40 // changes to these properties. | 40 // changes to these properties. |
41 const $Date = global.Date; | 41 const $Date = global.Date; |
42 | 42 |
43 // Helper function to throw error. | 43 // Helper function to throw error. |
44 function ThrowDateTypeError() { | 44 function ThrowDateTypeError() { |
45 throw new $TypeError('this is not a Date object.'); | 45 throw new $TypeError('this is not a Date object.'); |
46 } | 46 } |
47 | 47 |
48 // ECMA 262 - 15.9.1.2 | |
49 function Day(time) { | |
50 return FLOOR(time / msPerDay); | |
51 } | |
52 | |
53 | |
54 // ECMA 262 - 5.2 | 48 // ECMA 262 - 5.2 |
55 function Modulo(value, remainder) { | 49 function Modulo(value, remainder) { |
56 var mod = value % remainder; | 50 var mod = value % remainder; |
57 // Guard against returning -0. | 51 // Guard against returning -0. |
58 if (mod == 0) return 0; | 52 if (mod == 0) return 0; |
59 return mod >= 0 ? mod : mod + remainder; | 53 return mod >= 0 ? mod : mod + remainder; |
60 } | 54 } |
61 | 55 |
62 | 56 |
63 function TimeWithinDay(time) { | 57 function TimeWithinDay(time) { |
(...skipping 15 matching lines...) Expand all Loading... |
79 - FLOOR((year-1901)/100) | 73 - FLOOR((year-1901)/100) |
80 + FLOOR((year-1601)/400); | 74 + FLOOR((year-1601)/400); |
81 } | 75 } |
82 | 76 |
83 | 77 |
84 function TimeFromYear(year) { | 78 function TimeFromYear(year) { |
85 return msPerDay * DayFromYear(year); | 79 return msPerDay * DayFromYear(year); |
86 } | 80 } |
87 | 81 |
88 | 82 |
89 function YearFromTime(time) { | |
90 return FromJulianDay(Day(time) + kDayZeroInJulianDay).year; | |
91 } | |
92 | |
93 | |
94 function InLeapYear(time) { | 83 function InLeapYear(time) { |
95 return DaysInYear(YearFromTime(time)) == 366 ? 1 : 0; | 84 return DaysInYear(YEAR_FROM_TIME(time)) == 366 ? 1 : 0; |
96 } | |
97 | |
98 | |
99 // ECMA 262 - 15.9.1.4 | |
100 function MonthFromTime(time) { | |
101 return FromJulianDay(Day(time) + kDayZeroInJulianDay).month; | |
102 } | 85 } |
103 | 86 |
104 | 87 |
105 function DayWithinYear(time) { | 88 function DayWithinYear(time) { |
106 return Day(time) - DayFromYear(YearFromTime(time)); | 89 return DAY(time) - DayFromYear(YEAR_FROM_TIME(time)); |
107 } | |
108 | |
109 | |
110 // ECMA 262 - 15.9.1.5 | |
111 function DateFromTime(time) { | |
112 return FromJulianDay(Day(time) + kDayZeroInJulianDay).date; | |
113 } | 90 } |
114 | 91 |
115 | 92 |
116 // ECMA 262 - 15.9.1.9 | 93 // ECMA 262 - 15.9.1.9 |
117 function EquivalentYear(year) { | 94 function EquivalentYear(year) { |
118 // Returns an equivalent year in the range [2008-2035] matching | 95 // Returns an equivalent year in the range [2008-2035] matching |
119 // - leap year. | 96 // - leap year. |
120 // - week day of first day. | 97 // - week day of first day. |
121 var time = TimeFromYear(year); | 98 var time = TimeFromYear(year); |
122 var recent_year = (InLeapYear(time) == 0 ? 1967 : 1956) + | 99 var recent_year = (InLeapYear(time) == 0 ? 1967 : 1956) + |
123 (WeekDay(time) * 12) % 28; | 100 (WeekDay(time) * 12) % 28; |
124 // Find the year in the range 2008..2037 that is equivalent mod 28. | 101 // Find the year in the range 2008..2037 that is equivalent mod 28. |
125 // Add 3*28 to give a positive argument to the modulus operator. | 102 // Add 3*28 to give a positive argument to the modulus operator. |
126 return 2008 + (recent_year + 3*28 - 2008) % 28; | 103 return 2008 + (recent_year + 3*28 - 2008) % 28; |
127 } | 104 } |
128 | 105 |
129 | 106 |
130 function EquivalentTime(t) { | 107 function EquivalentTime(t) { |
131 // The issue here is that some library calls don't work right for dates | 108 // The issue here is that some library calls don't work right for dates |
132 // that cannot be represented using a non-negative signed 32 bit integer | 109 // that cannot be represented using a non-negative signed 32 bit integer |
133 // (measured in whole seconds based on the 1970 epoch). | 110 // (measured in whole seconds based on the 1970 epoch). |
134 // We solve this by mapping the time to a year with same leap-year-ness | 111 // We solve this by mapping the time to a year with same leap-year-ness |
135 // and same starting day for the year. The ECMAscript specification says | 112 // and same starting day for the year. The ECMAscript specification says |
136 // we must do this, but for compatibility with other browsers, we use | 113 // we must do this, but for compatibility with other browsers, we use |
137 // the actual year if it is in the range 1970..2037 | 114 // the actual year if it is in the range 1970..2037 |
138 if (t >= 0 && t <= 2.1e12) return t; | 115 if (t >= 0 && t <= 2.1e12) return t; |
139 var day = MakeDay(EquivalentYear(YearFromTime(t)), MonthFromTime(t), DateFromT
ime(t)); | 116 var day = MakeDay(EquivalentYear(YEAR_FROM_TIME(t)), MONTH_FROM_TIME(t), DATE_
FROM_TIME(t)); |
140 return TimeClip(MakeDate(day, TimeWithinDay(t))); | 117 return TimeClip(MakeDate(day, TimeWithinDay(t))); |
141 } | 118 } |
142 | 119 |
143 | 120 |
144 // Because computing the DST offset is a pretty expensive operation | 121 // Because computing the DST offset is a pretty expensive operation |
145 // we keep a cache of last computed offset along with a time interval | 122 // we keep a cache of last computed offset along with a time interval |
146 // where we know the cache is valid. | 123 // where we know the cache is valid. |
147 var DST_offset_cache = { | 124 var DST_offset_cache = { |
148 // Cached DST offset. | 125 // Cached DST offset. |
149 offset: 0, | 126 offset: 0, |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
225 return timezone_cache_timezone; | 202 return timezone_cache_timezone; |
226 } | 203 } |
227 var timezone = %DateLocalTimezone(EquivalentTime(t)); | 204 var timezone = %DateLocalTimezone(EquivalentTime(t)); |
228 timezone_cache_time = t; | 205 timezone_cache_time = t; |
229 timezone_cache_timezone = timezone; | 206 timezone_cache_timezone = timezone; |
230 return timezone; | 207 return timezone; |
231 } | 208 } |
232 | 209 |
233 | 210 |
234 function WeekDay(time) { | 211 function WeekDay(time) { |
235 return Modulo(Day(time) + 4, 7); | 212 return Modulo(DAY(time) + 4, 7); |
236 } | 213 } |
237 | 214 |
238 var local_time_offset = %DateLocalTimeOffset(); | 215 var local_time_offset = %DateLocalTimeOffset(); |
239 | 216 |
240 function LocalTime(time) { | 217 function LocalTime(time) { |
241 if (NUMBER_IS_NAN(time)) return time; | 218 if (NUMBER_IS_NAN(time)) return time; |
242 return time + local_time_offset + DaylightSavingsOffset(time); | 219 return time + local_time_offset + DaylightSavingsOffset(time); |
243 } | 220 } |
244 | 221 |
245 function LocalTimeNoCheck(time) { | 222 function LocalTimeNoCheck(time) { |
246 return time + local_time_offset + DaylightSavingsOffset(time); | 223 // Inline the DST offset cache checks for speed. |
| 224 var cache = DST_offset_cache; |
| 225 if (cache.start <= time && time <= cache.end) { |
| 226 var dst_offset = cache.offset; |
| 227 } else { |
| 228 var dst_offset = DaylightSavingsOffset(time); |
| 229 } |
| 230 return time + local_time_offset + dst_offset; |
247 } | 231 } |
248 | 232 |
249 | 233 |
250 function UTC(time) { | 234 function UTC(time) { |
251 if (NUMBER_IS_NAN(time)) return time; | 235 if (NUMBER_IS_NAN(time)) return time; |
252 var tmp = time - local_time_offset; | 236 var tmp = time - local_time_offset; |
253 return tmp - DaylightSavingsOffset(tmp); | 237 return tmp - DaylightSavingsOffset(tmp); |
254 } | 238 } |
255 | 239 |
256 | 240 |
257 // ECMA 262 - 15.9.1.10 | |
258 function HourFromTime(time) { | |
259 return Modulo(FLOOR(time / msPerHour), HoursPerDay); | |
260 } | |
261 | |
262 | |
263 function MinFromTime(time) { | |
264 return Modulo(FLOOR(time / msPerMinute), MinutesPerHour); | |
265 } | |
266 | |
267 | |
268 function SecFromTime(time) { | |
269 return Modulo(FLOOR(time / msPerSecond), SecondsPerMinute); | |
270 } | |
271 | |
272 | |
273 function msFromTime(time) { | |
274 return Modulo(time, msPerSecond); | |
275 } | |
276 | |
277 | |
278 // ECMA 262 - 15.9.1.11 | 241 // ECMA 262 - 15.9.1.11 |
279 function MakeTime(hour, min, sec, ms) { | 242 function MakeTime(hour, min, sec, ms) { |
280 if (!$isFinite(hour)) return $NaN; | 243 if (!$isFinite(hour)) return $NaN; |
281 if (!$isFinite(min)) return $NaN; | 244 if (!$isFinite(min)) return $NaN; |
282 if (!$isFinite(sec)) return $NaN; | 245 if (!$isFinite(sec)) return $NaN; |
283 if (!$isFinite(ms)) return $NaN; | 246 if (!$isFinite(ms)) return $NaN; |
284 return TO_INTEGER(hour) * msPerHour | 247 return TO_INTEGER(hour) * msPerHour |
285 + TO_INTEGER(min) * msPerMinute | 248 + TO_INTEGER(min) * msPerMinute |
286 + TO_INTEGER(sec) * msPerSecond | 249 + TO_INTEGER(sec) * msPerSecond |
287 + TO_INTEGER(ms); | 250 + TO_INTEGER(ms); |
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
461 } else if (IS_STRING(year)) { | 424 } else if (IS_STRING(year)) { |
462 // Probe the Date cache. If we already have a time value for the | 425 // Probe the Date cache. If we already have a time value for the |
463 // given time, we re-use that instead of parsing the string again. | 426 // given time, we re-use that instead of parsing the string again. |
464 var cache = Date_cache; | 427 var cache = Date_cache; |
465 if (cache.string === year) { | 428 if (cache.string === year) { |
466 value = cache.time; | 429 value = cache.time; |
467 } else { | 430 } else { |
468 value = DateParse(year); | 431 value = DateParse(year); |
469 if (!NUMBER_IS_NAN(value)) { | 432 if (!NUMBER_IS_NAN(value)) { |
470 cache.time = value; | 433 cache.time = value; |
471 cache.year = YearFromTime(LocalTimeNoCheck(value)); | 434 cache.year = YEAR_FROM_TIME(LocalTimeNoCheck(value)); |
472 cache.string = year; | 435 cache.string = year; |
473 } | 436 } |
474 } | 437 } |
475 | 438 |
476 } else { | 439 } else { |
477 // According to ECMA 262, no hint should be given for this | 440 // According to ECMA 262, no hint should be given for this |
478 // conversion. However, ToPrimitive defaults to STRING_HINT for | 441 // conversion. However, ToPrimitive defaults to STRING_HINT for |
479 // Date objects which will lose precision when the Date | 442 // Date objects which will lose precision when the Date |
480 // constructor is called with another Date object as its | 443 // constructor is called with another Date object as its |
481 // argument. We therefore use NUMBER_HINT for the conversion, | 444 // argument. We therefore use NUMBER_HINT for the conversion, |
(...skipping 19 matching lines...) Expand all Loading... |
501 } | 464 } |
502 %_SetValueOf(this, value); | 465 %_SetValueOf(this, value); |
503 }); | 466 }); |
504 | 467 |
505 | 468 |
506 // Helper functions. | 469 // Helper functions. |
507 function GetTimeFrom(aDate) { | 470 function GetTimeFrom(aDate) { |
508 return DATE_VALUE(aDate); | 471 return DATE_VALUE(aDate); |
509 } | 472 } |
510 | 473 |
511 | |
512 function GetMillisecondsFrom(aDate) { | 474 function GetMillisecondsFrom(aDate) { |
513 var t = DATE_VALUE(aDate); | 475 var t = DATE_VALUE(aDate); |
514 if (NUMBER_IS_NAN(t)) return t; | 476 if (NUMBER_IS_NAN(t)) return t; |
515 return msFromTime(LocalTimeNoCheck(t)); | 477 return MS_FROM_TIME(LocalTimeNoCheck(t)); |
516 } | 478 } |
517 | 479 |
518 | 480 |
519 function GetUTCMillisecondsFrom(aDate) { | 481 function GetUTCMillisecondsFrom(aDate) { |
520 var t = DATE_VALUE(aDate); | 482 var t = DATE_VALUE(aDate); |
521 if (NUMBER_IS_NAN(t)) return t; | 483 if (NUMBER_IS_NAN(t)) return t; |
522 return msFromTime(t); | 484 return MS_FROM_TIME(t); |
523 } | 485 } |
524 | 486 |
525 | 487 |
526 function GetSecondsFrom(aDate) { | 488 function GetSecondsFrom(aDate) { |
527 var t = DATE_VALUE(aDate); | 489 var t = DATE_VALUE(aDate); |
528 if (NUMBER_IS_NAN(t)) return t; | 490 if (NUMBER_IS_NAN(t)) return t; |
529 return SecFromTime(LocalTimeNoCheck(t)); | 491 return SEC_FROM_TIME(LocalTimeNoCheck(t)); |
530 } | 492 } |
531 | 493 |
532 | 494 |
533 function GetUTCSecondsFrom(aDate) { | 495 function GetUTCSecondsFrom(aDate) { |
534 var t = DATE_VALUE(aDate); | 496 var t = DATE_VALUE(aDate); |
535 if (NUMBER_IS_NAN(t)) return t; | 497 if (NUMBER_IS_NAN(t)) return t; |
536 return SecFromTime(t); | 498 return SEC_FROM_TIME(t); |
537 } | 499 } |
538 | 500 |
539 | 501 |
540 function GetMinutesFrom(aDate) { | 502 function GetMinutesFrom(aDate) { |
541 var t = DATE_VALUE(aDate); | 503 var t = DATE_VALUE(aDate); |
542 if (NUMBER_IS_NAN(t)) return t; | 504 if (NUMBER_IS_NAN(t)) return t; |
543 return MinFromTime(LocalTimeNoCheck(t)); | 505 return MIN_FROM_TIME(LocalTimeNoCheck(t)); |
544 } | 506 } |
545 | 507 |
546 | 508 |
547 function GetUTCMinutesFrom(aDate) { | 509 function GetUTCMinutesFrom(aDate) { |
548 var t = DATE_VALUE(aDate); | 510 var t = DATE_VALUE(aDate); |
549 if (NUMBER_IS_NAN(t)) return t; | 511 if (NUMBER_IS_NAN(t)) return t; |
550 return MinFromTime(t); | 512 return MIN_FROM_TIME(t); |
551 } | 513 } |
552 | 514 |
553 | 515 |
554 function GetHoursFrom(aDate) { | 516 function GetHoursFrom(aDate) { |
555 var t = DATE_VALUE(aDate); | 517 var t = DATE_VALUE(aDate); |
556 if (NUMBER_IS_NAN(t)) return t; | 518 if (NUMBER_IS_NAN(t)) return t; |
557 return HourFromTime(LocalTimeNoCheck(t)); | 519 return HOUR_FROM_TIME(LocalTimeNoCheck(t)); |
558 } | 520 } |
559 | 521 |
560 | 522 |
561 function GetUTCHoursFrom(aDate) { | 523 function GetUTCHoursFrom(aDate) { |
562 var t = DATE_VALUE(aDate); | 524 var t = DATE_VALUE(aDate); |
563 if (NUMBER_IS_NAN(t)) return t; | 525 if (NUMBER_IS_NAN(t)) return t; |
564 return HourFromTime(t); | 526 return HOUR_FROM_TIME(t); |
565 } | 527 } |
566 | 528 |
567 | 529 |
568 function GetFullYearFrom(aDate) { | 530 function GetFullYearFrom(aDate) { |
569 var t = DATE_VALUE(aDate); | 531 var t = DATE_VALUE(aDate); |
570 if (NUMBER_IS_NAN(t)) return t; | 532 if (NUMBER_IS_NAN(t)) return t; |
571 var cache = Date_cache; | 533 var cache = Date_cache; |
572 if (cache.time === t) return cache.year; | 534 if (cache.time === t) return cache.year; |
573 return YearFromTime(LocalTimeNoCheck(t)); | 535 return YEAR_FROM_TIME(LocalTimeNoCheck(t)); |
574 } | 536 } |
575 | 537 |
576 | 538 |
577 function GetUTCFullYearFrom(aDate) { | 539 function GetUTCFullYearFrom(aDate) { |
578 var t = DATE_VALUE(aDate); | 540 var t = DATE_VALUE(aDate); |
579 if (NUMBER_IS_NAN(t)) return t; | 541 if (NUMBER_IS_NAN(t)) return t; |
580 return YearFromTime(t); | 542 return YEAR_FROM_TIME(t); |
581 } | 543 } |
582 | 544 |
583 | 545 |
584 function GetMonthFrom(aDate) { | 546 function GetMonthFrom(aDate) { |
585 var t = DATE_VALUE(aDate); | 547 var t = DATE_VALUE(aDate); |
586 if (NUMBER_IS_NAN(t)) return t; | 548 if (NUMBER_IS_NAN(t)) return t; |
587 return MonthFromTime(LocalTimeNoCheck(t)); | 549 return MONTH_FROM_TIME(LocalTimeNoCheck(t)); |
588 } | 550 } |
589 | 551 |
590 | 552 |
591 function GetUTCMonthFrom(aDate) { | 553 function GetUTCMonthFrom(aDate) { |
592 var t = DATE_VALUE(aDate); | 554 var t = DATE_VALUE(aDate); |
593 if (NUMBER_IS_NAN(t)) return t; | 555 if (NUMBER_IS_NAN(t)) return t; |
594 return MonthFromTime(t); | 556 return MONTH_FROM_TIME(t); |
595 } | 557 } |
596 | 558 |
597 | 559 |
598 function GetDateFrom(aDate) { | 560 function GetDateFrom(aDate) { |
599 var t = DATE_VALUE(aDate); | 561 var t = DATE_VALUE(aDate); |
600 if (NUMBER_IS_NAN(t)) return t; | 562 if (NUMBER_IS_NAN(t)) return t; |
601 return DateFromTime(LocalTimeNoCheck(t)); | 563 return DATE_FROM_TIME(LocalTimeNoCheck(t)); |
602 } | 564 } |
603 | 565 |
604 | 566 |
605 function GetUTCDateFrom(aDate) { | 567 function GetUTCDateFrom(aDate) { |
606 var t = DATE_VALUE(aDate); | 568 var t = DATE_VALUE(aDate); |
607 if (NUMBER_IS_NAN(t)) return t; | 569 if (NUMBER_IS_NAN(t)) return t; |
608 return DateFromTime(t); | 570 return DATE_FROM_TIME(t); |
609 } | 571 } |
610 | 572 |
611 | 573 |
612 %FunctionSetPrototype($Date, new $Date($NaN)); | 574 %FunctionSetPrototype($Date, new $Date($NaN)); |
613 | 575 |
614 | 576 |
615 var WeekDays = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']; | 577 var WeekDays = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']; |
616 var Months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oc
t', 'Nov', 'Dec']; | 578 var Months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oc
t', 'Nov', 'Dec']; |
617 | 579 |
618 | 580 |
619 function TwoDigitString(value) { | 581 function TwoDigitString(value) { |
620 return value < 10 ? "0" + value : "" + value; | 582 return value < 10 ? "0" + value : "" + value; |
621 } | 583 } |
622 | 584 |
623 | 585 |
624 function DateString(time) { | 586 function DateString(time) { |
625 var YMD = FromJulianDay(Day(time) + kDayZeroInJulianDay); | 587 var YMD = FromJulianDay(DAY(time) + kDayZeroInJulianDay); |
626 return WeekDays[WeekDay(time)] + ' ' | 588 return WeekDays[WeekDay(time)] + ' ' |
627 + Months[YMD.month] + ' ' | 589 + Months[YMD.month] + ' ' |
628 + TwoDigitString(YMD.date) + ' ' | 590 + TwoDigitString(YMD.date) + ' ' |
629 + YMD.year; | 591 + YMD.year; |
630 } | 592 } |
631 | 593 |
632 | 594 |
633 var LongWeekDays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Fri
day', 'Saturday']; | 595 var LongWeekDays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Fri
day', 'Saturday']; |
634 var LongMonths = ['January', 'February', 'March', 'April', 'May', 'June', 'July'
, 'August', 'September', 'October', 'November', 'December']; | 596 var LongMonths = ['January', 'February', 'March', 'April', 'May', 'June', 'July'
, 'August', 'September', 'October', 'November', 'December']; |
635 | 597 |
636 | 598 |
637 function LongDateString(time) { | 599 function LongDateString(time) { |
638 var YMD = FromJulianDay(Day(time) + kDayZeroInJulianDay); | 600 var YMD = FromJulianDay(DAY(time) + kDayZeroInJulianDay); |
639 return LongWeekDays[WeekDay(time)] + ', ' | 601 return LongWeekDays[WeekDay(time)] + ', ' |
640 + LongMonths[YMD.month] + ' ' | 602 + LongMonths[YMD.month] + ' ' |
641 + TwoDigitString(YMD.date) + ', ' | 603 + TwoDigitString(YMD.date) + ', ' |
642 + YMD.year; | 604 + YMD.year; |
643 } | 605 } |
644 | 606 |
645 | 607 |
646 function TimeString(time) { | 608 function TimeString(time) { |
647 return TwoDigitString(HourFromTime(time)) + ':' | 609 return TwoDigitString(HOUR_FROM_TIME(time)) + ':' |
648 + TwoDigitString(MinFromTime(time)) + ':' | 610 + TwoDigitString(MIN_FROM_TIME(time)) + ':' |
649 + TwoDigitString(SecFromTime(time)); | 611 + TwoDigitString(SEC_FROM_TIME(time)); |
650 } | 612 } |
651 | 613 |
652 | 614 |
653 function LocalTimezoneString(time) { | 615 function LocalTimezoneString(time) { |
654 var timezoneOffset = | 616 var timezoneOffset = |
655 (local_time_offset + DaylightSavingsOffset(time)) / msPerMinute; | 617 (local_time_offset + DaylightSavingsOffset(time)) / msPerMinute; |
656 var sign = (timezoneOffset >= 0) ? 1 : -1; | 618 var sign = (timezoneOffset >= 0) ? 1 : -1; |
657 var hours = FLOOR((sign * timezoneOffset)/60); | 619 var hours = FLOOR((sign * timezoneOffset)/60); |
658 var min = FLOOR((sign * timezoneOffset)%60); | 620 var min = FLOOR((sign * timezoneOffset)%60); |
659 var gmt = ' GMT' + ((sign == 1) ? '+' : '-') + | 621 var gmt = ' GMT' + ((sign == 1) ? '+' : '-') + |
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
885 function DateSetTime(ms) { | 847 function DateSetTime(ms) { |
886 if (!IS_DATE(this)) ThrowDateTypeError(); | 848 if (!IS_DATE(this)) ThrowDateTypeError(); |
887 return %_SetValueOf(this, TimeClip(ToNumber(ms))); | 849 return %_SetValueOf(this, TimeClip(ToNumber(ms))); |
888 } | 850 } |
889 | 851 |
890 | 852 |
891 // ECMA 262 - 15.9.5.28 | 853 // ECMA 262 - 15.9.5.28 |
892 function DateSetMilliseconds(ms) { | 854 function DateSetMilliseconds(ms) { |
893 var t = LocalTime(DATE_VALUE(this)); | 855 var t = LocalTime(DATE_VALUE(this)); |
894 ms = ToNumber(ms); | 856 ms = ToNumber(ms); |
895 var time = MakeTime(HourFromTime(t), MinFromTime(t), SecFromTime(t), ms); | 857 var time = MakeTime(HOUR_FROM_TIME(t), MIN_FROM_TIME(t), SEC_FROM_TIME(t), ms)
; |
896 return %_SetValueOf(this, TimeClip(UTC(MakeDate(Day(t), time)))); | 858 return %_SetValueOf(this, TimeClip(UTC(MakeDate(DAY(t), time)))); |
897 } | 859 } |
898 | 860 |
899 | 861 |
900 // ECMA 262 - 15.9.5.29 | 862 // ECMA 262 - 15.9.5.29 |
901 function DateSetUTCMilliseconds(ms) { | 863 function DateSetUTCMilliseconds(ms) { |
902 var t = DATE_VALUE(this); | 864 var t = DATE_VALUE(this); |
903 ms = ToNumber(ms); | 865 ms = ToNumber(ms); |
904 var time = MakeTime(HourFromTime(t), MinFromTime(t), SecFromTime(t), ms); | 866 var time = MakeTime(HOUR_FROM_TIME(t), MIN_FROM_TIME(t), SEC_FROM_TIME(t), ms)
; |
905 return %_SetValueOf(this, TimeClip(MakeDate(Day(t), time))); | 867 return %_SetValueOf(this, TimeClip(MakeDate(DAY(t), time))); |
906 } | 868 } |
907 | 869 |
908 | 870 |
909 // ECMA 262 - 15.9.5.30 | 871 // ECMA 262 - 15.9.5.30 |
910 function DateSetSeconds(sec, ms) { | 872 function DateSetSeconds(sec, ms) { |
911 var t = LocalTime(DATE_VALUE(this)); | 873 var t = LocalTime(DATE_VALUE(this)); |
912 sec = ToNumber(sec); | 874 sec = ToNumber(sec); |
913 ms = %_ArgumentsLength() < 2 ? GetMillisecondsFrom(this) : ToNumber(ms); | 875 ms = %_ArgumentsLength() < 2 ? GetMillisecondsFrom(this) : ToNumber(ms); |
914 var time = MakeTime(HourFromTime(t), MinFromTime(t), sec, ms); | 876 var time = MakeTime(HOUR_FROM_TIME(t), MIN_FROM_TIME(t), sec, ms); |
915 return %_SetValueOf(this, TimeClip(UTC(MakeDate(Day(t), time)))); | 877 return %_SetValueOf(this, TimeClip(UTC(MakeDate(DAY(t), time)))); |
916 } | 878 } |
917 | 879 |
918 | 880 |
919 // ECMA 262 - 15.9.5.31 | 881 // ECMA 262 - 15.9.5.31 |
920 function DateSetUTCSeconds(sec, ms) { | 882 function DateSetUTCSeconds(sec, ms) { |
921 var t = DATE_VALUE(this); | 883 var t = DATE_VALUE(this); |
922 sec = ToNumber(sec); | 884 sec = ToNumber(sec); |
923 ms = %_ArgumentsLength() < 2 ? GetUTCMillisecondsFrom(this) : ToNumber(ms); | 885 ms = %_ArgumentsLength() < 2 ? GetUTCMillisecondsFrom(this) : ToNumber(ms); |
924 var time = MakeTime(HourFromTime(t), MinFromTime(t), sec, ms); | 886 var time = MakeTime(HOUR_FROM_TIME(t), MIN_FROM_TIME(t), sec, ms); |
925 return %_SetValueOf(this, TimeClip(MakeDate(Day(t), time))); | 887 return %_SetValueOf(this, TimeClip(MakeDate(DAY(t), time))); |
926 } | 888 } |
927 | 889 |
928 | 890 |
929 // ECMA 262 - 15.9.5.33 | 891 // ECMA 262 - 15.9.5.33 |
930 function DateSetMinutes(min, sec, ms) { | 892 function DateSetMinutes(min, sec, ms) { |
931 var t = LocalTime(DATE_VALUE(this)); | 893 var t = LocalTime(DATE_VALUE(this)); |
932 min = ToNumber(min); | 894 min = ToNumber(min); |
933 var argc = %_ArgumentsLength(); | 895 var argc = %_ArgumentsLength(); |
934 sec = argc < 2 ? GetSecondsFrom(this) : ToNumber(sec); | 896 sec = argc < 2 ? GetSecondsFrom(this) : ToNumber(sec); |
935 ms = argc < 3 ? GetMillisecondsFrom(this) : ToNumber(ms); | 897 ms = argc < 3 ? GetMillisecondsFrom(this) : ToNumber(ms); |
936 var time = MakeTime(HourFromTime(t), min, sec, ms); | 898 var time = MakeTime(HOUR_FROM_TIME(t), min, sec, ms); |
937 return %_SetValueOf(this, TimeClip(UTC(MakeDate(Day(t), time)))); | 899 return %_SetValueOf(this, TimeClip(UTC(MakeDate(DAY(t), time)))); |
938 } | 900 } |
939 | 901 |
940 | 902 |
941 // ECMA 262 - 15.9.5.34 | 903 // ECMA 262 - 15.9.5.34 |
942 function DateSetUTCMinutes(min, sec, ms) { | 904 function DateSetUTCMinutes(min, sec, ms) { |
943 var t = DATE_VALUE(this); | 905 var t = DATE_VALUE(this); |
944 min = ToNumber(min); | 906 min = ToNumber(min); |
945 var argc = %_ArgumentsLength(); | 907 var argc = %_ArgumentsLength(); |
946 sec = argc < 2 ? GetUTCSecondsFrom(this) : ToNumber(sec); | 908 sec = argc < 2 ? GetUTCSecondsFrom(this) : ToNumber(sec); |
947 ms = argc < 3 ? GetUTCMillisecondsFrom(this) : ToNumber(ms); | 909 ms = argc < 3 ? GetUTCMillisecondsFrom(this) : ToNumber(ms); |
948 var time = MakeTime(HourFromTime(t), min, sec, ms); | 910 var time = MakeTime(HOUR_FROM_TIME(t), min, sec, ms); |
949 return %_SetValueOf(this, TimeClip(MakeDate(Day(t), time))); | 911 return %_SetValueOf(this, TimeClip(MakeDate(DAY(t), time))); |
950 } | 912 } |
951 | 913 |
952 | 914 |
953 // ECMA 262 - 15.9.5.35 | 915 // ECMA 262 - 15.9.5.35 |
954 function DateSetHours(hour, min, sec, ms) { | 916 function DateSetHours(hour, min, sec, ms) { |
955 var t = LocalTime(DATE_VALUE(this)); | 917 var t = LocalTime(DATE_VALUE(this)); |
956 hour = ToNumber(hour); | 918 hour = ToNumber(hour); |
957 var argc = %_ArgumentsLength(); | 919 var argc = %_ArgumentsLength(); |
958 min = argc < 2 ? GetMinutesFrom(this) : ToNumber(min); | 920 min = argc < 2 ? GetMinutesFrom(this) : ToNumber(min); |
959 sec = argc < 3 ? GetSecondsFrom(this) : ToNumber(sec); | 921 sec = argc < 3 ? GetSecondsFrom(this) : ToNumber(sec); |
960 ms = argc < 4 ? GetMillisecondsFrom(this) : ToNumber(ms); | 922 ms = argc < 4 ? GetMillisecondsFrom(this) : ToNumber(ms); |
961 var time = MakeTime(hour, min, sec, ms); | 923 var time = MakeTime(hour, min, sec, ms); |
962 return %_SetValueOf(this, TimeClip(UTC(MakeDate(Day(t), time)))); | 924 return %_SetValueOf(this, TimeClip(UTC(MakeDate(DAY(t), time)))); |
963 } | 925 } |
964 | 926 |
965 | 927 |
966 // ECMA 262 - 15.9.5.34 | 928 // ECMA 262 - 15.9.5.34 |
967 function DateSetUTCHours(hour, min, sec, ms) { | 929 function DateSetUTCHours(hour, min, sec, ms) { |
968 var t = DATE_VALUE(this); | 930 var t = DATE_VALUE(this); |
969 hour = ToNumber(hour); | 931 hour = ToNumber(hour); |
970 var argc = %_ArgumentsLength(); | 932 var argc = %_ArgumentsLength(); |
971 min = argc < 2 ? GetUTCMinutesFrom(this) : ToNumber(min); | 933 min = argc < 2 ? GetUTCMinutesFrom(this) : ToNumber(min); |
972 sec = argc < 3 ? GetUTCSecondsFrom(this) : ToNumber(sec); | 934 sec = argc < 3 ? GetUTCSecondsFrom(this) : ToNumber(sec); |
973 ms = argc < 4 ? GetUTCMillisecondsFrom(this) : ToNumber(ms); | 935 ms = argc < 4 ? GetUTCMillisecondsFrom(this) : ToNumber(ms); |
974 var time = MakeTime(hour, min, sec, ms); | 936 var time = MakeTime(hour, min, sec, ms); |
975 return %_SetValueOf(this, TimeClip(MakeDate(Day(t), time))); | 937 return %_SetValueOf(this, TimeClip(MakeDate(DAY(t), time))); |
976 } | 938 } |
977 | 939 |
978 | 940 |
979 // ECMA 262 - 15.9.5.36 | 941 // ECMA 262 - 15.9.5.36 |
980 function DateSetDate(date) { | 942 function DateSetDate(date) { |
981 var t = LocalTime(DATE_VALUE(this)); | 943 var t = LocalTime(DATE_VALUE(this)); |
982 date = ToNumber(date); | 944 date = ToNumber(date); |
983 var day = MakeDay(YearFromTime(t), MonthFromTime(t), date); | 945 var day = MakeDay(YEAR_FROM_TIME(t), MONTH_FROM_TIME(t), date); |
984 return %_SetValueOf(this, TimeClip(UTC(MakeDate(day, TimeWithinDay(t))))); | 946 return %_SetValueOf(this, TimeClip(UTC(MakeDate(day, TimeWithinDay(t))))); |
985 } | 947 } |
986 | 948 |
987 | 949 |
988 // ECMA 262 - 15.9.5.37 | 950 // ECMA 262 - 15.9.5.37 |
989 function DateSetUTCDate(date) { | 951 function DateSetUTCDate(date) { |
990 var t = DATE_VALUE(this); | 952 var t = DATE_VALUE(this); |
991 date = ToNumber(date); | 953 date = ToNumber(date); |
992 var day = MakeDay(YearFromTime(t), MonthFromTime(t), date); | 954 var day = MakeDay(YEAR_FROM_TIME(t), MONTH_FROM_TIME(t), date); |
993 return %_SetValueOf(this, TimeClip(MakeDate(day, TimeWithinDay(t)))); | 955 return %_SetValueOf(this, TimeClip(MakeDate(day, TimeWithinDay(t)))); |
994 } | 956 } |
995 | 957 |
996 | 958 |
997 // ECMA 262 - 15.9.5.38 | 959 // ECMA 262 - 15.9.5.38 |
998 function DateSetMonth(month, date) { | 960 function DateSetMonth(month, date) { |
999 var t = LocalTime(DATE_VALUE(this)); | 961 var t = LocalTime(DATE_VALUE(this)); |
1000 month = ToNumber(month); | 962 month = ToNumber(month); |
1001 date = %_ArgumentsLength() < 2 ? GetDateFrom(this) : ToNumber(date); | 963 date = %_ArgumentsLength() < 2 ? GetDateFrom(this) : ToNumber(date); |
1002 var day = MakeDay(YearFromTime(t), month, date); | 964 var day = MakeDay(YEAR_FROM_TIME(t), month, date); |
1003 return %_SetValueOf(this, TimeClip(UTC(MakeDate(day, TimeWithinDay(t))))); | 965 return %_SetValueOf(this, TimeClip(UTC(MakeDate(day, TimeWithinDay(t))))); |
1004 } | 966 } |
1005 | 967 |
1006 | 968 |
1007 // ECMA 262 - 15.9.5.39 | 969 // ECMA 262 - 15.9.5.39 |
1008 function DateSetUTCMonth(month, date) { | 970 function DateSetUTCMonth(month, date) { |
1009 var t = DATE_VALUE(this); | 971 var t = DATE_VALUE(this); |
1010 month = ToNumber(month); | 972 month = ToNumber(month); |
1011 date = %_ArgumentsLength() < 2 ? GetUTCDateFrom(this) : ToNumber(date); | 973 date = %_ArgumentsLength() < 2 ? GetUTCDateFrom(this) : ToNumber(date); |
1012 var day = MakeDay(YearFromTime(t), month, date); | 974 var day = MakeDay(YEAR_FROM_TIME(t), month, date); |
1013 return %_SetValueOf(this, TimeClip(MakeDate(day, TimeWithinDay(t)))); | 975 return %_SetValueOf(this, TimeClip(MakeDate(day, TimeWithinDay(t)))); |
1014 } | 976 } |
1015 | 977 |
1016 | 978 |
1017 // ECMA 262 - 15.9.5.40 | 979 // ECMA 262 - 15.9.5.40 |
1018 function DateSetFullYear(year, month, date) { | 980 function DateSetFullYear(year, month, date) { |
1019 var t = DATE_VALUE(this); | 981 var t = DATE_VALUE(this); |
1020 t = NUMBER_IS_NAN(t) ? 0 : LocalTimeNoCheck(t); | 982 t = NUMBER_IS_NAN(t) ? 0 : LocalTimeNoCheck(t); |
1021 year = ToNumber(year); | 983 year = ToNumber(year); |
1022 var argc = %_ArgumentsLength(); | 984 var argc = %_ArgumentsLength(); |
1023 month = argc < 2 ? MonthFromTime(t) : ToNumber(month); | 985 month = argc < 2 ? MONTH_FROM_TIME(t) : ToNumber(month); |
1024 date = argc < 3 ? DateFromTime(t) : ToNumber(date); | 986 date = argc < 3 ? DATE_FROM_TIME(t) : ToNumber(date); |
1025 var day = MakeDay(year, month, date); | 987 var day = MakeDay(year, month, date); |
1026 return %_SetValueOf(this, TimeClip(UTC(MakeDate(day, TimeWithinDay(t))))); | 988 return %_SetValueOf(this, TimeClip(UTC(MakeDate(day, TimeWithinDay(t))))); |
1027 } | 989 } |
1028 | 990 |
1029 | 991 |
1030 // ECMA 262 - 15.9.5.41 | 992 // ECMA 262 - 15.9.5.41 |
1031 function DateSetUTCFullYear(year, month, date) { | 993 function DateSetUTCFullYear(year, month, date) { |
1032 var t = DATE_VALUE(this); | 994 var t = DATE_VALUE(this); |
1033 if (NUMBER_IS_NAN(t)) t = 0; | 995 if (NUMBER_IS_NAN(t)) t = 0; |
1034 var argc = %_ArgumentsLength(); | 996 var argc = %_ArgumentsLength(); |
1035 year = ToNumber(year); | 997 year = ToNumber(year); |
1036 month = argc < 2 ? MonthFromTime(t) : ToNumber(month); | 998 month = argc < 2 ? MONTH_FROM_TIME(t) : ToNumber(month); |
1037 date = argc < 3 ? DateFromTime(t) : ToNumber(date); | 999 date = argc < 3 ? DATE_FROM_TIME(t) : ToNumber(date); |
1038 var day = MakeDay(year, month, date); | 1000 var day = MakeDay(year, month, date); |
1039 return %_SetValueOf(this, TimeClip(MakeDate(day, TimeWithinDay(t)))); | 1001 return %_SetValueOf(this, TimeClip(MakeDate(day, TimeWithinDay(t)))); |
1040 } | 1002 } |
1041 | 1003 |
1042 | 1004 |
1043 // ECMA 262 - 15.9.5.42 | 1005 // ECMA 262 - 15.9.5.42 |
1044 function DateToUTCString() { | 1006 function DateToUTCString() { |
1045 var t = DATE_VALUE(this); | 1007 var t = DATE_VALUE(this); |
1046 if (NUMBER_IS_NAN(t)) return kInvalidDate; | 1008 if (NUMBER_IS_NAN(t)) return kInvalidDate; |
1047 // Return UTC string of the form: Sat, 31 Jan 1970 23:00:00 GMT | 1009 // Return UTC string of the form: Sat, 31 Jan 1970 23:00:00 GMT |
1048 return WeekDays[WeekDay(t)] + ', ' | 1010 return WeekDays[WeekDay(t)] + ', ' |
1049 + TwoDigitString(DateFromTime(t)) + ' ' | 1011 + TwoDigitString(DATE_FROM_TIME(t)) + ' ' |
1050 + Months[MonthFromTime(t)] + ' ' | 1012 + Months[MONTH_FROM_TIME(t)] + ' ' |
1051 + YearFromTime(t) + ' ' | 1013 + YEAR_FROM_TIME(t) + ' ' |
1052 + TimeString(t) + ' GMT'; | 1014 + TimeString(t) + ' GMT'; |
1053 } | 1015 } |
1054 | 1016 |
1055 | 1017 |
1056 // ECMA 262 - B.2.4 | 1018 // ECMA 262 - B.2.4 |
1057 function DateGetYear() { | 1019 function DateGetYear() { |
1058 var t = DATE_VALUE(this); | 1020 var t = DATE_VALUE(this); |
1059 if (NUMBER_IS_NAN(t)) return $NaN; | 1021 if (NUMBER_IS_NAN(t)) return $NaN; |
1060 return YearFromTime(LocalTimeNoCheck(t)) - 1900; | 1022 return YEAR_FROM_TIME(LocalTimeNoCheck(t)) - 1900; |
1061 } | 1023 } |
1062 | 1024 |
1063 | 1025 |
1064 // ECMA 262 - B.2.5 | 1026 // ECMA 262 - B.2.5 |
1065 function DateSetYear(year) { | 1027 function DateSetYear(year) { |
1066 var t = LocalTime(DATE_VALUE(this)); | 1028 var t = LocalTime(DATE_VALUE(this)); |
1067 if (NUMBER_IS_NAN(t)) t = 0; | 1029 if (NUMBER_IS_NAN(t)) t = 0; |
1068 year = ToNumber(year); | 1030 year = ToNumber(year); |
1069 if (NUMBER_IS_NAN(year)) return %_SetValueOf(this, $NaN); | 1031 if (NUMBER_IS_NAN(year)) return %_SetValueOf(this, $NaN); |
1070 year = (0 <= TO_INTEGER(year) && TO_INTEGER(year) <= 99) | 1032 year = (0 <= TO_INTEGER(year) && TO_INTEGER(year) <= 99) |
1071 ? 1900 + TO_INTEGER(year) : year; | 1033 ? 1900 + TO_INTEGER(year) : year; |
1072 var day = MakeDay(year, MonthFromTime(t), DateFromTime(t)); | 1034 var day = MakeDay(year, MONTH_FROM_TIME(t), DATE_FROM_TIME(t)); |
1073 return %_SetValueOf(this, TimeClip(UTC(MakeDate(day, TimeWithinDay(t))))); | 1035 return %_SetValueOf(this, TimeClip(UTC(MakeDate(day, TimeWithinDay(t))))); |
1074 } | 1036 } |
1075 | 1037 |
1076 | 1038 |
1077 // ECMA 262 - B.2.6 | 1039 // ECMA 262 - B.2.6 |
1078 // | 1040 // |
1079 // Notice that this does not follow ECMA 262 completely. ECMA 262 | 1041 // Notice that this does not follow ECMA 262 completely. ECMA 262 |
1080 // says that toGMTString should be the same Function object as | 1042 // says that toGMTString should be the same Function object as |
1081 // toUTCString. JSC does not do this, so for compatibility we do not | 1043 // toUTCString. JSC does not do this, so for compatibility we do not |
1082 // do that either. Instead, we create a new function whose name | 1044 // do that either. Instead, we create a new function whose name |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1164 "toGMTString", DateToGMTString, | 1126 "toGMTString", DateToGMTString, |
1165 "toUTCString", DateToUTCString, | 1127 "toUTCString", DateToUTCString, |
1166 "getYear", DateGetYear, | 1128 "getYear", DateGetYear, |
1167 "setYear", DateSetYear, | 1129 "setYear", DateSetYear, |
1168 "toISOString", DateToISOString, | 1130 "toISOString", DateToISOString, |
1169 "toJSON", DateToJSON | 1131 "toJSON", DateToJSON |
1170 )); | 1132 )); |
1171 } | 1133 } |
1172 | 1134 |
1173 SetupDate(); | 1135 SetupDate(); |
OLD | NEW |