⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 date-delay.js.svn-base

📁 Google浏览器V8内核代码
💻 SVN-BASE
📖 第 1 页 / 共 2 页
字号:
// Copyright 2006-2008 the V8 project authors. All rights reserved.// Redistribution and use in source and binary forms, with or without// modification, are permitted provided that the following conditions are// met:////     * Redistributions of source code must retain the above copyright//       notice, this list of conditions and the following disclaimer.//     * Redistributions in binary form must reproduce the above//       copyright notice, this list of conditions and the following//       disclaimer in the documentation and/or other materials provided//       with the distribution.//     * Neither the name of Google Inc. nor the names of its//       contributors may be used to endorse or promote products derived//       from this software without specific prior written permission.//// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.// -------------------------------------------------------------------// This file contains date support implemented in JavaScript.// Keep reference to original values of some global properties.  This// has the added benefit that the code in this file is isolated from// changes to these properties.const $Date = global.Date;const $floor = $Math_floor;const $abs = $Math_abs;// ECMA 262 - 15.9.1.2function Day(time) {  return $floor(time/msPerDay);};// ECMA 262 - 5.2function Modulo(value, remainder) {  var mod = value % remainder;  return mod >= 0 ? mod : mod + remainder;};function TimeWithinDay(time) {  return Modulo(time, msPerDay);};// ECMA 262 - 15.9.1.3function DaysInYear(year) {  if (year % 4 != 0) return 365;  if ((year % 100 == 0) && (year % 400 != 0)) return 365;  return 366;};function DayFromYear(year) {  return 365 * (year-1970)      + $floor((year-1969)/4)      - $floor((year-1901)/100)      + $floor((year-1601)/400);};function TimeFromYear(year) {  return msPerDay * DayFromYear(year);};function YearFromTime(time) {  return FromJulianDay(Day(time) + kDayZeroInJulianDay).year;};function InLeapYear(time) {  return DaysInYear(YearFromTime(time)) == 366 ? 1 : 0;};// ECMA 262 - 15.9.1.4function MonthFromTime(time) {  return FromJulianDay(Day(time) + kDayZeroInJulianDay).month;};function DayWithinYear(time) {  return Day(time) - DayFromYear(YearFromTime(time));};// ECMA 262 - 15.9.1.5function DateFromTime(time) {  return FromJulianDay(Day(time) + kDayZeroInJulianDay).date;};// ECMA 262 - 15.9.1.9function EquivalentYear(year) {  // Returns an equivalent year in the range [1956-2000] matching  // - leap year.  // - week day of first day.  var time = TimeFromYear(year);  return (InLeapYear(time) == 0 ? 1967 : 1956) + (WeekDay(time) * 12) % 28;};function EquivalentTime(t) {  // The issue here is that some library calls don't work right for dates  // that cannot be represented using a signed 32 bit integer (measured in  // whole seconds based on the 1970 epoch).  // We solve this by mapping the time to a year with same leap-year-ness  // and same starting day for the year.  // As an optimization we avoid finding an equivalent year in the common  // case.  We are measuring in ms here so the 32 bit signed integer range  // is +-(1<<30)*1000 ie approximately +-2.1e20.  if (t >= -2.1e12 && t <= 2.1e12) return t;  var day = MakeDay(EquivalentYear(YearFromTime(t)), MonthFromTime(t), DateFromTime(t));  return TimeClip(MakeDate(day, TimeWithinDay(t)));};var local_time_offset;function LocalTimeOffset() {  if (IS_UNDEFINED(local_time_offset)) {    local_time_offset = %DateLocalTimeOffset();  }  return local_time_offset;};var daylight_cache_time = $NaN;var daylight_cache_offset;function DaylightSavingsOffset(t) {  if (t == daylight_cache_time) {    return daylight_cache_offset;  }  var offset = %DateDaylightSavingsOffset(EquivalentTime(t));  daylight_cache_time = t;  daylight_cache_offset = offset;  return offset;};var timezone_cache_time = $NaN;var timezone_cache_timezone;function LocalTimezone(t) {  if(t == timezone_cache_time) {    return timezone_cache_timezone;  }  var timezone = %DateLocalTimezone(EquivalentTime(t));  timezone_cache_time = t;  timezone_cache_timezone = timezone;  return timezone;};function WeekDay(time) {  return Modulo(Day(time) + 4, 7);};function LocalTime(time) {  if ($isNaN(time)) return time;  return time + LocalTimeOffset() + DaylightSavingsOffset(time);};function UTC(time) {  if ($isNaN(time)) return time;  var tmp = time - LocalTimeOffset();  return tmp - DaylightSavingsOffset(tmp);};// ECMA 262 - 15.9.1.10function HourFromTime(time) {  return Modulo($floor(time / msPerHour), HoursPerDay);};function MinFromTime(time) {  return Modulo($floor(time / msPerMinute), MinutesPerHour);};function SecFromTime(time) {  return Modulo($floor(time / msPerSecond), SecondsPerMinute);};function msFromTime(time) {  return Modulo(time, msPerSecond);};// ECMA 262 - 15.9.1.11function MakeTime(hour, min, sec, ms) {  if (!$isFinite(hour)) return $NaN;  if (!$isFinite(min)) return $NaN;  if (!$isFinite(sec)) return $NaN;  if (!$isFinite(ms)) return $NaN;  return TO_INTEGER(hour) * msPerHour      + TO_INTEGER(min) * msPerMinute      + TO_INTEGER(sec) * msPerSecond      + TO_INTEGER(ms);};// ECMA 262 - 15.9.1.12function TimeInYear(year) {  return DaysInYear(year) * msPerDay;};// Compute modified Julian day from year, month, date.// The missing days in 1582 are ignored for JavaScript compatibility.function ToJulianDay(year, month, date) {  var jy = (month > 1) ? year : year - 1;  var jm = (month > 1) ? month + 2 : month + 14;  var ja = $floor(0.01*jy);  return $floor($floor(365.25*jy) + $floor(30.6001*jm) + date + 1720995) + 2 - ja + $floor(0.25*ja);};var four_year_cycle_table;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);  var cumulative = 0;  var position = 0;  var leap_position = 0;  for (var month = 0; month < 12; month++) {    var length = month_lengths[month];    for (var day = 1; day <= length; day++) {      four_year_cycle_table[leap_position] =        (month << kMonthShift) + day;      four_year_cycle_table[366 + position] =        (1 << kYearShift) + (month << kMonthShift) + day;      four_year_cycle_table[731 + position] =        (2 << kYearShift) + (month << kMonthShift) + day;      four_year_cycle_table[1096 + position] =        (3 << kYearShift) + (month << kMonthShift) + day;      leap_position++;      position++;    }    if (month == 1) {      four_year_cycle_table[leap_position++] =        (month << kMonthShift) + 29;    }  }  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;}// Compute year, month, and day from modified Julian day.// The missing days in 1582 are ignored for JavaScript compatibility.function FromJulianDay(julian) {  // 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    if (!four_year_cycle_table)      four_year_cycle_table = CalculateDateTable();    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];    return new DayTriplet(y + (four_year_cycle >> kYearShift),                           (four_year_cycle & kMonthMask) >> kMonthShift,                           four_year_cycle & kDayMask);  }  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);  return new DayTriplet(y, m, d);};// Compute number of days given a year, month, date.// Note that month and date can lie outside the normal range.//   For example://     MakeDay(2007, -4, 20) --> MakeDay(2006, 8, 20)//     MakeDay(2007, -33, 1) --> MakeDay(2004, 3, 1)//     MakeDay(2007, 14, -50) --> MakeDay(2007, 8, 11)function MakeDay(year, month, date) {  if (!$isFinite(year) || !$isFinite(month) || !$isFinite(date)) return $NaN;  // Conversion to integers.  year = TO_INTEGER(year);  month = TO_INTEGER(month);  date = TO_INTEGER(date);  // Overflow months into year.  year = year + $floor(month/12);  month = month % 12;  if (month < 0) {    month += 12;  }  // Return days relative to Jan 1 1970.  return ToJulianDay(year, month, date) - kDayZeroInJulianDay;};// ECMA 262 - 15.9.1.13function MakeDate(day, time) {  if (!$isFinite(day)) return $NaN;  if (!$isFinite(time)) return $NaN;  return day * msPerDay + time;};// ECMA 262 - 15.9.1.14function TimeClip(time) {  if (!$isFinite(time)) return $NaN;  if ($abs(time) > 8.64E15) return $NaN;  return TO_INTEGER(time);};%SetCode($Date, function(year, month, date, hours, minutes, seconds, ms) {  if (%IsConstructCall()) {    // ECMA 262 - 15.9.3    var argc = %_ArgumentsLength();    if (argc == 0) {      %_SetValueOf(this, %DateCurrentTime());      return;    }    if (argc == 1) {      // According to ECMA 262, no hint should be given for this      // conversion.  However, ToPrimitive defaults to String Hint      // for Date objects which will lose precision when the Date      // constructor is called with another Date object as its      // argument.  We therefore use Number Hint for the conversion      // (which is the default for everything else than Date      // objects).  This makes us behave like KJS and SpiderMonkey.      var time = ToPrimitive(year, NUMBER_HINT);      if (IS_STRING(time)) {        %_SetValueOf(this, DateParse(time));      } else {        %_SetValueOf(this, TimeClip(ToNumber(time)));      }      return;    }    year = ToNumber(year);    month = ToNumber(month);    date = argc > 2 ? ToNumber(date) : 1;    hours = argc > 3 ? ToNumber(hours) : 0;    minutes = argc > 4 ? ToNumber(minutes) : 0;    seconds = argc > 5 ? ToNumber(seconds) : 0;    ms = argc > 6 ? ToNumber(ms) : 0;    year = (!$isNaN(year) && 0 <= TO_INTEGER(year) && TO_INTEGER(year) <= 99)        ? 1900 + TO_INTEGER(year) : year;    var day = MakeDay(year, month, date);    var time = MakeTime(hours, minutes, seconds, ms);    %_SetValueOf(this, TimeClip(UTC(MakeDate(day, time))));  } else {    // ECMA 262 - 15.9.2    return (new $Date()).toString();  }});// Helper functions.function GetTimeFrom(aDate) {  if (IS_DATE(aDate)) return %_ValueOf(aDate);  throw new $TypeError('this is not a Date object.');};function GetMillisecondsFrom(aDate) {  var t = GetTimeFrom(aDate);  if ($isNaN(t)) return t;  return msFromTime(LocalTime(t));};function GetUTCMillisecondsFrom(aDate) {  var t = GetTimeFrom(aDate);  if ($isNaN(t)) return t;  return msFromTime(t);};function GetSecondsFrom(aDate) {  var t = GetTimeFrom(aDate);  if ($isNaN(t)) return t;  return SecFromTime(LocalTime(t));};function GetUTCSecondsFrom(aDate) {  var t = GetTimeFrom(aDate);  if ($isNaN(t)) return t;  return SecFromTime(t);};function GetMinutesFrom(aDate) {  var t = GetTimeFrom(aDate);  if ($isNaN(t)) return t;  return MinFromTime(LocalTime(t));};function GetUTCMinutesFrom(aDate) {  var t = GetTimeFrom(aDate);  if ($isNaN(t)) return t;  return MinFromTime(t);};function GetHoursFrom(aDate) {  var t = GetTimeFrom(aDate);  if ($isNaN(t)) return t;  return HourFromTime(LocalTime(t));};function GetUTCHoursFrom(aDate) {  var t = GetTimeFrom(aDate);  if ($isNaN(t)) return t;  return HourFromTime(t);};function GetFullYearFrom(aDate) {  var t = GetTimeFrom(aDate);  if ($isNaN(t)) return t;  return YearFromTime(LocalTime(t));};function GetUTCFullYearFrom(aDate) {  var t = GetTimeFrom(aDate);  if ($isNaN(t)) return t;  return YearFromTime(t);};function GetMonthFrom(aDate) {  var t = GetTimeFrom(aDate);  if ($isNaN(t)) return t;  return MonthFromTime(LocalTime(t));};function GetUTCMonthFrom(aDate) {  var t = GetTimeFrom(aDate);  if ($isNaN(t)) return t;  return MonthFromTime(t);};function GetDateFrom(aDate) {  var t = GetTimeFrom(aDate);  if ($isNaN(t)) return t;  return DateFromTime(LocalTime(t));};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -