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 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
104 | 104 |
105 | 105 |
106 // ECMA 262 - 15.9.1.5 | 106 // ECMA 262 - 15.9.1.5 |
107 function DateFromTime(time) { | 107 function DateFromTime(time) { |
108 return FromJulianDay(Day(time) + kDayZeroInJulianDay).date; | 108 return FromJulianDay(Day(time) + kDayZeroInJulianDay).date; |
109 } | 109 } |
110 | 110 |
111 | 111 |
112 // ECMA 262 - 15.9.1.9 | 112 // ECMA 262 - 15.9.1.9 |
113 function EquivalentYear(year) { | 113 function EquivalentYear(year) { |
114 // Returns an equivalent year in the range [1956-2000] matching | 114 // Returns an equivalent year in the range [2008-2035] matching |
115 // - leap year. | 115 // - leap year. |
116 // - week day of first day. | 116 // - week day of first day. |
117 var time = TimeFromYear(year); | 117 var time = TimeFromYear(year); |
118 return (InLeapYear(time) == 0 ? 1967 : 1956) + (WeekDay(time) * 12) % 28; | 118 var recent_year = (InLeapYear(time) == 0 ? 1967 : 1956) + |
| 119 (WeekDay(time) * 12) % 28; |
| 120 // Find the year in the range 2008..2037 that is equivalent mod 28. |
| 121 // Add 3*28 to give a positive argument to the modulus operator. |
| 122 return 2008 + (recent_year + 3*28 - 2008) % 28; |
119 } | 123 } |
120 | 124 |
121 | 125 |
122 function EquivalentTime(t) { | 126 function EquivalentTime(t) { |
123 // The issue here is that some library calls don't work right for dates | 127 // The issue here is that some library calls don't work right for dates |
124 // that cannot be represented using a signed 32 bit integer (measured in | 128 // that cannot be represented using a non-negative signed 32 bit integer |
125 // whole seconds based on the 1970 epoch). | 129 // (measured in whole seconds based on the 1970 epoch). |
126 // We solve this by mapping the time to a year with same leap-year-ness | 130 // We solve this by mapping the time to a year with same leap-year-ness |
127 // and same starting day for the year. | 131 // and same starting day for the year. The ECMAscript specification says |
128 // As an optimization we avoid finding an equivalent year in the common | 132 // we must do this, but for compatability with other browsers, we use |
129 // case. We are measuring in ms here so the 32 bit signed integer range | 133 // the actual year if it is in the range 1970..2037 |
130 // is +-(1<<30)*1000 ie approximately +-2.1e20. | 134 if (t >= 0 && t <= 2.1e12) return t; |
131 if (t >= -2.1e12 && t <= 2.1e12) return t; | |
132 var day = MakeDay(EquivalentYear(YearFromTime(t)), MonthFromTime(t), DateFromT
ime(t)); | 135 var day = MakeDay(EquivalentYear(YearFromTime(t)), MonthFromTime(t), DateFromT
ime(t)); |
133 return TimeClip(MakeDate(day, TimeWithinDay(t))); | 136 return TimeClip(MakeDate(day, TimeWithinDay(t))); |
134 } | 137 } |
135 | 138 |
136 var daylight_cache_time = $NaN; | 139 var daylight_cache_time = $NaN; |
137 var daylight_cache_offset; | 140 var daylight_cache_offset; |
138 | 141 |
139 function DaylightSavingsOffset(t) { | 142 function DaylightSavingsOffset(t) { |
140 if (t == daylight_cache_time) { | 143 if (t == daylight_cache_time) { |
141 return daylight_cache_offset; | 144 return daylight_cache_offset; |
(...skipping 886 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1028 "setFullYear", DateSetFullYear, | 1031 "setFullYear", DateSetFullYear, |
1029 "setUTCFullYear", DateSetUTCFullYear, | 1032 "setUTCFullYear", DateSetUTCFullYear, |
1030 "toGMTString", DateToGMTString, | 1033 "toGMTString", DateToGMTString, |
1031 "toUTCString", DateToUTCString, | 1034 "toUTCString", DateToUTCString, |
1032 "getYear", DateGetYear, | 1035 "getYear", DateGetYear, |
1033 "setYear", DateSetYear | 1036 "setYear", DateSetYear |
1034 )); | 1037 )); |
1035 } | 1038 } |
1036 | 1039 |
1037 SetupDate(); | 1040 SetupDate(); |
OLD | NEW |