@@ -20,7 +20,7 @@ import {Mutable} from './utils';
20
20
const TIME_RE = / ^ ( \d { 2 } ) (?: : ( \d { 2 } ) ) ? (?: : ( \d { 2 } ) ) ? ( \. \d + ) ? $ / ;
21
21
const DATE_RE = / ^ ( [ + - ] \d { 6 } | \d { 4 } ) - ( \d { 2 } ) - ( \d { 2 } ) $ / ;
22
22
const DATE_TIME_RE = / ^ ( [ + - ] \d { 6 } | \d { 4 } ) - ( \d { 2 } ) - ( \d { 2 } ) (?: T ( \d { 2 } ) ) ? (?: : ( \d { 2 } ) ) ? (?: : ( \d { 2 } ) ) ? ( \. \d + ) ? $ / ;
23
- const ZONED_DATE_TIME_RE = / ^ ( [ + - ] \d { 6 } | \d { 4 } ) - ( \d { 2 } ) - ( \d { 2 } ) (?: T ( \d { 2 } ) ) ? (?: : ( \d { 2 } ) ) ? (?: : ( \d { 2 } ) ) ? ( \. \d + ) ? (?: ( [ + - ] \d { 2 } ) (?: : ? ( \d { 2 } ) ) ? ) ? \[ ( .* ?) \] $ / ;
23
+ const ZONED_DATE_TIME_RE = / ^ ( [ + - ] \d { 6 } | \d { 4 } ) - ( \d { 2 } ) - ( \d { 2 } ) (?: T ( \d { 2 } ) ) ? (?: : ( \d { 2 } ) ) ? (?: : ( \d { 2 } ) ) ? ( \. \d + ) ? (?: ( [ + - ] \d { 2 } ) (?: : ? ( \d { 2 } ) ) ? (?: : ? ( \d { 2 } ) ) ? ) ? \[ ( .* ?) \] $ / ;
24
24
const ABSOLUTE_RE = / ^ ( [ + - ] \d { 6 } | \d { 4 } ) - ( \d { 2 } ) - ( \d { 2 } ) (?: T ( \d { 2 } ) ) ? (?: : ( \d { 2 } ) ) ? (?: : ( \d { 2 } ) ) ? ( \. \d + ) ? (?: (?: ( [ + - ] \d { 2 } ) (?: : ? ( \d { 2 } ) ) ? ) | Z ) $ / ;
25
25
const DATE_TIME_DURATION_RE =
26
26
/ ^ ( (?< negative > - ) | \+ ) ? P ( (?< years > \d * ) Y ) ? ( (?< months > \d * ) M ) ? ( (?< weeks > \d * ) W ) ? ( (?< days > \d * ) D ) ? ( (?< time > T ) ( (?< hours > \d * [ . , ] ? \d { 1 , 9 } ) H ) ? ( (?< minutes > \d * [ . , ] ? \d { 1 , 9 } ) M ) ? ( (?< seconds > \d * [ . , ] ? \d { 1 , 9 } ) S ) ? ) ? $ / ;
@@ -104,7 +104,7 @@ export function parseZonedDateTime(value: string, disambiguation?: Disambiguatio
104
104
year < 1 ? - year + 1 : year ,
105
105
parseNumber ( m [ 2 ] , 1 , 12 ) ,
106
106
1 ,
107
- m [ 10 ] ,
107
+ m [ 11 ] ,
108
108
0 ,
109
109
m [ 4 ] ? parseNumber ( m [ 4 ] , 0 , 23 ) : 0 ,
110
110
m [ 5 ] ? parseNumber ( m [ 5 ] , 0 , 59 ) : 0 ,
@@ -118,7 +118,8 @@ export function parseZonedDateTime(value: string, disambiguation?: Disambiguatio
118
118
119
119
let ms : number ;
120
120
if ( m [ 8 ] ) {
121
- date . offset = parseNumber ( m [ 8 ] , - 23 , 23 ) * 60 * 60 * 1000 + parseNumber ( m [ 9 ] ?? '0' , 0 , 59 ) * 60 * 1000 ;
121
+ let hourOffset = parseNumber ( m [ 8 ] , - 23 , 23 ) ;
122
+ date . offset = Math . sign ( hourOffset ) * ( Math . abs ( hourOffset ) * 60 * 60 * 1000 + parseNumber ( m [ 9 ] ?? '0' , 0 , 59 ) * 60 * 1000 + parseNumber ( m [ 10 ] ?? '0' , 0 , 59 ) * 1000 ) ;
122
123
ms = epochFromDate ( date as ZonedDateTime ) - date . offset ;
123
124
124
125
// Validate offset against parsed date.
@@ -212,8 +213,14 @@ function offsetToString(offset: number) {
212
213
let sign = Math . sign ( offset ) < 0 ? '-' : '+' ;
213
214
offset = Math . abs ( offset ) ;
214
215
let offsetHours = Math . floor ( offset / ( 60 * 60 * 1000 ) ) ;
215
- let offsetMinutes = ( offset % ( 60 * 60 * 1000 ) ) / ( 60 * 1000 ) ;
216
- return `${ sign } ${ String ( offsetHours ) . padStart ( 2 , '0' ) } :${ String ( offsetMinutes ) . padStart ( 2 , '0' ) } ` ;
216
+ let offsetMinutes = Math . floor ( ( offset % ( 60 * 60 * 1000 ) ) / ( 60 * 1000 ) ) ;
217
+ let offsetSeconds = Math . floor ( ( offset % ( 60 * 60 * 1000 ) ) % ( 60 * 1000 ) / 1000 ) ;
218
+ let stringOffset = `${ sign } ${ String ( offsetHours ) . padStart ( 2 , '0' ) } :${ String ( offsetMinutes ) . padStart ( 2 , '0' ) } ` ;
219
+ if ( offsetSeconds !== 0 ) {
220
+ stringOffset += `:${ String ( offsetSeconds ) . padStart ( 2 , '0' ) } ` ;
221
+ }
222
+
223
+ return stringOffset ;
217
224
}
218
225
219
226
export function zonedDateTimeToString ( date : ZonedDateTime ) : string {
0 commit comments