347 lines
11 KiB
JavaScript
347 lines
11 KiB
JavaScript
"use strict";
|
||
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
exports.msPerDay = exports.msPerHour = exports.msPerMinute = exports.msPerSecond = exports.HoursPerDay = exports.MinutesPerHour = exports.SecondsPerMinute = undefined;
|
||
exports.Day = Day;
|
||
exports.TimeWithinDay = TimeWithinDay;
|
||
exports.DaysInYear = DaysInYear;
|
||
exports.DayFromYear = DayFromYear;
|
||
exports.TimeFromYear = TimeFromYear;
|
||
exports.YearFromTime = YearFromTime;
|
||
exports.InLeapYear = InLeapYear;
|
||
exports.MonthFromTime = MonthFromTime;
|
||
exports.DayWithinYear = DayWithinYear;
|
||
exports.DateFromTime = DateFromTime;
|
||
exports.WeekDay = WeekDay;
|
||
exports.DaylightSavingTA = DaylightSavingTA;
|
||
exports.LocalTime = LocalTime;
|
||
exports.UTC = UTC;
|
||
exports.HourFromTime = HourFromTime;
|
||
exports.MinFromTime = MinFromTime;
|
||
exports.SecFromTime = SecFromTime;
|
||
exports.msFromTime = msFromTime;
|
||
exports.MakeTime = MakeTime;
|
||
exports.MakeDay = MakeDay;
|
||
exports.MakeDate = MakeDate;
|
||
exports.TimeClip = TimeClip;
|
||
exports.thisTimeValue = thisTimeValue;
|
||
exports.ToDateString = ToDateString;
|
||
|
||
var _index = require("../values/index.js");
|
||
|
||
var _singletons = require("../singletons.js");
|
||
|
||
var _invariant = require("../invariant.js");
|
||
|
||
var _invariant2 = _interopRequireDefault(_invariant);
|
||
|
||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
||
// Constants
|
||
var SecondsPerMinute = exports.SecondsPerMinute = 60; /**
|
||
* Copyright (c) 2017-present, Facebook, Inc.
|
||
* All rights reserved.
|
||
*
|
||
* This source code is licensed under the BSD-style license found in the
|
||
* LICENSE file in the root directory of this source tree. An additional grant
|
||
* of patent rights can be found in the PATENTS file in the same directory.
|
||
*/
|
||
|
||
var MinutesPerHour = exports.MinutesPerHour = 60;
|
||
var HoursPerDay = exports.HoursPerDay = 24;
|
||
var msPerSecond = exports.msPerSecond = 1000;
|
||
var msPerMinute = exports.msPerMinute = msPerSecond * SecondsPerMinute;
|
||
var msPerHour = exports.msPerHour = msPerMinute * MinutesPerHour;
|
||
var msPerDay = exports.msPerDay = msPerHour * HoursPerDay;
|
||
|
||
var LocalTZA = -new Date(0).getTimezoneOffset() * msPerMinute;
|
||
|
||
// ECMA262 20.3.1.2
|
||
function Day(realm, t) {
|
||
return Math.floor(t / msPerDay);
|
||
}
|
||
|
||
// ECMA262 20.3.1.2
|
||
function TimeWithinDay(realm, t) {
|
||
return t % msPerDay;
|
||
}
|
||
|
||
// ECMA262 20.3.1.3
|
||
function DaysInYear(realm, y) {
|
||
if (y % 4 !== 0) return 365;
|
||
if (y % 4 === 0 && y % 100 !== 0) return 366;
|
||
if (y % 100 === 0 && y % 400 !== 0) return 365;
|
||
if (y % 400 === 0) return 366;
|
||
|
||
(0, _invariant2.default)(false, "Invalid condition");
|
||
}
|
||
|
||
// ECMA262 20.3.1.3
|
||
function DayFromYear(realm, y) {
|
||
return 365 * (y - 1970) + Math.floor((y - 1969) / 4) - Math.floor((y - 1901) / 100) + Math.floor((y - 1601) / 400);
|
||
}
|
||
|
||
// ECMA262 20.3.1.3
|
||
function TimeFromYear(realm, y) {
|
||
return msPerDay * DayFromYear(realm, y);
|
||
}
|
||
|
||
// ECMA262 20.3.1.3
|
||
function YearFromTime(realm, t) {
|
||
var y = Math.floor(t / (msPerDay * 365.2425)) + 1970;
|
||
var t2 = TimeFromYear(realm, y);
|
||
|
||
if (t2 > t) {
|
||
y--;
|
||
} else {
|
||
if (t2 + msPerDay * DaysInYear(realm, y) <= t) {
|
||
y++;
|
||
}
|
||
}
|
||
return y;
|
||
}
|
||
|
||
// ECMA262 20.3.1.3
|
||
function InLeapYear(realm, t) {
|
||
var daysInYear = DaysInYear(realm, YearFromTime(realm, t));
|
||
if (daysInYear === 365) return 0;
|
||
if (daysInYear === 366) return 1;
|
||
(0, _invariant2.default)(false, "invalid condition");
|
||
}
|
||
|
||
// ECMA262 20.3.1.4
|
||
function MonthFromTime(realm, t) {
|
||
var step = void 0;
|
||
var d = DayWithinYear(realm, t);
|
||
|
||
if (d < (step = 31)) return 0;
|
||
|
||
step += InLeapYear(realm, t) ? 29 : 28;
|
||
if (d < step) return 1;
|
||
if (d < (step += 31)) return 2;
|
||
if (d < (step += 30)) return 3;
|
||
if (d < (step += 31)) return 4;
|
||
if (d < (step += 30)) return 5;
|
||
if (d < (step += 31)) return 6;
|
||
if (d < (step += 31)) return 7;
|
||
if (d < (step += 30)) return 8;
|
||
if (d < (step += 31)) return 9;
|
||
if (d < (step += 30)) return 10;
|
||
return 11;
|
||
}
|
||
|
||
// ECMA262 20.3.1.4
|
||
function DayWithinYear(realm, t) {
|
||
return Day(realm, t) - DayFromYear(realm, YearFromTime(realm, t));
|
||
}
|
||
|
||
// ECMA262 20.3.1.5
|
||
function DateFromTime(realm, t) {
|
||
var step = void 0;
|
||
var next = void 0;
|
||
var d = DayWithinYear(realm, t);
|
||
|
||
if (d <= (next = 30)) return d + 1;
|
||
|
||
step = next;
|
||
next += InLeapYear(realm, t) ? 29 : 28;
|
||
if (d <= next) return d - step;
|
||
|
||
step = next;
|
||
if (d <= (next += 31)) return d - step;
|
||
|
||
step = next;
|
||
if (d <= (next += 30)) return d - step;
|
||
|
||
step = next;
|
||
if (d <= (next += 31)) return d - step;
|
||
|
||
step = next;
|
||
if (d <= (next += 30)) return d - step;
|
||
|
||
step = next;
|
||
if (d <= (next += 31)) return d - step;
|
||
|
||
step = next;
|
||
if (d <= (next += 31)) return d - step;
|
||
|
||
step = next;
|
||
if (d <= (next += 30)) return d - step;
|
||
|
||
step = next;
|
||
if (d <= (next += 31)) return d - step;
|
||
|
||
step = next;
|
||
if (d <= (next += 30)) return d - step;
|
||
|
||
step = next;
|
||
return d - step;
|
||
}
|
||
|
||
// ECMA262 20.3.1.6
|
||
function WeekDay(realm, t) {
|
||
return (Day(realm, t) + 4) % 7;
|
||
}
|
||
|
||
// ECMA262 20.3.1.7
|
||
function DaylightSavingTA(realm, t) {
|
||
// TODO #1014: Implement DaylightSavingTA
|
||
return 0;
|
||
}
|
||
|
||
// ECMA262 20.3.1.9
|
||
function LocalTime(realm, t) {
|
||
// 1. Return t + LocalTZA + DaylightSavingTA(t).
|
||
return t + LocalTZA + DaylightSavingTA(realm, t);
|
||
}
|
||
|
||
// ECMA262 20.3.1.10
|
||
function UTC(realm, t) {
|
||
if (t instanceof _index.Value) t = t.throwIfNotConcreteNumber().value;
|
||
|
||
// 1. Return t - LocalTZA - DaylightSavingTA(t - LocalTZA).
|
||
return new _index.NumberValue(realm, t - LocalTZA - DaylightSavingTA(realm, t - LocalTZA));
|
||
}
|
||
|
||
// ECMA262 20.3.1.11
|
||
function HourFromTime(realm, t) {
|
||
return Math.floor(t / msPerHour) % HoursPerDay;
|
||
}
|
||
|
||
// ECMA262 20.3.1.11
|
||
function MinFromTime(realm, t) {
|
||
return Math.floor(t / msPerMinute) % MinutesPerHour;
|
||
}
|
||
|
||
// ECMA262 20.3.1.11
|
||
function SecFromTime(realm, t) {
|
||
return Math.floor(t / msPerSecond) % SecondsPerMinute;
|
||
}
|
||
|
||
// ECMA262 20.3.1.11
|
||
function msFromTime(realm, t) {
|
||
return t % msPerSecond;
|
||
}
|
||
|
||
// ECMA262 20.3.1.12
|
||
function MakeTime(realm, hour, min, sec, ms) {
|
||
// 1. If hour is not finite or min is not finite or sec is not finite or ms is not finite, return NaN.
|
||
if (!isFinite(hour) || !isFinite(min) || !isFinite(sec) || !isFinite(ms)) return NaN;
|
||
|
||
// 2. Let h be ToInteger(hour).
|
||
var h = _singletons.To.ToInteger(realm, new _index.NumberValue(realm, hour));
|
||
|
||
// 3. Let m be ToInteger(min).
|
||
var m = _singletons.To.ToInteger(realm, new _index.NumberValue(realm, min));
|
||
|
||
// 4. Let s be ToInteger(sec).
|
||
var s = _singletons.To.ToInteger(realm, new _index.NumberValue(realm, sec));
|
||
|
||
// 5. Let milli be ToInteger(ms).
|
||
var milli = _singletons.To.ToInteger(realm, new _index.NumberValue(realm, ms));
|
||
|
||
// 6. Let t be h * msPerHour + m * msPerMinute + s * msPerSecond + milli, performing the arithmetic
|
||
// according to IEEE 754-2008 rules (that is, as if using the ECMAScript operators * and +).
|
||
var t = h * msPerHour + m * msPerMinute + s * msPerSecond + milli;
|
||
|
||
// 7. Return t.
|
||
return t;
|
||
}
|
||
|
||
// ECMA262 20.3.1.13
|
||
function MakeDay(realm, year, month, date) {
|
||
// 1. If year is not finite or month is not finite or date is not finite, return NaN.
|
||
if (!isFinite(year) || !isFinite(month) || !isFinite(date)) return NaN;
|
||
|
||
// 2. Let y be ToInteger(year).
|
||
var y = _singletons.To.ToInteger(realm, new _index.NumberValue(realm, year));
|
||
|
||
// 3. Let m be ToInteger(month).
|
||
var m = _singletons.To.ToInteger(realm, new _index.NumberValue(realm, month));
|
||
|
||
// 4. Let dt be ToInteger(date).
|
||
var dt = _singletons.To.ToInteger(realm, new _index.NumberValue(realm, date));
|
||
|
||
// 5. Let ym be y + floor(m / 12).
|
||
var ym = y + Math.floor(m / 12);
|
||
|
||
// 6. Let mn be m modulo 12.
|
||
var mn = m < 0 ? m % 12 + 12 : m % 12;
|
||
|
||
// 7. Find a value t such that YearFromTime(t) is ym and MonthFromTime(t) is mn and DateFromTime(t) is 1;
|
||
// but if this is not possible (because some argument is out of range), return NaN.
|
||
// Inspired by the V8 implementation.
|
||
if (Math.abs(ym) >= 1000000.0 || Math.abs(mn) >= 1000000.0) {
|
||
return NaN;
|
||
}
|
||
var yearDelta = 399999;
|
||
var baseDay = 365 * (1970 + yearDelta) + Math.floor((1970 + yearDelta) / 4) - Math.floor((1970 + yearDelta) / 100) + Math.floor((1970 + yearDelta) / 400);
|
||
var t = 365 * (ym + yearDelta) + Math.floor((ym + yearDelta) / 4) - Math.floor((ym + yearDelta) / 100) + Math.floor((ym + yearDelta) / 400) - baseDay;
|
||
|
||
if (ym % 4 !== 0 || ym % 100 === 0 && ym % 400 !== 0) {
|
||
t += [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334][mn];
|
||
} else {
|
||
t += [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335][mn];
|
||
}
|
||
|
||
// 8. Return Day(t) + dt - 1.
|
||
return t + dt - 1;
|
||
}
|
||
|
||
// ECMA262 20.3.1.14
|
||
function MakeDate(realm, day, time) {
|
||
// 1. If day is not finite or time is not finite, return NaN.
|
||
if (!isFinite(day) || !isFinite(time)) return NaN;
|
||
|
||
// 2. Return day × msPerDay + time.
|
||
return day * msPerDay + time;
|
||
}
|
||
|
||
// ECMA262 20.3.1.15
|
||
function TimeClip(realm, time) {
|
||
if (time instanceof _index.Value) time = time.throwIfNotConcreteNumber().value;
|
||
// 1. If time is not finite, return NaN.
|
||
if (!isFinite(time)) return realm.intrinsics.NaN;
|
||
|
||
// 2. If abs(time) > 8.64 × 10^15, return NaN.
|
||
if (Math.abs(time) > 8640000000000000) {
|
||
return realm.intrinsics.NaN;
|
||
}
|
||
|
||
// 3. Let clippedTime be ToInteger(time).
|
||
var clippedTime = _singletons.To.ToInteger(realm, new _index.NumberValue(realm, time));
|
||
|
||
// 4. If clippedTime is -0, let clippedTime be +0.
|
||
if (Object.is(clippedTime, -0)) clippedTime = +0;
|
||
|
||
// 5. Return clippedTime.
|
||
return new _index.NumberValue(realm, clippedTime);
|
||
}
|
||
|
||
// ECMA262 20.3.4
|
||
function thisTimeValue(realm, value) {
|
||
// 1. If Type(value) is Object and value has a [[DateValue]] internal slot, then
|
||
if (value instanceof _index.ObjectValue && value.$DateValue !== undefined) {
|
||
// a. Return the value of value's [[DateValue]] internal slot.
|
||
return value.$DateValue;
|
||
}
|
||
|
||
// 2. Throw a TypeError exception.
|
||
throw realm.createErrorThrowCompletion(realm.intrinsics.TypeError);
|
||
}
|
||
|
||
// ECMA262 20.3.4.41.1
|
||
function ToDateString(realm, tv) {
|
||
// 1. Assert: Type(tv) is Number.
|
||
(0, _invariant2.default)(typeof tv === "number", "expected tv to be a number");
|
||
|
||
// 2. If tv is NaN, return "Invalid Date".
|
||
if (isNaN(tv)) return "Invalid Date";
|
||
|
||
// 3. Return an implementation-dependent String value that represents tv as a date and time in the current
|
||
// time zone using a convenient, human-readable form.
|
||
return new Date(tv).toString();
|
||
}
|
||
//# sourceMappingURL=date.js.map
|