@@ -13,7 +13,8 @@ export default (o, c, d) => {
13
13
let defaultTimezone
14
14
15
15
const localUtcOffset = d ( ) . utcOffset ( )
16
- const tzOffset = ( timestamp , timezone ) => {
16
+
17
+ const makeFormatParts = ( timestamp , timezone , option = { } ) => {
17
18
const date = new Date ( timestamp )
18
19
const dtf = new Intl . DateTimeFormat ( 'en-US' , {
19
20
hour12 : false ,
@@ -23,9 +24,14 @@ export default (o, c, d) => {
23
24
day : '2-digit' ,
24
25
hour : '2-digit' ,
25
26
minute : '2-digit' ,
26
- second : '2-digit'
27
+ second : '2-digit' ,
28
+ timeZoneName : option . timeZoneName || 'short'
27
29
} )
28
- const formatResult = dtf . formatToParts ( date )
30
+ return dtf . formatToParts ( date )
31
+ }
32
+
33
+ const tzOffset = ( timestamp , timezone ) => {
34
+ const formatResult = makeFormatParts ( timestamp , timezone )
29
35
const filled = [ ]
30
36
for ( let i = 0 ; i < formatResult . length ; i += 1 ) {
31
37
const { type, value } = formatResult [ i ]
@@ -35,13 +41,14 @@ export default (o, c, d) => {
35
41
filled [ pos ] = parseInt ( value , 10 )
36
42
}
37
43
}
44
+ const hour = filled [ 3 ]
38
45
// Workaround for the same behavior in different node version
39
46
// https://github.com/nodejs/node/issues/33027
40
- const hour = filled [ 3 ]
47
+ /* istanbul ignore next */
41
48
const fixedHour = hour === 24 ? 0 : hour
42
49
const utcString = `${ filled [ 0 ] } -${ filled [ 1 ] } -${ filled [ 2 ] } ${ fixedHour } :${ filled [ 4 ] } :${ filled [ 5 ] } :000`
43
50
const utcTs = d . utc ( utcString ) . valueOf ( )
44
- let asTS = + date
51
+ let asTS = + timestamp
45
52
const over = asTS % 1000
46
53
asTS -= over
47
54
return ( utcTs - asTS ) / ( 60 * 1000 )
@@ -76,7 +83,16 @@ export default (o, c, d) => {
76
83
proto . tz = function ( timezone = defaultTimezone ) {
77
84
const target = this . toDate ( ) . toLocaleString ( 'en-US' , { timeZone : timezone } )
78
85
const diff = Math . round ( ( this . toDate ( ) - new Date ( target ) ) / 1000 / 60 )
79
- return d ( target ) . utcOffset ( localUtcOffset - diff , true ) . $set ( ms , this . $ms )
86
+ const ins = d ( target ) . utcOffset ( localUtcOffset - diff , true ) . $set ( ms , this . $ms )
87
+ ins . $x . $timezone = timezone
88
+ return ins
89
+ }
90
+
91
+ proto . offsetName = function ( type ) {
92
+ // type: short(default) / long
93
+ const zone = this . $x . $timezone || d . tz . guess ( )
94
+ const result = makeFormatParts ( this . valueOf ( ) , zone , { timeZoneName : type } ) . find ( m => m . type . toLowerCase ( ) === 'timezonename' )
95
+ return result && result . value
80
96
}
81
97
82
98
d . tz = function ( input , timezone = defaultTimezone ) {
@@ -89,6 +105,7 @@ export default (o, c, d) => {
89
105
localTs = localTs || d . utc ( input ) . valueOf ( )
90
106
const [ targetTs , targetOffset ] = fixOffset ( localTs , previousOffset , timezone )
91
107
const ins = d ( targetTs ) . utcOffset ( targetOffset )
108
+ ins . $x . $timezone = timezone
92
109
return ins
93
110
}
94
111
0 commit comments