time-zones-imported.js (33464B)
1 // |reftest| skip-if(winWidget||!this.hasOwnProperty("Intl")) -- Windows doesn't accept IANA names for the TZ env variable; Requires ICU time zone support 2 3 // Imported tests from es6draft and then adapted to use ICU/CLDR time zone display names. 4 5 function assertSame(expected, actual, message = undefined) { 6 if (message !== undefined) 7 assertEq(actual, expected, String(message)); 8 else 9 assertEq(actual, expected); 10 } 11 12 function assertTrue(actual, message = undefined) { 13 assertSame(true, actual, message); 14 } 15 16 // File: lib/datetime.jsm 17 const { 18 DayOfWeek, 19 Month, 20 DateTime, 21 TimeZone, 22 Format, 23 } = (function() { 24 25 // 5.2 Algorithm Conventions 26 function modulo(dividend, divisor) { 27 assertTrue(typeof dividend === "number"); 28 assertTrue(typeof divisor === "number"); 29 assertTrue(divisor !== 0 && Number.isFinite(divisor)); 30 let remainder = dividend % divisor; 31 // NB: add +0 to convert -0 to +0 32 return (remainder >= 0 ? remainder + 0 : remainder + divisor); 33 } 34 35 // 7.1.4 ToInteger ( argument ) 36 function ToInteger(number) { 37 /* steps 1-2 */ 38 assertTrue(typeof number === "number"); 39 /* step 3 */ 40 if (Number.isNaN(number)) 41 return +0.0; 42 /* step 4 */ 43 if (number == 0.0 || !Number.isFinite(number)) 44 return number; 45 /* step 5 */ 46 return Math.sign(number) * Math.floor(Math.abs(number)); 47 } 48 49 // 20.3.1.2 Day Number and Time within Day 50 const msPerDay = 86400000; 51 52 // 20.3.1.2 Day Number and Time within Day 53 function Day(t) { 54 assertTrue(typeof t === "number"); 55 return Math.floor(t / msPerDay); 56 } 57 58 // 20.3.1.2 Day Number and Time within Day 59 function TimeWithinDay(t) { 60 assertTrue(typeof t === "number"); 61 return modulo(t, msPerDay); 62 } 63 64 // 20.3.1.3 Year Number 65 function DaysInYear(y) { 66 assertTrue(typeof y === "number"); 67 if (y % 4 !== 0) { 68 return 365; 69 } 70 if (y % 100 !== 0) { 71 return 366; 72 } 73 if (y % 400 !== 0) { 74 return 365; 75 } 76 return 366; 77 } 78 79 // 20.3.1.3 Year Number 80 function DayFromYear(y) { 81 assertTrue(typeof y === "number"); 82 return 365 * (y - 1970) + Math.floor((y - 1969) / 4) - Math.floor((y - 1901) / 100) + Math.floor((y - 1601) / 400); 83 } 84 85 // 20.3.1.3 Year Number 86 function TimeFromYear(y) { 87 assertTrue(typeof y === "number"); 88 return msPerDay * DayFromYear(y); 89 } 90 91 // TODO: fill in rest 92 93 // 20.3.1.10 Hours, Minutes, Second, and Milliseconds 94 const HoursPerDay = 24; 95 const MinutesPerHour = 60; 96 const SecondsPerMinute = 60; 97 const msPerSecond = 1000; 98 const msPerMinute = msPerSecond * SecondsPerMinute; 99 const msPerHour = msPerMinute * MinutesPerHour; 100 101 // 20.3.1.10 Hours, Minutes, Second, and Milliseconds 102 function HourFromTime(t) { 103 assertTrue(typeof t === "number"); 104 return modulo(Math.floor(t / msPerHour), HoursPerDay); 105 } 106 107 // 20.3.1.10 Hours, Minutes, Second, and Milliseconds 108 function MinFromTime(t) { 109 assertTrue(typeof t === "number"); 110 return modulo(Math.floor(t / msPerMinute), MinutesPerHour); 111 } 112 113 // 20.3.1.10 Hours, Minutes, Second, and Milliseconds 114 function SecFromTime(t) { 115 assertTrue(typeof t === "number"); 116 return modulo(Math.floor(t / msPerSecond), SecondsPerMinute); 117 } 118 119 // 20.3.1.10 Hours, Minutes, Second, and Milliseconds 120 function msFromTime(t) { 121 assertTrue(typeof t === "number"); 122 return modulo(t, msPerSecond); 123 } 124 125 // 20.3.1.11 MakeTime (hour, min, sec, ms) 126 function MakeTime(hour, min, sec, ms) { 127 assertTrue(typeof hour === "number"); 128 assertTrue(typeof min === "number"); 129 assertTrue(typeof sec === "number"); 130 assertTrue(typeof ms === "number"); 131 if (!Number.isFinite(hour) || !Number.isFinite(min) || !Number.isFinite(sec) || !Number.isFinite(ms)) { 132 return Number.NaN; 133 } 134 let h = ToInteger(hour); 135 let m = ToInteger(min); 136 let s = ToInteger(sec); 137 let milli = ToInteger(ms); 138 let t = h * msPerHour + m * msPerMinute + s * msPerSecond + milli; 139 return t; 140 } 141 142 // 20.3.1.12 MakeDay (year, month, date) 143 function MakeDay(year, month, date) { 144 assertTrue(typeof year === "number"); 145 assertTrue(typeof month === "number"); 146 assertTrue(typeof date === "number"); 147 if (!Number.isFinite(year) || !Number.isFinite(month) || !Number.isFinite(date)) { 148 return Number.NaN; 149 } 150 let y = ToInteger(year); 151 let m = ToInteger(month); 152 let dt = ToInteger(date); 153 let ym = y + Math.floor(m / 12); 154 let mn = modulo(m, 12); 155 156 const monthStart = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334]; 157 let day = Math.floor(TimeFromYear(ym) / msPerDay) + monthStart[mn]; 158 if (mn >= 2 && DaysInYear(ym) == 366) { 159 day += 1; 160 } 161 162 return day + dt - 1; 163 } 164 165 // 20.3.1.13 MakeDate (day, time) 166 function MakeDate(day, time) { 167 assertTrue(typeof day === "number"); 168 assertTrue(typeof time === "number"); 169 if (!Number.isFinite(day) || !Number.isFinite(time)) { 170 return Number.NaN; 171 } 172 return day * msPerDay + time; 173 } 174 175 // 20.3.1.14 TimeClip (time) 176 function TimeClip(time) { 177 assertTrue(typeof time === "number"); 178 if (!Number.isFinite(time)) { 179 return Number.NaN; 180 } 181 if (Math.abs(time) > 8.64e15) { 182 return Number.NaN; 183 } 184 return ToInteger(time) + (+0); 185 } 186 187 const DayOfWeek = { 188 Sunday: 0, 189 Monday: 1, 190 Tuesday: 2, 191 Wednesday: 3, 192 Thursday: 4, 193 Friday: 5, 194 Saturday: 6, 195 }; 196 197 const Month = { 198 January: 0, 199 February: 1, 200 March: 2, 201 April: 3, 202 May: 4, 203 June: 5, 204 July: 6, 205 August: 7, 206 September: 8, 207 October: 9, 208 November: 10, 209 December: 11, 210 }; 211 212 const DateTime = { 213 Local: class { 214 constructor(year, month, day, weekday, hour = 0, minute = 0, second = 0, ms = 0) { 215 Object.assign(this, {year, month, day, weekday, hour, minute, second, ms}); 216 } 217 218 toDate() { 219 return new Date(this.year, this.month, this.day, this.hour, this.minute, this.second, this.ms); 220 } 221 }, 222 UTC: class { 223 constructor(year, month, day, weekday, hour = 0, minute = 0, second = 0, ms = 0) { 224 Object.assign(this, {year, month, day, weekday, hour, minute, second, ms}); 225 } 226 227 toInstant() { 228 return MakeDate(MakeDay(this.year, this.month, this.day), MakeTime(this.hour, this.minute, this.second, this.ms)); 229 } 230 }, 231 }; 232 233 function TimeZone(hour, minute = 0, second = 0) { 234 return new class TimeZone { 235 constructor(hour, minute, second) { 236 Object.assign(this, {hour, minute, second}); 237 } 238 239 toOffset() { 240 let offset = TimeZoneOffset(this.hour, this.minute, this.second); 241 return offset !== 0 ? -offset : 0; 242 } 243 }(hour, minute, second); 244 245 function TimeZoneOffset(hour, minute = 0, second = 0) { 246 assertTrue(typeof hour === "number"); 247 assertTrue(typeof minute === "number"); 248 assertTrue(typeof second === "number"); 249 assertTrue(minute >= 0); 250 assertTrue(second >= 0); 251 if (hour < 0 || Object.is(-0, hour)) { 252 return hour * MinutesPerHour - minute - (second / 60); 253 } 254 return hour * MinutesPerHour + minute + (second / 60); 255 } 256 } 257 258 const Format = { 259 Locale: "en-US", 260 DateTime: { 261 localeMatcher: "lookup", 262 timeZone: void 0, 263 weekday: "short", 264 era: void 0, 265 year: "numeric", 266 month: "2-digit", 267 day: "2-digit", 268 hour: "2-digit", 269 minute: "2-digit", 270 second: "2-digit", 271 timeZoneName: "short", 272 formatMatcher: "best fit", 273 hour12: void 0, 274 }, 275 Date: { 276 localeMatcher: "lookup", 277 timeZone: void 0, 278 weekday: "short", 279 era: void 0, 280 year: "numeric", 281 month: "2-digit", 282 day: "2-digit", 283 hour: void 0, 284 minute: void 0, 285 second: void 0, 286 timeZoneName: void 0, 287 formatMatcher: "best fit", 288 hour12: void 0, 289 }, 290 Time: { 291 localeMatcher: "lookup", 292 timeZone: void 0, 293 weekday: void 0, 294 era: void 0, 295 year: void 0, 296 month: void 0, 297 day: void 0, 298 hour: "2-digit", 299 minute: "2-digit", 300 second: "2-digit", 301 timeZoneName: "short", 302 formatMatcher: "best fit", 303 hour12: void 0, 304 }, 305 }; 306 307 return { 308 DayOfWeek, 309 Month, 310 DateTime, 311 TimeZone, 312 Format, 313 }; 314 })(); 315 316 317 // File: lib/assert-datetime.js 318 319 function assertDate(local, utc, timeZone, options, formatArgs) { 320 let d = local.toDate(); 321 assertDateValue(d, utc.toInstant(), timeZone.toOffset()); 322 assertLocalDate(d, local); 323 assertUTCDate(d, utc); 324 assertDateString(d, options, formatArgs); 325 } 326 327 function assertDateValue(actual, dateValue, timeZoneOffset) { 328 assertSame(dateValue, actual.valueOf(), `valueOf()[${dateValue - actual.valueOf()}]`); 329 assertSame(dateValue, actual.getTime(), `valueOf()[${dateValue - actual.getTime()}]`); 330 assertSame(timeZoneOffset, actual.getTimezoneOffset(), "getTimezoneOffset()"); 331 } 332 333 function assertLocalDate(actual, {year, month, day, weekday, hour = 0, minute = 0, second = 0, ms = 0}) { 334 assertSame(year, actual.getFullYear(), "getFullYear()"); 335 assertSame(month, actual.getMonth(), "getMonth()"); 336 assertSame(day, actual.getDate(), "getDate()"); 337 assertSame(weekday, actual.getDay(), "getDay()"); 338 assertSame(hour, actual.getHours(), "getHours()"); 339 assertSame(minute, actual.getMinutes(), "getMinutes()"); 340 assertSame(second, actual.getSeconds(), "getSeconds()"); 341 assertSame(ms, actual.getMilliseconds(), "getMilliseconds()"); 342 } 343 344 function assertUTCDate(actual, {year, month, day, weekday, hour = 0, minute = 0, second = 0, ms = 0}) { 345 assertSame(year, actual.getUTCFullYear(), "getUTCFullYear()"); 346 assertSame(month, actual.getUTCMonth(), "getUTCMonth()"); 347 assertSame(day, actual.getUTCDate(), "getUTCDate()"); 348 assertSame(weekday, actual.getUTCDay(), "getUTCDay()"); 349 assertSame(hour, actual.getUTCHours(), "getUTCHours()"); 350 assertSame(minute, actual.getUTCMinutes(), "getUTCMinutes()"); 351 assertSame(second, actual.getUTCSeconds(), "getUTCSeconds()"); 352 assertSame(ms, actual.getUTCMilliseconds(), "getUTCMilliseconds()"); 353 } 354 355 function assertDateString(actual, options, formatArgs = { 356 LocaleString: [Format.Locale, Format.DateTime], 357 LocaleDateString: [Format.Locale, Format.Date], 358 LocaleTimeString: [Format.Locale, Format.Time], 359 }) { 360 for (var key of Object.keys(options)) { 361 var args = formatArgs[key] || []; 362 assertSame(options[key], actual[`to${key}`](...args), `to${key}()`); 363 } 364 } 365 366 367 // File: Date/Africa_Monrovia.js 368 // Liberia was the last country to switch to UTC based offsets (1972 May). 369 370 inTimeZone("Africa/Monrovia", () => { 371 { 372 let local = new DateTime.Local(1972, Month.January, 6, DayOfWeek.Thursday, 0, 0, 0); 373 let utc = new DateTime.UTC(1972, Month.January, 6, DayOfWeek.Thursday, 0, 44, 30); 374 375 assertDate(local, utc, TimeZone(-0,44,30), { 376 String: "Thu Jan 06 1972 00:00:00 GMT-0044 (Greenwich Mean Time)", 377 UTCString: "Thu, 06 Jan 1972 00:44:30 GMT", 378 }); 379 } 380 381 { 382 let local = new DateTime.Local(1972, Month.January, 6, DayOfWeek.Thursday, 23, 59, 0); 383 let utc = new DateTime.UTC(1972, Month.January, 7, DayOfWeek.Friday, 0, 43, 30); 384 385 assertDate(local, utc, TimeZone(-0,44,30), { 386 String: "Thu Jan 06 1972 23:59:00 GMT-0044 (Greenwich Mean Time)", 387 UTCString: "Fri, 07 Jan 1972 00:43:30 GMT", 388 }); 389 } 390 391 { 392 let local = new DateTime.Local(1972, Month.January, 7, DayOfWeek.Friday, 0, 0, 0); 393 let utc = new DateTime.UTC(1972, Month.January, 7, DayOfWeek.Friday, 0, 44, 30); 394 395 assertDateValue(local.toDate(), utc.toInstant(), TimeZone(+0).toOffset()); 396 397 assertDateString(local.toDate(), { 398 String: "Fri Jan 07 1972 00:44:30 GMT+0000 (Greenwich Mean Time)", 399 UTCString: "Fri, 07 Jan 1972 00:44:30 GMT", 400 }); 401 } 402 403 { 404 let local = new DateTime.Local(1972, Month.January, 7, DayOfWeek.Friday, 0, 44, 30); 405 let utc = new DateTime.UTC(1972, Month.January, 7, DayOfWeek.Friday, 0, 44, 30); 406 407 assertDate(local, utc, TimeZone(+0), { 408 String: "Fri Jan 07 1972 00:44:30 GMT+0000 (Greenwich Mean Time)", 409 UTCString: "Fri, 07 Jan 1972 00:44:30 GMT", 410 }); 411 } 412 413 { 414 let local = new DateTime.Local(1972, Month.January, 7, DayOfWeek.Friday, 0, 45, 0); 415 let utc = new DateTime.UTC(1972, Month.January, 7, DayOfWeek.Friday, 0, 45, 0); 416 417 assertDate(local, utc, TimeZone(+0), { 418 String: "Fri Jan 07 1972 00:45:00 GMT+0000 (Greenwich Mean Time)", 419 UTCString: "Fri, 07 Jan 1972 00:45:00 GMT", 420 }); 421 } 422 423 { 424 let local = new DateTime.Local(1972, Month.January, 8, DayOfWeek.Saturday, 0, 0, 0); 425 let utc = new DateTime.UTC(1972, Month.January, 8, DayOfWeek.Saturday, 0, 0, 0); 426 427 assertDate(local, utc, TimeZone(+0), { 428 String: "Sat Jan 08 1972 00:00:00 GMT+0000 (Greenwich Mean Time)", 429 UTCString: "Sat, 08 Jan 1972 00:00:00 GMT", 430 }); 431 } 432 }); 433 434 435 // File: Date/Africa_Monrovia.js 436 // Africa/Tripoli switched from +02:00 to +01:00 and back. 437 438 inTimeZone("Africa/Tripoli", () => { 439 { 440 // +02:00 (standard time) 441 let local = new DateTime.Local(2012, Month.November, 1, DayOfWeek.Thursday, 0, 0, 0); 442 let utc = new DateTime.UTC(2012, Month.October, 31, DayOfWeek.Wednesday, 22, 0, 0); 443 444 assertDate(local, utc, TimeZone(+2), { 445 String: "Thu Nov 01 2012 00:00:00 GMT+0200 (Eastern European Standard Time)", 446 UTCString: "Wed, 31 Oct 2012 22:00:00 GMT", 447 }); 448 } 449 450 { 451 // +01:00 (standard time) 452 let local = new DateTime.Local(2012, Month.December, 1, DayOfWeek.Saturday, 0, 0, 0); 453 let utc = new DateTime.UTC(2012, Month.November, 30, DayOfWeek.Friday, 23, 0, 0); 454 455 assertDate(local, utc, TimeZone(+1), { 456 String: "Sat Dec 01 2012 00:00:00 GMT+0100 (Eastern European Standard Time)", 457 UTCString: "Fri, 30 Nov 2012 23:00:00 GMT", 458 }); 459 } 460 461 { 462 // +01:00 (daylight savings) 463 let local = new DateTime.Local(2013, Month.October, 1, DayOfWeek.Tuesday, 0, 0, 0); 464 let utc = new DateTime.UTC(2013, Month.September, 30, DayOfWeek.Monday, 22, 0, 0); 465 466 assertDate(local, utc, TimeZone(+2), { 467 String: "Tue Oct 01 2013 00:00:00 GMT+0200 (Eastern European Summer Time)", 468 UTCString: "Mon, 30 Sep 2013 22:00:00 GMT", 469 }); 470 } 471 472 { 473 // +02:00 (standard time) 474 let local = new DateTime.Local(2013, Month.November, 1, DayOfWeek.Friday, 0, 0, 0); 475 let utc = new DateTime.UTC(2013, Month.October, 31, DayOfWeek.Thursday, 22, 0, 0); 476 477 assertDate(local, utc, TimeZone(+2), { 478 String: "Fri Nov 01 2013 00:00:00 GMT+0200 (Eastern European Standard Time)", 479 UTCString: "Thu, 31 Oct 2013 22:00:00 GMT", 480 }); 481 } 482 }); 483 484 485 // File: Date/America_Caracas.js 486 // America/Caracas switched from -04:00 to -04:30 on 2007 Dec 9. 487 488 inTimeZone("America/Caracas", () => { 489 { 490 // -04:00 (standard time) 491 let local = new DateTime.Local(2007, Month.December, 5, DayOfWeek.Wednesday, 0, 0, 0); 492 let utc = new DateTime.UTC(2007, Month.December, 5, DayOfWeek.Wednesday, 4, 0, 0); 493 494 assertDate(local, utc, TimeZone(-4), { 495 String: "Wed Dec 05 2007 00:00:00 GMT-0400 (Venezuela Time)", 496 DateString: "Wed Dec 05 2007", 497 TimeString: "00:00:00 GMT-0400 (Venezuela Time)", 498 UTCString: "Wed, 05 Dec 2007 04:00:00 GMT", 499 ISOString: "2007-12-05T04:00:00.000Z", 500 LocaleString: "Wed, 12/05/2007, 12:00:00 AM GMT-4", 501 LocaleDateString: "Wed, 12/05/2007", 502 LocaleTimeString: "12:00:00 AM GMT-4", 503 }); 504 } 505 506 { 507 // -04:30 (standard time) 508 let local = new DateTime.Local(2007, Month.December, 12, DayOfWeek.Wednesday, 0, 0, 0); 509 let utc = new DateTime.UTC(2007, Month.December, 12, DayOfWeek.Wednesday, 4, 30, 0); 510 511 assertDate(local, utc, TimeZone(-4, 30), { 512 String: "Wed Dec 12 2007 00:00:00 GMT-0430 (Venezuela Time)", 513 DateString: "Wed Dec 12 2007", 514 TimeString: "00:00:00 GMT-0430 (Venezuela Time)", 515 UTCString: "Wed, 12 Dec 2007 04:30:00 GMT", 516 ISOString: "2007-12-12T04:30:00.000Z", 517 LocaleString: "Wed, 12/12/2007, 12:00:00 AM GMT-4:30", 518 LocaleDateString: "Wed, 12/12/2007", 519 LocaleTimeString: "12:00:00 AM GMT-4:30", 520 }); 521 } 522 }); 523 524 525 // File: Date/Australia_Lord_Howe.js 526 // Australia/Lord_Howe time zone offset is +10:30 and daylight savings amount is 00:30. 527 528 inTimeZone("Australia/Lord_Howe", () => { 529 { 530 // +10:30 (standard time) 531 let local = new DateTime.Local(2010, Month.August, 1, DayOfWeek.Sunday, 0, 0, 0); 532 let utc = new DateTime.UTC(2010, Month.July, 31, DayOfWeek.Saturday, 13, 30, 0); 533 534 assertDate(local, utc, TimeZone(+10,30), { 535 String: "Sun Aug 01 2010 00:00:00 GMT+1030 (Lord Howe Standard Time)", 536 DateString: "Sun Aug 01 2010", 537 TimeString: "00:00:00 GMT+1030 (Lord Howe Standard Time)", 538 UTCString: "Sat, 31 Jul 2010 13:30:00 GMT", 539 ISOString: "2010-07-31T13:30:00.000Z", 540 LocaleString: "Sun, 08/01/2010, 12:00:00 AM GMT+10:30", 541 LocaleDateString: "Sun, 08/01/2010", 542 LocaleTimeString: "12:00:00 AM GMT+10:30", 543 }); 544 } 545 546 { 547 // +10:30 (daylight savings) 548 let local = new DateTime.Local(2010, Month.January, 3, DayOfWeek.Sunday, 0, 0, 0); 549 let utc = new DateTime.UTC(2010, Month.January, 2, DayOfWeek.Saturday, 13, 0, 0); 550 551 assertDate(local, utc, TimeZone(+11), { 552 String: "Sun Jan 03 2010 00:00:00 GMT+1100 (Lord Howe Daylight Time)", 553 DateString: "Sun Jan 03 2010", 554 TimeString: "00:00:00 GMT+1100 (Lord Howe Daylight Time)", 555 UTCString: "Sat, 02 Jan 2010 13:00:00 GMT", 556 ISOString: "2010-01-02T13:00:00.000Z", 557 LocaleString: "Sun, 01/03/2010, 12:00:00 AM GMT+11", 558 LocaleDateString: "Sun, 01/03/2010", 559 LocaleTimeString: "12:00:00 AM GMT+11", 560 }); 561 } 562 }); 563 564 565 // File: Date/Europe_Amsterdam.js 566 // Europe/Amsterdam as an example for mean time like timezones after LMT (AMT, NST). 567 // 568 // tzdata2022b changed Europe/Amsterdam into a link to Europe/Brussels. 569 570 inTimeZone("Europe/Amsterdam", () => { 571 { 572 let local = new DateTime.Local(1935, Month.January, 1, DayOfWeek.Tuesday, 0, 0, 0); 573 let utc = new DateTime.UTC(1935, Month.January, 1, DayOfWeek.Tuesday, 0, 0, 0); 574 575 assertDate(local, utc, TimeZone(+0,0,0), { 576 String: "Tue Jan 01 1935 00:00:00 GMT+0000 (Central European Standard Time)", 577 UTCString: "Tue, 01 Jan 1935 00:00:00 GMT", 578 }); 579 } 580 581 { 582 let local = new DateTime.Local(1935, Month.July, 1, DayOfWeek.Monday, 0, 0, 0); 583 let utc = new DateTime.UTC(1935, Month.June, 30, DayOfWeek.Sunday, 23, 0, 0); 584 585 assertDate(local, utc, TimeZone(+1,0,0), { 586 String: "Mon Jul 01 1935 00:00:00 GMT+0100 (Central European Summer Time)", 587 UTCString: "Sun, 30 Jun 1935 23:00:00 GMT", 588 }); 589 } 590 }); 591 592 // Use America/St_Johns as a replacement for the Europe/Amsterdam test case. 593 // 594 // Zone America/St_Johns as an example for mean time like timezones after LMT (NST, NDT). 595 596 inTimeZone("America/St_Johns", () => { 597 { 598 let local = new DateTime.Local(1917, Month.January, 1, DayOfWeek.Monday, 0, 0, 0); 599 let utc = new DateTime.UTC(1917, Month.January, 1, DayOfWeek.Monday, 3, 30, 52); 600 601 assertDate(local, utc, TimeZone(-3,30,52), { 602 String: "Mon Jan 01 1917 00:00:00 GMT-0330 (Newfoundland Standard Time)", 603 UTCString: "Mon, 01 Jan 1917 03:30:52 GMT", 604 }); 605 } 606 607 { 608 let local = new DateTime.Local(1917, Month.July, 1, DayOfWeek.Sunday, 0, 0, 0); 609 let utc = new DateTime.UTC(1917, Month.July, 1, DayOfWeek.Sunday, 2, 30, 52); 610 611 assertDate(local, utc, TimeZone(-2,30,52), { 612 String: "Sun Jul 01 1917 00:00:00 GMT-0230 (Newfoundland Daylight Time)", 613 UTCString: "Sun, 01 Jul 1917 02:30:52 GMT", 614 }); 615 } 616 }); 617 618 619 // File: Date/Europe_London.js 620 621 inTimeZone("Europe/London", () => { 622 { 623 // +01:00 (standard time) 624 let local = new DateTime.Local(1970, Month.January, 1, DayOfWeek.Thursday, 0, 0, 0); 625 let utc = new DateTime.UTC(1969, Month.December, 31, DayOfWeek.Wednesday, 23, 0, 0); 626 627 assertDate(local, utc, TimeZone(+1), { 628 String: "Thu Jan 01 1970 00:00:00 GMT+0100 (Greenwich Mean Time)", 629 DateString: "Thu Jan 01 1970", 630 TimeString: "00:00:00 GMT+0100 (Greenwich Mean Time)", 631 UTCString: "Wed, 31 Dec 1969 23:00:00 GMT", 632 ISOString: "1969-12-31T23:00:00.000Z", 633 LocaleString: "Thu, 01/01/1970, 12:00:00 AM GMT+1", 634 LocaleDateString: "Thu, 01/01/1970", 635 LocaleTimeString: "12:00:00 AM GMT+1", 636 }); 637 } 638 }); 639 640 641 // File: Date/Europe_Moscow.js 642 643 inTimeZone("Europe/Moscow", () => { 644 { 645 let local = new DateTime.Local(1970, Month.January, 1, DayOfWeek.Thursday, 0, 0, 0); 646 let utc = new DateTime.UTC(1969, Month.December, 31, DayOfWeek.Wednesday, 21, 0, 0); 647 648 assertDate(local, utc, TimeZone(+3), { 649 String: "Thu Jan 01 1970 00:00:00 GMT+0300 (Moscow Standard Time)", 650 DateString: "Thu Jan 01 1970", 651 TimeString: "00:00:00 GMT+0300 (Moscow Standard Time)", 652 UTCString: "Wed, 31 Dec 1969 21:00:00 GMT", 653 ISOString: "1969-12-31T21:00:00.000Z", 654 LocaleString: "Thu, 01/01/1970, 12:00:00 AM GMT+3", 655 LocaleDateString: "Thu, 01/01/1970", 656 LocaleTimeString: "12:00:00 AM GMT+3", 657 }); 658 } 659 660 // Russia was in +02:00 starting on 1991-03-31 until 1992-01-19, 661 // while still observing DST (transitions 1991-03-31 and 1991-09-29). 662 663 { 664 // +03:00 (daylight savings) 665 let local = new DateTime.Local(1990, Month.September, 1, DayOfWeek.Saturday, 0, 0, 0); 666 let utc = new DateTime.UTC(1990, Month.August, 31, DayOfWeek.Friday, 20, 0, 0); 667 668 assertDate(local, utc, TimeZone(+4), { 669 String: "Sat Sep 01 1990 00:00:00 GMT+0400 (Moscow Summer Time)", 670 DateString: "Sat Sep 01 1990", 671 TimeString: "00:00:00 GMT+0400 (Moscow Summer Time)", 672 UTCString: "Fri, 31 Aug 1990 20:00:00 GMT", 673 ISOString: "1990-08-31T20:00:00.000Z", 674 LocaleString: "Sat, 09/01/1990, 12:00:00 AM GMT+4", 675 LocaleDateString: "Sat, 09/01/1990", 676 LocaleTimeString: "12:00:00 AM GMT+4", 677 }); 678 } 679 680 { 681 // +03:00 (standard time) 682 let local = new DateTime.Local(1991, Month.March, 25, DayOfWeek.Monday, 0, 0, 0); 683 let utc = new DateTime.UTC(1991, Month.March, 24, DayOfWeek.Sunday, 21, 0, 0); 684 685 assertDate(local, utc, TimeZone(+3), { 686 String: "Mon Mar 25 1991 00:00:00 GMT+0300 (Moscow Standard Time)", 687 DateString: "Mon Mar 25 1991", 688 TimeString: "00:00:00 GMT+0300 (Moscow Standard Time)", 689 UTCString: "Sun, 24 Mar 1991 21:00:00 GMT", 690 ISOString: "1991-03-24T21:00:00.000Z", 691 LocaleString: "Mon, 03/25/1991, 12:00:00 AM GMT+3", 692 LocaleDateString: "Mon, 03/25/1991", 693 LocaleTimeString: "12:00:00 AM GMT+3", 694 }); 695 } 696 697 { 698 // +02:00 (daylight savings) 699 let local = new DateTime.Local(1991, Month.March, 31, DayOfWeek.Sunday, 12, 0, 0); 700 let utc = new DateTime.UTC(1991, Month.March, 31, DayOfWeek.Sunday, 9, 0, 0); 701 702 assertDate(local, utc, TimeZone(+3), { 703 String: "Sun Mar 31 1991 12:00:00 GMT+0300 (Moscow Summer Time)", 704 DateString: "Sun Mar 31 1991", 705 TimeString: "12:00:00 GMT+0300 (Moscow Summer Time)", 706 UTCString: "Sun, 31 Mar 1991 09:00:00 GMT", 707 ISOString: "1991-03-31T09:00:00.000Z", 708 LocaleString: "Sun, 03/31/1991, 12:00:00 PM GMT+3", 709 LocaleDateString: "Sun, 03/31/1991", 710 LocaleTimeString: "12:00:00 PM GMT+3", 711 }); 712 } 713 714 { 715 // +02:00 (daylight savings) 716 let local = new DateTime.Local(1991, Month.September, 28, DayOfWeek.Saturday, 0, 0, 0); 717 let utc = new DateTime.UTC(1991, Month.September, 27, DayOfWeek.Friday, 21, 0, 0); 718 719 assertDate(local, utc, TimeZone(+3), { 720 String: "Sat Sep 28 1991 00:00:00 GMT+0300 (Moscow Summer Time)", 721 DateString: "Sat Sep 28 1991", 722 TimeString: "00:00:00 GMT+0300 (Moscow Summer Time)", 723 UTCString: "Fri, 27 Sep 1991 21:00:00 GMT", 724 ISOString: "1991-09-27T21:00:00.000Z", 725 LocaleString: "Sat, 09/28/1991, 12:00:00 AM GMT+3", 726 LocaleDateString: "Sat, 09/28/1991", 727 LocaleTimeString: "12:00:00 AM GMT+3", 728 }); 729 } 730 731 { 732 // +02:00 (standard time) 733 let local = new DateTime.Local(1991, Month.September, 30, DayOfWeek.Monday, 0, 0, 0); 734 let utc = new DateTime.UTC(1991, Month.September, 29, DayOfWeek.Sunday, 22, 0, 0); 735 736 assertDate(local, utc, TimeZone(+2), { 737 String: "Mon Sep 30 1991 00:00:00 GMT+0200 (Moscow Standard Time)", 738 DateString: "Mon Sep 30 1991", 739 TimeString: "00:00:00 GMT+0200 (Moscow Standard Time)", 740 UTCString: "Sun, 29 Sep 1991 22:00:00 GMT", 741 ISOString: "1991-09-29T22:00:00.000Z", 742 LocaleString: "Mon, 09/30/1991, 12:00:00 AM GMT+2", 743 LocaleDateString: "Mon, 09/30/1991", 744 LocaleTimeString: "12:00:00 AM GMT+2", 745 }); 746 } 747 748 // Russia stopped observing DST in Oct. 2010 (last transition on 2010-10-31), 749 // and changed timezone from +03:00 to +04:00 on 2011-03-27. 750 751 { 752 // +03:00 (daylight savings) 753 let local = new DateTime.Local(2010, Month.October, 30, DayOfWeek.Saturday, 0, 0, 0); 754 let utc = new DateTime.UTC(2010, Month.October, 29, DayOfWeek.Friday, 20, 0, 0); 755 756 assertDate(local, utc, TimeZone(+4), { 757 String: "Sat Oct 30 2010 00:00:00 GMT+0400 (Moscow Summer Time)", 758 DateString: "Sat Oct 30 2010", 759 TimeString: "00:00:00 GMT+0400 (Moscow Summer Time)", 760 UTCString: "Fri, 29 Oct 2010 20:00:00 GMT", 761 ISOString: "2010-10-29T20:00:00.000Z", 762 LocaleString: "Sat, 10/30/2010, 12:00:00 AM GMT+4", 763 LocaleDateString: "Sat, 10/30/2010", 764 LocaleTimeString: "12:00:00 AM GMT+4", 765 }); 766 } 767 768 { 769 // +03:00 (standard time) 770 let local = new DateTime.Local(2010, Month.November, 1, DayOfWeek.Monday, 0, 0, 0); 771 let utc = new DateTime.UTC(2010, Month.October, 31, DayOfWeek.Sunday, 21, 0, 0); 772 773 assertDate(local, utc, TimeZone(+3), { 774 String: "Mon Nov 01 2010 00:00:00 GMT+0300 (Moscow Standard Time)", 775 DateString: "Mon Nov 01 2010", 776 TimeString: "00:00:00 GMT+0300 (Moscow Standard Time)", 777 UTCString: "Sun, 31 Oct 2010 21:00:00 GMT", 778 ISOString: "2010-10-31T21:00:00.000Z", 779 LocaleString: "Mon, 11/01/2010, 12:00:00 AM GMT+3", 780 LocaleDateString: "Mon, 11/01/2010", 781 LocaleTimeString: "12:00:00 AM GMT+3", 782 }); 783 } 784 785 { 786 // +04:00 (standard time) 787 let local = new DateTime.Local(2011, Month.October, 30, DayOfWeek.Sunday, 0, 0, 0); 788 let utc = new DateTime.UTC(2011, Month.October, 29, DayOfWeek.Saturday, 20, 0, 0); 789 790 assertDate(local, utc, TimeZone(+4), { 791 String: "Sun Oct 30 2011 00:00:00 GMT+0400 (Moscow Standard Time)", 792 DateString: "Sun Oct 30 2011", 793 TimeString: "00:00:00 GMT+0400 (Moscow Standard Time)", 794 UTCString: "Sat, 29 Oct 2011 20:00:00 GMT", 795 ISOString: "2011-10-29T20:00:00.000Z", 796 LocaleString: "Sun, 10/30/2011, 12:00:00 AM GMT+4", 797 LocaleDateString: "Sun, 10/30/2011", 798 LocaleTimeString: "12:00:00 AM GMT+4", 799 }); 800 } 801 802 { 803 // +04:00 (standard time) 804 let local = new DateTime.Local(2011, Month.November, 1, DayOfWeek.Tuesday, 0, 0, 0); 805 let utc = new DateTime.UTC(2011, Month.October, 31, DayOfWeek.Monday, 20, 0, 0); 806 807 assertDate(local, utc, TimeZone(+4), { 808 String: "Tue Nov 01 2011 00:00:00 GMT+0400 (Moscow Standard Time)", 809 DateString: "Tue Nov 01 2011", 810 TimeString: "00:00:00 GMT+0400 (Moscow Standard Time)", 811 UTCString: "Mon, 31 Oct 2011 20:00:00 GMT", 812 ISOString: "2011-10-31T20:00:00.000Z", 813 LocaleString: "Tue, 11/01/2011, 12:00:00 AM GMT+4", 814 LocaleDateString: "Tue, 11/01/2011", 815 LocaleTimeString: "12:00:00 AM GMT+4", 816 }); 817 } 818 819 // Russia changed timezone from +04:00 to +03:00 on 2014-10-26. 820 821 { 822 // +04:00 (standard time) 823 let local = new DateTime.Local(2014, Month.October, 26, DayOfWeek.Sunday, 0, 0, 0); 824 let utc = new DateTime.UTC(2014, Month.October, 25, DayOfWeek.Saturday, 20, 0, 0); 825 826 assertDate(local, utc, TimeZone(+4), { 827 String: "Sun Oct 26 2014 00:00:00 GMT+0400 (Moscow Standard Time)", 828 DateString: "Sun Oct 26 2014", 829 TimeString: "00:00:00 GMT+0400 (Moscow Standard Time)", 830 UTCString: "Sat, 25 Oct 2014 20:00:00 GMT", 831 ISOString: "2014-10-25T20:00:00.000Z", 832 LocaleString: "Sun, 10/26/2014, 12:00:00 AM GMT+4", 833 LocaleDateString: "Sun, 10/26/2014", 834 LocaleTimeString: "12:00:00 AM GMT+4", 835 }); 836 } 837 838 { 839 // +03:00 (standard time) 840 let local = new DateTime.Local(2014, Month.October, 27, DayOfWeek.Monday, 0, 0, 0); 841 let utc = new DateTime.UTC(2014, Month.October, 26, DayOfWeek.Sunday, 21, 0, 0); 842 843 assertDate(local, utc, TimeZone(+3), { 844 String: "Mon Oct 27 2014 00:00:00 GMT+0300 (Moscow Standard Time)", 845 DateString: "Mon Oct 27 2014", 846 TimeString: "00:00:00 GMT+0300 (Moscow Standard Time)", 847 UTCString: "Sun, 26 Oct 2014 21:00:00 GMT", 848 ISOString: "2014-10-26T21:00:00.000Z", 849 LocaleString: "Mon, 10/27/2014, 12:00:00 AM GMT+3", 850 LocaleDateString: "Mon, 10/27/2014", 851 LocaleTimeString: "12:00:00 AM GMT+3", 852 }); 853 } 854 }); 855 856 857 // File: Date/Pacific_Apia.js 858 // Pacific/Apia switched from -11:00 to +13:00 on 2011 Dec 29 24:00. 859 860 inTimeZone("Pacific/Apia", () => { 861 { 862 // -11:00 (daylight savings) 863 let local = new DateTime.Local(2011, Month.December, 29, DayOfWeek.Thursday, 0, 0, 0); 864 let utc = new DateTime.UTC(2011, Month.December, 29, DayOfWeek.Thursday, 10, 0, 0); 865 866 assertDate(local, utc, TimeZone(-10), { 867 String: "Thu Dec 29 2011 00:00:00 GMT-1000 (Samoa Daylight Time)", 868 DateString: "Thu Dec 29 2011", 869 TimeString: "00:00:00 GMT-1000 (Samoa Daylight Time)", 870 UTCString: "Thu, 29 Dec 2011 10:00:00 GMT", 871 ISOString: "2011-12-29T10:00:00.000Z", 872 LocaleString: "Thu, 12/29/2011, 12:00:00 AM GMT-10", 873 LocaleDateString: "Thu, 12/29/2011", 874 LocaleTimeString: "12:00:00 AM GMT-10", 875 }); 876 } 877 878 { 879 // +13:00 (daylight savings) 880 let local = new DateTime.Local(2011, Month.December, 31, DayOfWeek.Saturday, 0, 0, 0); 881 let utc = new DateTime.UTC(2011, Month.December, 30, DayOfWeek.Friday, 10, 0, 0); 882 883 assertDate(local, utc, TimeZone(+14), { 884 String: "Sat Dec 31 2011 00:00:00 GMT+1400 (Samoa Daylight Time)", 885 DateString: "Sat Dec 31 2011", 886 TimeString: "00:00:00 GMT+1400 (Samoa Daylight Time)", 887 UTCString: "Fri, 30 Dec 2011 10:00:00 GMT", 888 ISOString: "2011-12-30T10:00:00.000Z", 889 LocaleString: "Sat, 12/31/2011, 12:00:00 AM GMT+14", 890 LocaleDateString: "Sat, 12/31/2011", 891 LocaleTimeString: "12:00:00 AM GMT+14", 892 }); 893 } 894 895 { 896 // +13:00 (standard time) 897 let local = new DateTime.Local(2012, Month.April, 2, DayOfWeek.Monday, 0, 0, 0); 898 let utc = new DateTime.UTC(2012, Month.April, 1, DayOfWeek.Sunday, 11, 0, 0); 899 900 assertDate(local, utc, TimeZone(+13), { 901 String: "Mon Apr 02 2012 00:00:00 GMT+1300 (Samoa Standard Time)", 902 DateString: "Mon Apr 02 2012", 903 TimeString: "00:00:00 GMT+1300 (Samoa Standard Time)", 904 UTCString: "Sun, 01 Apr 2012 11:00:00 GMT", 905 ISOString: "2012-04-01T11:00:00.000Z", 906 LocaleString: "Mon, 04/02/2012, 12:00:00 AM GMT+13", 907 LocaleDateString: "Mon, 04/02/2012", 908 LocaleTimeString: "12:00:00 AM GMT+13", 909 }); 910 } 911 }); 912 913 914 // File: Date/Pacific_Chatham.js 915 // Pacific/Chatham time zone offset is 12:45. 916 917 inTimeZone("Pacific/Chatham", () => { 918 { 919 // +12:45 (standard time) 920 let local = new DateTime.Local(2010, Month.August, 1, DayOfWeek.Sunday, 0, 0, 0); 921 let utc = new DateTime.UTC(2010, Month.July, 31, DayOfWeek.Saturday, 11, 15, 0); 922 923 assertDate(local, utc, TimeZone(+12,45), { 924 String: "Sun Aug 01 2010 00:00:00 GMT+1245 (Chatham Standard Time)", 925 DateString: "Sun Aug 01 2010", 926 TimeString: "00:00:00 GMT+1245 (Chatham Standard Time)", 927 UTCString: "Sat, 31 Jul 2010 11:15:00 GMT", 928 ISOString: "2010-07-31T11:15:00.000Z", 929 LocaleString: "Sun, 08/01/2010, 12:00:00 AM GMT+12:45", 930 LocaleDateString: "Sun, 08/01/2010", 931 LocaleTimeString: "12:00:00 AM GMT+12:45", 932 }); 933 } 934 935 { 936 // +12:45 (daylight savings) 937 let local = new DateTime.Local(2010, Month.January, 3, DayOfWeek.Sunday, 0, 0, 0); 938 let utc = new DateTime.UTC(2010, Month.January, 2, DayOfWeek.Saturday, 10, 15, 0); 939 940 assertDate(local, utc, TimeZone(+13,45), { 941 String: "Sun Jan 03 2010 00:00:00 GMT+1345 (Chatham Daylight Time)", 942 DateString: "Sun Jan 03 2010", 943 TimeString: "00:00:00 GMT+1345 (Chatham Daylight Time)", 944 UTCString: "Sat, 02 Jan 2010 10:15:00 GMT", 945 ISOString: "2010-01-02T10:15:00.000Z", 946 LocaleString: "Sun, 01/03/2010, 12:00:00 AM GMT+13:45", 947 LocaleDateString: "Sun, 01/03/2010", 948 LocaleTimeString: "12:00:00 AM GMT+13:45", 949 }); 950 } 951 }); 952 953 954 // File: Date/Pacific_Kiritimati.js 955 // Pacific/Kiritimati time zone offset is +14:00. 956 957 inTimeZone("Pacific/Kiritimati", () => { 958 { 959 // +14:00 (standard time) 960 let local = new DateTime.Local(2010, Month.August, 1, DayOfWeek.Sunday, 0, 0, 0); 961 let utc = new DateTime.UTC(2010, Month.July, 31, DayOfWeek.Saturday, 10, 0, 0); 962 963 assertDate(local, utc, TimeZone(+14), { 964 String: "Sun Aug 01 2010 00:00:00 GMT+1400 (Line Islands Time)", 965 DateString: "Sun Aug 01 2010", 966 TimeString: "00:00:00 GMT+1400 (Line Islands Time)", 967 UTCString: "Sat, 31 Jul 2010 10:00:00 GMT", 968 ISOString: "2010-07-31T10:00:00.000Z", 969 LocaleString: "Sun, 08/01/2010, 12:00:00 AM GMT+14", 970 LocaleDateString: "Sun, 08/01/2010", 971 LocaleTimeString: "12:00:00 AM GMT+14", 972 }); 973 } 974 975 // Pacific/Kiritimati time zone offset was -10:40 until Oct. 1979. 976 977 { 978 // -10:40 (standard time) 979 let local = new DateTime.Local(1975, Month.January, 1, DayOfWeek.Wednesday, 0, 0, 0); 980 let utc = new DateTime.UTC(1975, Month.January, 1, DayOfWeek.Wednesday, 10, 40, 0); 981 982 assertDate(local, utc, TimeZone(-10,40), { 983 String: "Wed Jan 01 1975 00:00:00 GMT-1040 (Line Islands Time)", 984 DateString: "Wed Jan 01 1975", 985 TimeString: "00:00:00 GMT-1040 (Line Islands Time)", 986 UTCString: "Wed, 01 Jan 1975 10:40:00 GMT", 987 ISOString: "1975-01-01T10:40:00.000Z", 988 LocaleString: "Wed, 01/01/1975, 12:00:00 AM GMT-10:40", 989 LocaleDateString: "Wed, 01/01/1975", 990 LocaleTimeString: "12:00:00 AM GMT-10:40", 991 }); 992 } 993 }); 994 995 996 // File: Date/Pacifi_Niue.js 997 // Pacific/Niue time zone offset was -11:20 from 1952 through 1964. 998 999 inTimeZone("Pacific/Niue", () => { 1000 { 1001 // -11:20 (standard time) 1002 let local = new DateTime.Local(1956, Month.January, 1, DayOfWeek.Sunday, 0, 0, 0); 1003 let utc = new DateTime.UTC(1956, Month.January, 1, DayOfWeek.Sunday, 11, 20, 0); 1004 1005 assertDate(local, utc, TimeZone(-11,20), { 1006 String: "Sun Jan 01 1956 00:00:00 GMT-1120 (Niue Time)", 1007 DateString: "Sun Jan 01 1956", 1008 TimeString: "00:00:00 GMT-1120 (Niue Time)", 1009 UTCString: "Sun, 01 Jan 1956 11:20:00 GMT", 1010 ISOString: "1956-01-01T11:20:00.000Z", 1011 LocaleString: "Sun, 01/01/1956, 12:00:00 AM GMT-11:20", 1012 LocaleDateString: "Sun, 01/01/1956", 1013 LocaleTimeString: "12:00:00 AM GMT-11:20", 1014 }); 1015 } 1016 }); 1017 1018 1019 if (typeof reportCompare === "function") 1020 reportCompare(true, true);