(value: string, timeZone: string)
| 163 | * or "2021-11-07T07:45:00-07:00"). The result is converted to the provided time zone. |
| 164 | */ |
| 165 | export function parseAbsolute(value: string, timeZone: string): ZonedDateTime { |
| 166 | let m = value.match(ABSOLUTE_RE); |
| 167 | if (!m) { |
| 168 | throw new Error('Invalid ISO 8601 date time string: ' + value); |
| 169 | } |
| 170 | |
| 171 | let year = parseNumber(m[1], -9999, 9999); |
| 172 | let era = year < 1 ? 'BC' : 'AD'; |
| 173 | |
| 174 | let date: Mutable<ZonedDateTime> = new ZonedDateTime( |
| 175 | era, |
| 176 | year < 1 ? -year + 1 : year, |
| 177 | parseNumber(m[2], 1, 12), |
| 178 | 1, |
| 179 | timeZone, |
| 180 | 0, |
| 181 | m[4] ? parseNumber(m[4], 0, 23) : 0, |
| 182 | m[5] ? parseNumber(m[5], 0, 59) : 0, |
| 183 | m[6] ? parseNumber(m[6], 0, 59) : 0, |
| 184 | m[7] ? parseNumber(m[7], 0, Infinity) * 1000 : 0 |
| 185 | ); |
| 186 | |
| 187 | date.day = parseNumber(m[3], 0, date.calendar.getDaysInMonth(date)); |
| 188 | |
| 189 | if (m[8]) { |
| 190 | date.offset = |
| 191 | parseNumber(m[8], -23, 23) * 60 * 60 * 1000 + parseNumber(m[9] ?? '0', 0, 59) * 60 * 1000; |
| 192 | } |
| 193 | |
| 194 | return toTimeZone(date as ZonedDateTime, timeZone); |
| 195 | } |
| 196 | |
| 197 | /** |
| 198 | * Parses an ISO 8601 date and time string with a UTC offset (e.g. "2021-11-07T07:45:00Z" |
no test coverage detected