django-vue3-admin-web/node_modules/xe-utils/toStringDate.js
2025-10-20 21:21:14 +08:00

181 lines
4.7 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.

var staticParseInt = require('./staticParseInt')
var helperGetUTCDateTime = require('./helperGetUTCDateTime')
var helperGetDateTime = require('./helperGetDateTime')
var isString = require('./isString')
var isDate = require('./isDate')
function getParseRule (txt) {
return '(\\d{' + txt + '})'
}
function toParseMs (num) {
if (num < 10) {
return num * 100
} else if (num < 100) {
return num * 10
}
return num
}
function toParseNum (num) {
return isNaN(num) ? num : staticParseInt(num)
}
var d2 = getParseRule(2)
var d1or2 = getParseRule('1,2')
var d1or7 = getParseRule('1,7')
var d3or4 = getParseRule('3,4')
var place = '.{1}'
var d1Or2RE = place + d1or2
var dzZ = '(([zZ])|([-+]\\d{2}:?\\d{2}))'
var defaulParseStrs = [d3or4, d1Or2RE, d1Or2RE, d1Or2RE, d1Or2RE, d1Or2RE, place + d1or7, dzZ]
var defaulParseREs = []
for (var len = defaulParseStrs.length - 1; len >= 0; len--) {
var rule = ''
for (var i = 0; i < len + 1; i++) {
rule += defaulParseStrs[i]
}
defaulParseREs.push(new RegExp('^' + rule + '$'))
}
/**
* 解析默认格式
*/
function parseDefaultRules (str) {
var matchRest, resMaps = {}
for (var i = 0, dfrLen = defaulParseREs.length; i < dfrLen; i++) {
matchRest = str.match(defaulParseREs[i])
if (matchRest) {
resMaps.y = matchRest[1]
resMaps.M = matchRest[2]
resMaps.d = matchRest[3]
resMaps.H = matchRest[4]
resMaps.m = matchRest[5]
resMaps.s = matchRest[6]
resMaps.S = matchRest[7]
resMaps.Z = matchRest[8]
break
}
}
return resMaps
}
var customParseStrs = [
['yyyy', d3or4],
['yy', d2],
['MM', d2],
['M', d1or2],
['dd', d2],
['d', d1or2],
['HH', d2],
['H', d1or2],
['mm', d2],
['m', d1or2],
['ss', d2],
['s', d1or2],
['SSS', getParseRule(3)],
['S', d1or7],
['Z', dzZ]
]
var parseRuleMaps = {}
var parseRuleKeys = ['\\[([^\\]]+)\\]']
for (var i = 0; i < customParseStrs.length; i++) {
var itemRule = customParseStrs[i]
parseRuleMaps[itemRule[0]] = itemRule[1] + '?'
parseRuleKeys.push(itemRule[0])
}
var customParseRes = new RegExp(parseRuleKeys.join('|'), 'g')
var cacheFormatMaps = {}
/**
* 解析自定义格式
*/
function parseCustomRules (str, format) {
var cacheItem = cacheFormatMaps[format]
if (!cacheItem) {
var posIndexs = []
var re = format.replace(/([$(){}*+.?\\^|])/g, "\\$1").replace(customParseRes, function (text, val) {
var firstChar = text.charAt(0)
// 如果为转义符号:[关键字]
if (firstChar === '[') {
return val
}
posIndexs.push(firstChar)
return parseRuleMaps[text]
})
cacheItem = cacheFormatMaps[format] = {
_i: posIndexs,
_r: new RegExp(re)
}
}
var resMaps = {}
var matchRest = str.match(cacheItem._r)
if (matchRest) {
var _i = cacheItem._i
for (var i = 1, len = matchRest.length; i < len; i++) {
resMaps[_i[i - 1]] = matchRest[i]
}
return resMaps
}
return resMaps
}
/**
* 解析时区
*/
function parseTimeZone (resMaps) {
// 如果为UTC 时间
if (/^[zZ]/.test(resMaps.Z)) {
return new Date(helperGetUTCDateTime(resMaps))
} else {
// 如果指定时区,时区转换
var matchRest = resMaps.Z.match(/([-+])(\d{2}):?(\d{2})/)
if (matchRest) {
return new Date(helperGetUTCDateTime(resMaps) - (matchRest[1] === '-' ? -1 : 1) * staticParseInt(matchRest[2]) * 3600000 + staticParseInt(matchRest[3]) * 60000)
}
}
return new Date('')
}
/**
* 字符串转为日期
*
* @param {String/Number/Date} str 日期或数字
* @param {String} format 解析日期格式(yyyy年份、MM月份、dd天、hh(12)HH(24)小时、mm分钟、ss秒、SSS毫秒、Z时区)
* @return {Date}
*/
function toStringDate (str, format) {
if (str) {
var isDType = isDate(str)
if (isDType || (!format && /^[0-9]{11,15}$/.test(str))) {
return new Date(isDType ? helperGetDateTime(str) : staticParseInt(str))
}
if (isString(str)) {
var resMaps = format ? parseCustomRules(str, format) : parseDefaultRules(str)
if (resMaps.y) {
if (resMaps.M) {
resMaps.M = toParseNum(resMaps.M) - 1
}
if (resMaps.S) {
// 如果7位则是微秒只精确到3位毫秒
resMaps.S = toParseMs(toParseNum(resMaps.S.substring(0, 3)))
}
if (resMaps.Z) {
return parseTimeZone(resMaps)
} else {
return new Date(resMaps.y, resMaps.M || 0, resMaps.d || 1, resMaps.H || 0, resMaps.m || 0, resMaps.s || 0, resMaps.S || 0)
}
}
}
}
return new Date('')
}
module.exports = toStringDate