Files
kit/assets/date/date.js
T
2022-05-30 17:50:04 +03:00

385 lines
17 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* date-php.js v1.7.15
* :-) date('Y-m-d', 1563148800000)
* This is a Javascript mimicking PHP datetime formatting function. It is very similar to PHP, has rich template
* characters, and enhances some template characters on the basis of the original.
*
* -- repository https://github.com/toviLau/date-php.git
*
* (c) 2019-2020 ToviLau. Released under the MIT License.
*
* @module date
**/
kit.PluginManager.register('date',function(module, exports, require, global) {
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
typeof define === 'function' && define.amd ? define(factory) :
(global = global || self, global.date = factory());
}(this, function () { 'use strict';
/**
* 补前导零(0)
* @param {number} str 字符
* @param {number} len 长度
* @param {string} placeholder 前导占位符
* @returns {string}
*/
function pad(str, len, placeholder) {
if ( placeholder === void 0 ) placeholder = '0';
str = '' + str;
if (str.length < len) {
return new Array(++len - str.length).join(placeholder) + str;
} else {
return str;
}
}var longDays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
var txt_ordin = {
1: 'st',
2: 'nd',
3: 'rd',
21: 'st',
22: 'nd',
23: 'rd',
31: 'st',
};
var txt_months = ['', 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
var baseFigure = {
1: '一',
2: '二',
3: '三',
4: '四',
5: '五',
6: '六',
};
var lunarTime = ['子', '丑', '寅', '卯', '辰', '巳', '午', '未', '申', '酉', '戌', '亥'];
var ordinal = ['first', 'second', 'third', 'fourth', 'fifth', 'sixth', 'seventh', 'eighth', 'ninth', 'tenth'];
var lunarKe = Object.assign.apply(
Object, [ {},
{
0: '零',
7: '七',
} ].concat( baseFigure )
);
var weekDay = Object.assign.apply(
Object, [ {},
{
0: '日',
} ].concat( baseFigure )
);
var dateFigure = Object.assign.apply(
Object, [ {},
{
0: '〇', 7: '七', 8: '八', 9: '九', 10: '十',
20: '廿', 30: '卅',
} ].concat( baseFigure )
);
var lMonth = Object.assign.apply(
Object, [ {},
{
7: '七', 8: '八', 9: '九', 10: '十', 11: '冬', 12: '腊',
} ].concat( baseFigure )
);
// 取中文日期(廿七)
var textReplace = function (res) { return res.toString()
.split('')
.reverse()
.map(function (val, key) {
var v = Math.pow(10, key) * val;
return v ? dateFigure[v] : null;
})
.reverse()
.join(''); };
// 取中文日期2(例:一九八七)
var textReplace2 = function (succ) { return (succ + '').split('').map(function (res) { return dateFigure[res]; }).join(''); };
function defP(obj, key, val) {
Object.defineProperty(obj, key, {
get: function () { return val; },
});
}
/**
*
* 计算持续时长
* @param {String} fmt 模板字符串
* @param {Number} timestamp 时间戳
* @param {Boolean} ms 是否是 含有毫秒
* @return 相印时间
*/
function duration(fmt, timestamp, ms) {
if ( fmt === void 0 ) fmt = 'D天h:i:s';
if ( timestamp === void 0 ) timestamp = 0;
if ( ms === void 0 ) ms = true;
var conversion = {
y: 12,
m: 30.4375,
d: 24,
h: 60,
i: 60,
s: 1000,
v: 1000,
};
var tChars = {
y: function () { return tChars.Y(); }, // 当前剩余年数,
Y: function () { return Math.floor(tChars.M() / conversion.y); }, // 总剩余年数,
m: function () { return pad(tChars.n(), 2); }, // 当前剩余月数(有前导零)
n: function () { return tChars.M() % conversion.y; }, // 当前剩余月数(无前导零)
M: function () { return Math.floor(tChars.D() / conversion.m); }, // 总剩余月数
d: function () { return pad(tChars.j(), 2); }, // 当前剩余天数(有前导零)
j: function () { return Math.floor(tChars.D() % conversion.m); }, // 当前剩余天数(无前导零)。
D: function () { return Math.floor(tChars.H() / conversion.d); }, // 总剩余天数
h: function () { return pad(tChars.g(), 2); }, // 当前小时剩余数(有前导零)
g: function () { return Math.floor(tChars.H() % conversion.d); }, // 当前小时剩余数(无前导零)
H: function () { return Math.floor(tChars.I() / conversion.h); }, // 总剩余小时数
i: function () { return pad(Math.floor(tChars.I() % conversion.h),2); }, // 当前分钟剩余点数
I: function () { return Math.floor(tChars.S() / conversion.i); }, // 总剩余分钟数
s: function () { return pad(Math.floor(tChars.S() % conversion.i), 2); }, // 当前秒钟剩余点数
S: function () { return Math.floor(tChars.V() / conversion.s); }, // 总剩余秒数
v: function () { return pad(Math.floor(tChars.V() % conversion.s), 3); }, // 当前毫秒剩余数
V: function () { return ms ? new Date(timestamp)-0 : new Date(timestamp) * conversion.v; }, // 总剩余毫秒数
};
return fmt.replace(/(\\?([a-z]))/ig, function (res, key) {
var result = '';
if (res !== key) {
result = key;
} else {
if (tChars[key]) {
result = tChars[key]();
} else {
result = key.replace('\\', '');
}
}
return result;
});
}
/**
* 计算持续时间
* @param fmt
* @param timestamp1
* @param timestamp2
* @param ms
* @return 相印时间
*/
function countTime(fmt, timestamp1, timestamp2, ms) {
if ( fmt === void 0 ) fmt = 'D天h:i:s';
if ( timestamp1 === void 0 ) timestamp1 = 0;
if ( timestamp2 === void 0 ) timestamp2 = 0;
if ( ms === void 0 ) ms = true;
var count = new Date(timestamp1) - new Date(timestamp2) || 0;
return duration(fmt, Math.abs(count), ms);
}
var isDate = function (d) {
return new Date(d).toString() !== 'Invalid Date';
};
/**
* @memberOf kit
* @param fmt
* @param now
* @param ms
* @return {string}
*/
var date = function (fmt, now, ms) {
if ( fmt === void 0 ) fmt = 'Y-m-d';
if ( now === void 0 ) now = new Date;
if ( ms === void 0 ) ms = true;
now = isDate(this)
? this
: isDate(now)
? new Date(now)
: new Date;
if (ms === false) { now = new Date(now * 1000); }
if (!isDate(now)) { throw Error((function (D) {
return '' +
'参数2不正确,须传入 “日期时间对象”,或 “Unix时间戳” 或 “时间戳字符串”。\n可以参考以下值:\n' +
" \"" + D + "\"\n" +
" \"" + (D.toUTCString()) + "\"\n" +
" " + (D.getTime()) + " -- 推荐\n";
})(new Date())); }
// 模板字串替换函数
var tChars = {
// 日
d: function () { return pad(tChars.j(), 2); },
k: function () { return textReplace(tChars.j()); }, // 中文日(1.3.2+), PHP中无此功能
D: function () { return tChars.l().substr(0, 3); },
j: function () { return now.getDate(); },
lt: function () { return lunarTime[Math.floor((tChars.G() >= 23 ? 0 : tChars.G() + 1) / 2)]; },
lg: function () { return tChars.G() > 18 || tChars.G() < 5 ? Math.ceil((tChars.G() < 19 ? tChars.G() + 24 : tChars.G()) / 2) - 9 : ''; },
lG: function () { return ("" + (tChars.lg() ? baseFigure[tChars.lg()] + '更' : '')); },
lk: function () { return lunarKe[Math.floor(((tChars.U() + 60 * 60) % (60 * 60 * 2)) / 60 / 15)]; },
fh: function () { return (getFestival(tChars.Y() + tChars.m() + tChars.d()).cn || []).join(); },
lh: function () { return (getFestival(tChars.Y() + tChars.m() + tChars.d()).en || []).join(); },
l: function () { return longDays[tChars.w()]; },
N: function () { return tChars.w() === 0 ? 7 : tChars.w(); },
S: function () { return txt_ordin[tChars.j()] ? txt_ordin[tChars.j()] : 'th'; },
w: function () { return now.getDay(); },
K: function () { return weekDay[tChars.w()]; }, // 中文周(1.3.2+)
z: function () { return Math.ceil((now - new Date(tChars.Y() + '/1/1')) / (60 * 60 * 24 * 1e3)); },
// 周
W: function () {
var inYearDay = tChars.z(); // 当前年份中的第n天
var yDay = new Date(tChars.Y() + '1/1').getDay(); // 第一天周几
var diffDay = (yDay > 0) - 0;
return Math.ceil((inYearDay - yDay) / 7) + diffDay;
},
// 月
F: function () { return txt_months[tChars.n()]; },
f: function () { return textReplace(tChars.n()); }, // 中文月(1.3.2+), PHP中无此功能
m: function () { return pad(tChars.n(), 2); },
M: function () { return tChars.F().substr(0, 3); },
n: function () { return now.getMonth() + 1; },
t: function () {
var year = tChars.Y();
var nextMonth = tChars.n();
if (nextMonth === 12) {
year += 1;
nextMonth = 0;
}
return new Date(year, nextMonth, 0).getDate();
},
lq: function () { return Math.ceil((tChars.n() - 0) / 3); }, // 季度数字
lQ: function () { return baseFigure[tChars.lq()]; }, // 季度汉字(1.6.0+)
q: function () { return txt_ordin[tChars.lq()] ? tChars.lq() + '' + txt_ordin[tChars.lq()] : tChars.lq() + 'th'; }, // 季度英文缩写
Q: function () { return ordinal[tChars.lq() - 1]; }, // 李度英文(1.6.0+)
// 年
L: function () { return Number(tChars.Y() % 400 === 0 || (tChars.Y() % 100 !== 0 && tChars.Y() % 4 === 0)); },
o: function () {
var yearWeek = new Date(tChars.Y(), 0, 1).getDay();
var diffTime = 60 * 60 * 24 * 1000 * (7 - yearWeek);
var timestramp = yearWeek > 3 ? now.getTime() - diffTime : now.getTime();
return new Date(timestramp).getFullYear();
},
Y: function () { return now.getFullYear(); },
y: function () { return (tChars.Y() + '').slice(2); },
C: function () { return textReplace2(tChars.Y()); }, // 中文年(1.3.2+), PHP中无此功能
// 时间
a: function () { return tChars.G() > 11 ? 'pm' : 'am'; },
A: function () { return tChars.a().toUpperCase(); },
B: function () {
var off = (now.getTimezoneOffset() + 60) * 60;
var theSeconds = (tChars.G() * 3600) + (now.getMinutes() * 60) + now.getSeconds() + off;
var beat = Math.floor(theSeconds / 86.4);
// beat > 1000 ? beat -= 1000 : beat += 1000
if (beat > 1000) { beat -= 1000; }
if (beat < 0) { beat += 1000; }
return pad(beat, 3);
},
g: function () { return tChars.G() % 12 || 12; },
G: function () { return now.getHours(); },
h: function () { return pad(tChars.g(), 2); },
H: function () { return pad(tChars.G(), 2); },
i: function () { return pad(now.getMinutes(), 2); },
s: function () { return pad(now.getSeconds(), 2); },
u: function () { return tChars.v() + pad(Math.floor(Math.random() * 1000), 3); },
v: function () { return (now.getTime() + '').substr(-3); },
// 时区
e: function () { return Intl.DateTimeFormat().resolvedOptions().timeZone; },
I: function () {
var DST = null;
for (var i = 0; i < 12; ++i) {
var d = new Date(tChars.Y(), i, 1);
var offset = d.getTimezoneOffset();
if (DST === null) { DST = offset; }
else if (offset < DST) {
DST = offset;
break;
} else if (offset > DST) { break; }
}
return (now.getTimezoneOffset() === DST) | 0;
},
O: function () { return (now.getTimezoneOffset() > 0 ? '-' : '+') + pad(Math.abs(now.getTimezoneOffset() / 60 * 100), 4); },
P: function () { return tChars.O().match(/[+-]?\d{2}/g).join(':'); },
T: function () {
var tz = now.toLocaleTimeString(navigator.language, { timeZoneName: 'short' }).split(/\s/);
return tz[tz.length - 1];
},
Z: function () { return -(now.getTimezoneOffset() * 60); },
// 完整日期时间
c: function () { return tChars.Y() + '-' + tChars.m() + '-' + tChars.d() + 'T' + tChars.h() + ':' + tChars.i() + ':' + tChars.s() + tChars.P(); },
r: function () { return now.toString(); },
U: function () { return Math.round(now.getTime() / 1000); },
};
if (fmt === 'json' || fmt === 'all' || fmt === -1 || fmt === '-1') {
var json = {};
Object.keys(tChars).forEach(function (res, idx) { return json[res] = tChars[res](); });
return json;
}
return fmt.replace(/\\?(([lf][a-z])|([a-z]))/ig, function (res, key) {
var result = '';
if (res !== key) {
result = key;
} else {
if (tChars[key]) {
result = tChars[key]();
} else {
result = key.replace('\\', '');
}
}
return result;
});
};
defP(Date.prototype, 'format', date);
defP(date, 'version', '1.7.15');
defP(date, 'description', function () { return (console.info('%cdate-php使用说明:\n' +
'已经废弃,查看使用说明请移步这里\nhttps://github.com/toviLau/date-php/blob/master/README.md'
, 'color:#c63'
)); });
date.duration = duration;
date.countTime = countTime;
date.DATA_ATOM = "Y-m-d\TH:i:sP";
date.DATA_COOKIE = "l, d-M-Y H:i:s T";
date.DATA_ISO8601 = "Y-m-d\TH:i:sO";
date.DATA_RFC822 = "D, d M y H:i:s O";
date.DATA_RFC850 = "l, d-M-y H:i:s T";
date.DATA_RFC1036 = "D, d M y H:i:s O";
date.DATA_RFC1123 = "D, d M Y H:i:s O";
date.DATA_RFC7231 = "D, d M Y H:i:s \G\M\T";
date.DATA_RFC2822 = "D, d M Y H:i:s O";
date.DATA_RFC3339 = "Y-m-d\TH:i:sP";
date.DATA_RFC3339_EXTENDED = "Y-m-d\TH:i:s.vP";
date.DATA_RSS = "D, d M Y H:i:s O";
date.DATA_W3C = "Y-m-d\TH:i:sP";
date.DATA_DB = "Y-m-d H:i:s";
return date;
}));
return module.exports;
});