UNPKG

4.76 kBJavaScriptView Raw
1var staticParseInt = require('./staticParseInt')
2
3var helperGetUTCDateTime = require('./helperGetUTCDateTime')
4var helperGetDateTime = require('./helperGetDateTime')
5
6var isString = require('./isString')
7var isDate = require('./isDate')
8
9function getParseRule (txt) {
10 return '(\\d{' + txt + '})'
11}
12
13function toParseMs (num) {
14 if (num < 10) {
15 return num * 100
16 } else if (num < 100) {
17 return num * 10
18 }
19 return num
20}
21
22function toParseNum (num) {
23 return isNaN(num) ? num : staticParseInt(num)
24}
25
26var d2 = getParseRule('2')
27var d1or2 = getParseRule('1,2')
28var d1or3 = getParseRule('1,3')
29var d3or4 = getParseRule('3,4')
30var place = '.{1}'
31var d1Or2RE = place + d1or2
32var dzZ = '(([zZ])|([-+]\\d{2}:?\\d{2}))'
33
34var defaulParseStrs = [d3or4, d1Or2RE, d1Or2RE, d1Or2RE, d1Or2RE, d1Or2RE, place + d1or3, dzZ]
35var defaulParseREs = []
36
37for (var len = defaulParseStrs.length - 1; len >= 0; len--) {
38 var rule = ''
39 for (var i = 0; i < len + 1; i++) {
40 rule += defaulParseStrs[i]
41 }
42 defaulParseREs.push(new RegExp('^' + rule + '$'))
43}
44
45/**
46 * 解析默认格式
47 */
48function parseDefaultRules (str) {
49 var matchRest, resMaps = {}
50 for (var i = 0, dfrLen = defaulParseREs.length; i < dfrLen; i++) {
51 matchRest = str.match(defaulParseREs[i])
52 if (matchRest) {
53 resMaps.y = matchRest[1]
54 resMaps.M = matchRest[2]
55 resMaps.d = matchRest[3]
56 resMaps.H = matchRest[4]
57 resMaps.m = matchRest[5]
58 resMaps.s = matchRest[6]
59 resMaps.S = matchRest[7]
60 resMaps.Z = matchRest[8]
61 break
62 }
63 }
64 return resMaps
65}
66
67var customParseStrs = [
68 ['yyyy', d3or4],
69 ['yy', d2],
70 ['MM', d2],
71 ['M', d1or2],
72 ['dd', d2],
73 ['d', d1or2],
74 ['HH', d2],
75 ['H', d1or2],
76 ['mm', d2],
77 ['m', d1or2],
78 ['ss', d2],
79 ['s', d1or2],
80 ['SSS', getParseRule('3')],
81 ['S', d1or3],
82 ['Z', dzZ]
83]
84var parseRuleMaps = {}
85var parseRuleKeys = ['\\[([^\\]]+)\\]']
86
87for (var i = 0; i < customParseStrs.length; i++) {
88 var itemRule = customParseStrs[i]
89 parseRuleMaps[itemRule[0]] = itemRule[1] + '?'
90 parseRuleKeys.push(itemRule[0])
91}
92
93var customParseRes = new RegExp(parseRuleKeys.join('|'), 'g')
94var cacheFormatMaps = {}
95
96/**
97 * 解析自定义格式
98 */
99function parseCustomRules (str, format) {
100 var cacheItem = cacheFormatMaps[format]
101 if (!cacheItem) {
102 var posIndexs = []
103 var re = format.replace(/([$(){}*+.?\\^|])/g, "\\$1").replace(customParseRes, function (text, val) {
104 var firstChar = text.charAt(0)
105 // 如果为转义符号:[关键字]
106 if (firstChar === '[') {
107 return val
108 }
109 posIndexs.push(firstChar)
110 return parseRuleMaps[text]
111 })
112 cacheItem = cacheFormatMaps[format] = {
113 _i: posIndexs,
114 _r: new RegExp(re)
115 }
116 }
117 var resMaps = {}
118 var matchRest = str.match(cacheItem._r)
119 if (matchRest) {
120 var _i = cacheItem._i
121 for (var i = 1, len = matchRest.length; i < len; i++) {
122 resMaps[_i[i - 1]] = matchRest[i]
123 }
124 return resMaps
125 }
126 return resMaps
127}
128
129/**
130 * 解析时区
131 */
132function parseTimeZone (resMaps) {
133 // 如果为UTC 时间
134 if (/^[zZ]/.test(resMaps.Z)) {
135 return new Date(helperGetUTCDateTime(resMaps))
136 } else {
137 // 如果指定时区,时区转换
138 var matchRest = resMaps.Z.match(/([-+])(\d{2}):?(\d{2})/)
139 if (matchRest) {
140 return new Date(helperGetUTCDateTime(resMaps) - (matchRest[1] === '-' ? -1 : 1) * staticParseInt(matchRest[2]) * 3600000 + staticParseInt(matchRest[3]) * 60000)
141 }
142 }
143 return new Date('')
144}
145
146/**
147 * 字符串转为日期
148 *
149 * @param {String/Number/Date} str 日期或数字
150 * @param {String} format 解析日期格式(yyyy年份、MM月份、dd天、hh(12)HH(24)小时、mm分钟、ss秒、SSS毫秒、Z时区)
151 * @return {Date}
152 */
153function toStringDate (str, format) {
154 if (str) {
155 var isDType = isDate(str)
156 if (isDType || (!format && /^[0-9]{11,15}$/.test(str))) {
157 return new Date(isDType ? helperGetDateTime(str) : staticParseInt(str))
158 }
159 if (isString(str)) {
160 var resMaps = format ? parseCustomRules(str, format) : parseDefaultRules(str)
161 if (resMaps.y) {
162 if (resMaps.M) {
163 resMaps.M = toParseNum(resMaps.M) - 1
164 }
165 if (resMaps.S) {
166 resMaps.S = toParseMs(toParseNum(resMaps.S))
167 }
168 if (resMaps.Z) {
169 return parseTimeZone(resMaps)
170 } else {
171 return new Date(resMaps.y, resMaps.M || 0, resMaps.d || 1, resMaps.H || 0, resMaps.m || 0, resMaps.s || 0, resMaps.S || 0)
172 }
173 }
174 }
175 }
176 return new Date('')
177}
178
179module.exports = toStringDate