@@ -142,8 +142,8 @@ const formatCodes = {
142
142
143
143
export default function ( inputDate : Date , formatStr : string ) {
144
144
let d = inputDate
145
- if ( d instanceof TimezoneDate && d . timezoneOffset !== null ) {
146
- d = new Date ( ( + d ) + new Date ( ) . getTimezoneOffset ( ) * 60 * 1000 + d . timezoneOffset * 60 * 1000 )
145
+ if ( d instanceof TimezoneDate ) {
146
+ d = new Date ( ( + d ) + d . inputTimezoneOffset * 60 * 1000 )
147
147
}
148
148
149
149
let output = ''
@@ -175,24 +175,19 @@ function format (d: Date, match: RegExpExecArray) {
175
175
}
176
176
177
177
export class TimezoneDate extends Date {
178
- ISO8601_PATTERN = / ^ ( [ + - ] ? \d { 4 } (? ! \d { 2 } \b ) ) ( ( - ? ) ( ( 0 [ 1 - 9 ] | 1 [ 0 - 2 ] ) ( \3( [ 1 2 ] \d | 0 [ 1 - 9 ] | 3 [ 0 1 ] ) ) ? | W ( [ 0 - 4 ] \d | 5 [ 0 - 2 ] ) ( - ? [ 1 - 7 ] ) ? | ( 0 0 [ 1 - 9 ] | 0 [ 1 - 9 ] \d | [ 1 2 ] \d { 2 } | 3 ( [ 0 - 5 ] \d | 6 [ 1 - 6 ] ) ) ) ( [ T \s ] ( ( ( [ 0 1 ] \d | 2 [ 0 - 3 ] ) ( ( : ? ) [ 0 - 5 ] \d ) ? | 2 4 \: ? 0 0 ) ( [ . , ] \d + (? ! : ) ) ? ) ? ( \17[ 0 - 5 ] \d ( [ . , ] \d + ) ? ) ? ( [ z Z ] | ( [ + - ] ) ( [ 0 1 ] \d | 2 [ 0 - 3 ] ) : ? ( [ 0 - 5 ] \d ) ? ) ? ) ? ) ? $ / ;
179
- ISO8601_OFFSET_PATTERN = / ^ ( [ + - ] ) ( \d { 2 } ) : ( \d { 2 } ) $ / ;
178
+ ISO8601_TIMEZONE_PATTERN = / ( [ z Z ] | ( [ + - ] ) ( \d { 2 } ) : ( \d { 2 } ) ) $ / ;
180
179
181
- timezoneOffset : number | null = null ;
180
+ inputTimezoneOffset : number = 0 ;
182
181
183
182
constructor ( public dateString : string ) {
184
183
super ( dateString )
185
- const m = dateString . match ( this . ISO8601_PATTERN )
186
- const tzString = m && m [ 21 ]
187
- if ( tzString ) {
188
- if ( tzString === 'Z' ) {
189
- this . timezoneOffset = 0
190
- } else {
191
- const m2 = tzString . match ( this . ISO8601_OFFSET_PATTERN )
192
- if ( m2 ) {
193
- this . timezoneOffset = ( m2 [ 1 ] === '+' ? 1 : - 1 ) * ( parseInt ( m2 [ 2 ] , 10 ) * 60 + parseInt ( m2 [ 3 ] , 10 ) )
194
- }
195
- }
184
+ const m = dateString . match ( this . ISO8601_TIMEZONE_PATTERN )
185
+ if ( m && m [ 1 ] === 'Z' ) {
186
+ this . inputTimezoneOffset = this . getTimezoneOffset ( )
187
+ } else if ( m && m [ 2 ] && m [ 3 ] && m [ 4 ] ) {
188
+ const [ , , sign , hours , minutes ] = m ;
189
+ const delta = ( sign === '+' ? 1 : - 1 ) * ( parseInt ( hours , 10 ) * 60 + parseInt ( minutes , 10 ) )
190
+ this . inputTimezoneOffset = this . getTimezoneOffset ( ) + delta
196
191
}
197
192
}
198
193
}
0 commit comments