1 | var staticParseInt = require('./staticParseInt')
|
2 |
|
3 | var helperGetUTCDateTime = require('./helperGetUTCDateTime')
|
4 | var helperGetDateTime = require('./helperGetDateTime')
|
5 |
|
6 | var isString = require('./isString')
|
7 | var isDate = require('./isDate')
|
8 |
|
9 | function getParseRule (txt) {
|
10 | return '(\\d{' + txt + '})'
|
11 | }
|
12 |
|
13 | function 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 |
|
22 | function toParseNum (num) {
|
23 | return isNaN(num) ? num : staticParseInt(num)
|
24 | }
|
25 |
|
26 | var d2 = getParseRule('2')
|
27 | var d1or2 = getParseRule('1,2')
|
28 | var d1or3 = getParseRule('1,3')
|
29 | var d3or4 = getParseRule('3,4')
|
30 | var place = '.{1}'
|
31 | var d1Or2RE = place + d1or2
|
32 | var dzZ = '(([zZ])|([-+]\\d{2}:?\\d{2}))'
|
33 |
|
34 | var defaulParseStrs = [d3or4, d1Or2RE, d1Or2RE, d1Or2RE, d1Or2RE, d1Or2RE, place + d1or3, dzZ]
|
35 | var defaulParseREs = []
|
36 |
|
37 | for (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 |
|
48 | function 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 |
|
67 | var 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 | ]
|
84 | var parseRuleMaps = {}
|
85 | var parseRuleKeys = ['\\[([^\\]]+)\\]']
|
86 |
|
87 | for (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 |
|
93 | var customParseRes = new RegExp(parseRuleKeys.join('|'), 'g')
|
94 | var cacheFormatMaps = {}
|
95 |
|
96 |
|
97 |
|
98 |
|
99 | function 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 |
|
132 | function parseTimeZone (resMaps) {
|
133 |
|
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 |
|
150 |
|
151 |
|
152 |
|
153 | function 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 |
|
179 | module.exports = toStringDate
|