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