1 | 'use strict'
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 | module.exports.toRFC3339 = (time) => {
|
11 | const year = time.getUTCFullYear()
|
12 | const month = String(time.getUTCMonth() + 1).padStart(2, '0')
|
13 | const day = String(time.getUTCDate()).padStart(2, '0')
|
14 | const hour = String(time.getUTCHours()).padStart(2, '0')
|
15 | const minute = String(time.getUTCMinutes()).padStart(2, '0')
|
16 | const seconds = String(time.getUTCSeconds()).padStart(2, '0')
|
17 | const milliseconds = time.getUTCMilliseconds()
|
18 | const nanoseconds = milliseconds * 1000 * 1000
|
19 |
|
20 | return `${year}-${month}-${day}T${hour}:${minute}:${seconds}.${nanoseconds}Z`
|
21 | }
|
22 |
|
23 |
|
24 |
|
25 |
|
26 |
|
27 |
|
28 |
|
29 |
|
30 | module.exports.parseRFC3339 = (time) => {
|
31 | const rfc3339Matcher = new RegExp(
|
32 |
|
33 | '(\\d{4})-(\\d{2})-(\\d{2})T' +
|
34 |
|
35 | '(\\d{2}):(\\d{2}):(\\d{2})' +
|
36 |
|
37 | '\\.(\\d+)Z'
|
38 | )
|
39 | const m = String(time).trim().match(rfc3339Matcher)
|
40 |
|
41 | if (!m) {
|
42 | throw new Error('Invalid format')
|
43 | }
|
44 |
|
45 | const year = parseInt(m[1], 10)
|
46 | const month = parseInt(m[2], 10) - 1
|
47 | const date = parseInt(m[3], 10)
|
48 | const hour = parseInt(m[4], 10)
|
49 | const minute = parseInt(m[5], 10)
|
50 | const second = parseInt(m[6], 10)
|
51 | const millisecond = parseInt(m[7].slice(0, -6), 10)
|
52 |
|
53 | return new Date(Date.UTC(year, month, date, hour, minute, second, millisecond))
|
54 | }
|