1
0

datetime.nbt 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. # General datetime parsing
  2. let test_date1 = datetime("2024-07-31T13:24:00Z")
  3. let test_date2 = datetime("2024-01-02T13:24:56Z")
  4. let test_date3 = datetime("2024-01-02T13:24:56.789Z")
  5. # RFC 2822
  6. assert_eq(datetime("Wed, 31 Jul 2024 13:24:00 UTC"), test_date1)
  7. assert_eq(datetime("Wed, 31 Jul 2024 13:24 UTC"), test_date1)
  8. assert_eq(datetime("Wed, 31 Jul 2024 13:24 Z"), test_date1)
  9. assert_eq(datetime("2024-07-31 13:24:00 UTC"), test_date1)
  10. assert_eq(datetime("2024-07-31 13:24 UTC"), test_date1)
  11. assert_eq(datetime("2024-07-31 01:24 pm UTC"), test_date1)
  12. assert_eq(datetime("2024/07/31 13:24:00 UTC"), test_date1)
  13. assert_eq(datetime("2024/07/31 13:24 UTC"), test_date1)
  14. assert_eq(datetime("2024/07/31 01:24 pm UTC"), test_date1)
  15. assert_eq(datetime("2024-01-02 13:24:56 UTC"), test_date2)
  16. assert_eq(datetime("2024-01-02 01:24:56 pm UTC"), test_date2)
  17. assert_eq(datetime("2024/01/02 13:24:56 UTC"), test_date2)
  18. assert_eq(datetime("2024/01/02 01:24:56 pm UTC"), test_date2)
  19. assert_eq(datetime("2024-01-02 13:24:56.789 UTC"), test_date3)
  20. assert_eq(datetime("2024/01/02 13:24:56.789 UTC"), test_date3)
  21. # Parsing with offsets / timezones
  22. assert_eq(datetime("2024-01-02 13:24:56.789 +0000"), test_date3)
  23. assert_eq(datetime("2024-01-02 15:24:56.789 +0200"), test_date3)
  24. assert_eq(datetime("2024-01-02 07:24:56.789 -0600"), test_date3)
  25. assert_eq(datetime("2024-07-31 15:24:00 Europe/Berlin"), test_date1) # CEST (UTC+2)
  26. assert_eq(datetime("2024-01-02 14:24:56 Europe/Berlin"), test_date2) # CET (UTC+1)
  27. assert_eq(datetime("2024-07-31 09:24:00 US/Eastern"), test_date1) # UTC-4
  28. assert_eq(datetime("2024-01-02 08:24:56 US/Eastern"), test_date2) # UTC-5
  29. # Formatting
  30. assert_eq(format_datetime("%Y-%m-%dT%H:%M:%S%:z", test_date1), "2024-07-31T13:24:00+00:00")
  31. assert_eq(format_datetime("%Y-%m-%dT%H:%M:%S%:z", test_date2), "2024-01-02T13:24:56+00:00")
  32. assert_eq(format_datetime("%Y-%m-%dT%H:%M:%S.%3f%:z", test_date3), "2024-01-02T13:24:56.789+00:00")
  33. # Time zone conversions
  34. fn as_string(dt: DateTime) -> String = "{dt}"
  35. assert_eq(as_string(test_date3), "2024-01-02 13:24:56 UTC")
  36. assert_eq(as_string(test_date3 -> UTC),
  37. "2024-01-02 13:24:56 UTC")
  38. assert_eq(as_string(test_date3 -> tz("Europe/Berlin")),
  39. "2024-01-02 14:24:56 CET (UTC +01), Europe/Berlin")
  40. assert_eq(as_string(test_date3 -> tz("US/Eastern")),
  41. "2024-01-02 08:24:56 EST (UTC -05), US/Eastern")
  42. assert_eq(as_string(test_date3 -> tz("Asia/Kathmandu")),
  43. "2024-01-02 19:09:56 (UTC +05:45), Asia/Kathmandu")
  44. # Test leap years (2020 was a leap year)
  45. let dt_leap = datetime("2020-02-28 20:00 UTC")
  46. assert_eq(format_datetime("%Y/%m/%d", dt_leap + 12 hours), "2020/02/29")
  47. let dt_no_leap = datetime("2021-02-28 20:00 UTC")
  48. assert_eq(format_datetime("%Y/%m/%d", dt_no_leap + 12 hours), "2021/03/01")
  49. # Regression test for #376
  50. let dt_issue_376 = datetime("Fri, 23 Feb 2024 14:01:54 -0800")
  51. assert_eq(format_datetime("%Y-%m-%dT%H:%M:%S%:z", dt_issue_376), "2024-02-23T14:01:54-08:00")
  52. # Unix time
  53. let epoch = datetime("1970-01-01T00:00:00Z")
  54. assert_eq(epoch -> unixtime, 0)
  55. assert_eq(epoch + 1000 milliseconds + 2 seconds -> unixtime, 3)
  56. let dt_unixtime_1 = datetime("Wed, 20 Jul 2022 21:52:05 +0200")
  57. assert_eq(dt_unixtime_1 -> unixtime, 1658346725)
  58. assert_eq(from_unixtime(1658346725), dt_unixtime_1)
  59. # Calendar arithmetic
  60. let dt_start = datetime("2024-03-30 12:00:00 Europe/Berlin") # one day before DST starts
  61. # If we simply add "1 day == 24 hours", we end up at 13:00 on the next day:
  62. assert_eq(dt_start + 1 day, datetime("2024-03-31 13:00:00 Europe/Berlin"))
  63. # If we use DST-aware calendar arithmetic, we end up at 12:00 on the next day:
  64. assert_eq(calendar_add(dt_start, 1 day), datetime("2024-03-31 12:00:00 Europe/Berlin"))
  65. assert_eq(calendar_add(dt_start, 2 days), datetime("2024-04-01 12:00:00 Europe/Berlin"))
  66. assert_eq(calendar_add(dt_start, 3 months), datetime("2024-06-30 12:00:00 Europe/Berlin"))
  67. assert_eq(calendar_add(dt_start, 12 months), datetime("2025-03-30 12:00:00 Europe/Berlin"))
  68. assert_eq(calendar_add(dt_start, 10 years), datetime("2034-03-30 12:00:00 Europe/Berlin"))
  69. assert_eq(calendar_add(dt_start, 1 second), datetime("2024-03-30 12:00:01 Europe/Berlin"))
  70. assert_eq(calendar_add(dt_start, 1 minute), datetime("2024-03-30 12:01:00 Europe/Berlin"))
  71. assert_eq(calendar_add(dt_start, 1 hour), datetime("2024-03-30 13:00:00 Europe/Berlin"))
  72. # Weekday
  73. assert_eq(date("2024-08-01") -> weekday, "Thursday")
  74. # Julian date
  75. let dt_jd = datetime("2013-01-01 00:30:00 UTC")
  76. assert_eq(dt_jd -> julian_date, 2_456_293.520_833 days, 1e-6 days)
  77. assert_eq(epoch -> julian_date, 2_440_587.5 days, 1e-6 days)