38 lines
1.8 KiB
JavaScript
38 lines
1.8 KiB
JavaScript
/* Admin presentation/calendar rules only. Stored timestamps remain UTC ISO. */
|
|
(function(root, factory) {
|
|
if (typeof module === 'object' && module.exports) module.exports = factory();
|
|
else root.BeijingTime = factory();
|
|
})(typeof window !== 'undefined' ? window : this, function() {
|
|
'use strict';
|
|
var OFFSET = 8 * 60 * 60 * 1000, DAY = 86400000;
|
|
function milliseconds(value) {
|
|
if (typeof value === 'number') return isFinite(value) ? value : NaN;
|
|
if (typeof value !== 'string' || !value) return NaN;
|
|
// Zone-less full timestamps, if supplied, mean Beijing time, not host time.
|
|
if (/^\d{4}-\d\d-\d\d[T ]\d\d:\d\d(?::\d\d(?:\.\d+)?)?$/.test(value)) value = value.replace(' ', 'T') + '+08:00';
|
|
return Date.parse(value);
|
|
}
|
|
function shifted(value) {
|
|
var ms = milliseconds(value);
|
|
return isFinite(ms) ? new Date(ms + OFFSET).toISOString() : null;
|
|
}
|
|
function day(value) { var iso = shifted(value); return iso ? iso.slice(0, 10) : null; }
|
|
function format(value) { var iso = shifted(value); return iso ? iso.replace('T', ' ').slice(0, 19) : '-'; }
|
|
function boundary(value, end) {
|
|
if (/^\d{4}-\d\d-\d\d$/.test(value)) {
|
|
var date = Date.parse(value + 'T00:00:00.000Z');
|
|
if (!isFinite(date) || new Date(date).toISOString().slice(0, 10) !== value) return NaN;
|
|
return date - OFFSET + (end ? DAY : 0);
|
|
}
|
|
var ms = milliseconds(value);
|
|
return isFinite(ms) ? ms + (end ? 1 : 0) : NaN;
|
|
}
|
|
function range(from, to) {
|
|
var start = from ? boundary(from, false) : -Infinity;
|
|
var end = to ? boundary(to, true) : Infinity;
|
|
if (isNaN(start) || isNaN(end) || start >= end) throw new Error('日期无效或起始时间晚于结束时间');
|
|
return { start: start, end: end };
|
|
}
|
|
return { day: day, format: format, range: range, milliseconds: milliseconds };
|
|
});
|