| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 |
- 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
|