Files
juzi/h5/js/beijing-time.js
T

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 };
});