mirror of
https://bitbucket.org/bellord13/kit.git
synced 2026-11-13 19:06:11 +03:00
385 lines
17 KiB
JavaScript
385 lines
17 KiB
JavaScript
/**
|
||
* 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
|
||
**/
|
||
__PluginManager__.register('date',function(require, exports, module, 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;
|
||
});
|
||
|