nattydate 0.2.0

Lightweight, deterministic natural language date/time preprocessor — no ML, no clock fragility.
Documentation
{
  "mock_now": "2026-03-18",
  "cases": [
    { "input": "2026-03-18T08:00:00Z",           "expected": "2026-03-18 08:00:00 UTC",     "format": "YYYY-MM-DD HH:mm:ss Z" },
    { "input": "7/6/26",                          "expected": "2026-07-06 00:00:00",         "format": "YYYY-MM-DD HH:mm:ss" },
    { "input": "9-1",                             "expected": "2026-09-01 00:00:00",         "format": "YYYY-MM-DD HH:mm:ss" },
    { "input": "tomorrow",                        "expected": "2026-03-19 00:00:00",         "format": "YYYY-MM-DD HH:mm:ss" },
    { "input": "today",                           "expected": "2026-03-18 00:00:00",         "format": "YYYY-MM-DD HH:mm:ss" },
    { "input": "yesterday",                       "expected": "2026-03-17 00:00:00",         "format": "YYYY-MM-DD HH:mm:ss" },
    { "input": "monday week",                     "expected": "2026-03-30 00:00:00",         "format": "YYYY-MM-DD HH:mm:ss" },
    { "input": "next friday",                     "expected": "2026-03-27 00:00:00",         "format": "YYYY-MM-DD HH:mm:ss" },
    { "input": "tomorrow at 9-00",                "expected": "2026-03-19 09:00:00",         "format": "YYYY-MM-DD HH:mm:ss" },
    { "input": "tomorrow at 9:00",                "expected": "2026-03-19 09:00:00",         "format": "YYYY-MM-DD HH:mm:ss" },
    { "input": "tomorrow at 9;00",                "expected": "2026-03-19 09:00:00",         "format": "YYYY-MM-DD HH:mm:ss" },
    { "input": "tomorrow at 9|00",                "expected": "2026-03-19 09:00:00",         "format": "YYYY-MM-DD HH:mm:ss" },
    { "input": "tomorrow at 9:30",                "expected": "2026-03-19 09:30:00",         "format": "YYYY-MM-DD HH:mm:ss" },
    { "input": "monday week at 0700",             "expected": "2026-03-30 07:00:00",         "format": "YYYY-MM-DD HH:mm:ss" },
    { "input": "monday week at 07h00",            "expected": "2026-03-30 07:00:00",         "format": "YYYY-MM-DD HH:mm:ss" },
    { "input": "tomorrow 3 o'clock",              "expected": "2026-03-19 15:00:00",         "format": "YYYY-MM-DD HH:mm:ss" },
    { "input": "tomorrow at 15:00",               "expected": "2026-03-19 15:00:00",         "format": "YYYY-MM-DD HH:mm:ss" },
    { "input": "tomorrow at 3 pm",                "expected": "2026-03-19 15:00:00",         "format": "YYYY-MM-DD HH:mm:ss" },
    { "input": "tomorrow at 3 am",                "expected": "2026-03-19 03:00:00",         "format": "YYYY-MM-DD HH:mm:ss" },
    { "input": "tomorrow at one am",              "expected": "2026-03-19 01:00:00",         "format": "YYYY-MM-DD HH:mm:ss" },
    { "input": "tomorrow at nine thirty",         "expected": "2026-03-19 09:30:00",         "format": "YYYY-MM-DD HH:mm:ss" },
    { "input": "tomorrow at nine thirty-five",    "expected": "2026-03-19 09:35:00",         "format": "YYYY-MM-DD HH:mm:ss" },
    { "input": "tomorrow at half past ten",       "expected": "2026-03-19 10:30:00",         "format": "YYYY-MM-DD HH:mm:ss" },
    { "input": "tomorrow at quarter to nine",     "expected": "2026-03-19 08:45:00",         "format": "YYYY-MM-DD HH:mm:ss" },
    { "input": "tomorrow at quarter past nine",   "expected": "2026-03-19 09:15:00",         "format": "YYYY-MM-DD HH:mm:ss" },
    { "input": "tomorrow morning",                "expected": "2026-03-19 09:00:00",         "format": "YYYY-MM-DD HH:mm:ss" },
    { "input": "tomorrow noon",                   "expected": "2026-03-19 12:00:00",         "format": "YYYY-MM-DD HH:mm:ss" },
    { "input": "tomorrow afternoon",              "expected": "2026-03-19 15:00:00",         "format": "YYYY-MM-DD HH:mm:ss" },
    { "input": "tomorrow evening",                "expected": "2026-03-19 18:00:00",         "format": "YYYY-MM-DD HH:mm:ss" },
    { "input": "tomorrow night",                  "expected": "2026-03-19 21:00:00",         "format": "YYYY-MM-DD HH:mm:ss" },
    { "input": "monday mrning at one am",         "expected": "2026-03-23 01:00:00",         "format": "YYYY-MM-DD HH:mm:ss" },
    { "input": "monday mrning at nine thirty-five","expected": "2026-03-23 09:35:00",        "format": "YYYY-MM-DD HH:mm:ss" },
    { "input": "christmas",                       "expected": "2026-12-25",                  "format": "YYYY-MM-DD" },
    { "input": "spring bank holiday",             "expected": "2026-05-25",                  "format": "YYYY-MM-DD" },
    { "input": "fourth of july",                  "expected": "2026-07-04",                  "format": "YYYY-MM-DD" },
    { "input": "halloween",                       "expected": "2026-10-31",                  "format": "YYYY-MM-DD" },
    { "input": "thanksgiving",                    "expected": "2026-11-26",                  "format": "YYYY-MM-DD" },
    { "input": "memorial day",                    "expected": "2026-05-25",                  "format": "YYYY-MM-DD" },
    { "input": "labor day",                       "expected": "2026-09-07",                  "format": "YYYY-MM-DD" },
    { "input": "mlk day",                         "expected": "2027-01-18",                  "format": "YYYY-MM-DD" },
    { "input": "presidents day",                  "expected": "2027-02-15",                  "format": "YYYY-MM-DD" },
    { "input": "veterans day",                    "expected": "2026-11-11",                  "format": "YYYY-MM-DD" },
    { "input": "juneteenth",                      "expected": "2026-06-19",                  "format": "YYYY-MM-DD" },
    { "input": "valentines day",                  "expected": "2027-02-14",                  "format": "YYYY-MM-DD" },
    { "input": "boxing day",                      "expected": "2026-12-26",                  "format": "YYYY-MM-DD" },
    { "input": "guy fawkes night",                "expected": "2026-11-05",                  "format": "YYYY-MM-DD" },
    { "input": "saint patricks day",              "expected": "2027-03-17",                  "format": "YYYY-MM-DD" },
    { "input": "may day",                         "expected": "2026-05-04",                  "format": "YYYY-MM-DD" },
    { "input": "summer bank holiday",             "expected": "2026-08-31",                  "format": "YYYY-MM-DD" },
    { "input": "christmas day lunch at 1",        "expected": "2026-12-25 13:00:00",         "format": "YYYY-MM-DD HH:mm:ss" },
    { "input": "tomorrow at 3pm EDT",             "expected": "2026-03-19 15:00:00 EDT",     "format": "YYYY-MM-DD HH:mm:ss TZ" },
    { "input": "nxt fri 14:00",                   "expected": "2026-03-27 14:00:00",         "format": "YYYY-MM-DD HH:mm:ss" },

    { "input": "last monday",                     "expected": "2026-03-16",                  "format": "YYYY-MM-DD" },
    { "input": "last tuesday",                    "expected": "2026-03-17",                  "format": "YYYY-MM-DD" },
    { "input": "last wednesday",                  "expected": "2026-03-11",                  "format": "YYYY-MM-DD" },
    { "input": "last thursday",                   "expected": "2026-03-12",                  "format": "YYYY-MM-DD" },
    { "input": "last friday",                     "expected": "2026-03-13",                  "format": "YYYY-MM-DD" },
    { "input": "last saturday",                   "expected": "2026-03-14",                  "format": "YYYY-MM-DD" },
    { "input": "last sunday",                     "expected": "2026-03-15",                  "format": "YYYY-MM-DD" },

    { "input": "monday last",                     "expected": "2026-03-16",                  "format": "YYYY-MM-DD" },
    { "input": "friday last",                     "expected": "2026-03-13",                  "format": "YYYY-MM-DD" },
    { "input": "tuesday next",                    "expected": "2026-03-31",                  "format": "YYYY-MM-DD" },

    { "input": "previous monday",                 "expected": "2026-03-16",                  "format": "YYYY-MM-DD" },
    { "input": "past friday",                     "expected": "2026-03-13",                  "format": "YYYY-MM-DD" },
    { "input": "prior thursday",                  "expected": "2026-03-12",                  "format": "YYYY-MM-DD" },
    { "input": "following friday",                "expected": "2026-03-27",                  "format": "YYYY-MM-DD" },

    { "input": "1 day ago",                       "expected": "2026-03-17",                  "format": "YYYY-MM-DD" },
    { "input": "3 days ago",                      "expected": "2026-03-15",                  "format": "YYYY-MM-DD" },
    { "input": "10 days ago",                     "expected": "2026-03-08",                  "format": "YYYY-MM-DD" },
    { "input": "1 week ago",                      "expected": "2026-03-11",                  "format": "YYYY-MM-DD" },
    { "input": "2 weeks ago",                     "expected": "2026-03-04",                  "format": "YYYY-MM-DD" },
    { "input": "1 month ago",                     "expected": "2026-02-16",                  "format": "YYYY-MM-DD" },
    { "input": "3 days ago at noon",              "expected": "2026-03-15 12:00:00",         "format": "YYYY-MM-DD HH:mm:ss" },
    { "input": "2 weeks ago at 6pm",              "expected": "2026-03-04 18:00:00",         "format": "YYYY-MM-DD HH:mm:ss" },

    { "input": "mnday",                           "expected": "2026-03-23",                  "format": "YYYY-MM-DD" },
    { "input": "tuseday",                         "expected": "2026-03-24",                  "format": "YYYY-MM-DD" },
    { "input": "wensday",                         "expected": "2026-03-25",                  "format": "YYYY-MM-DD" },
    { "input": "thurday",                         "expected": "2026-03-19",                  "format": "YYYY-MM-DD" },
    { "input": "satrday",                         "expected": "2026-03-21",                  "format": "YYYY-MM-DD" },
    { "input": "sundy",                           "expected": "2026-03-22",                  "format": "YYYY-MM-DD" },
    { "input": "ysterday",                        "expected": "2026-03-17",                  "format": "YYYY-MM-DD" },
    { "input": "tomorow",                         "expected": "2026-03-19",                  "format": "YYYY-MM-DD" },
    { "input": "frday",                           "expected": "2026-03-20",                  "format": "YYYY-MM-DD" },
    { "input": "fryday",                          "expected": "2026-03-20",                  "format": "YYYY-MM-DD" },

    { "input": "9am",                             "expected": "09:00:00",                    "format": "HH:mm:ss" },
    { "input": "6pm",                             "expected": "18:00:00",                    "format": "HH:mm:ss" },
    { "input": "12am",                            "expected": "00:00:00",                    "format": "HH:mm:ss" },
    { "input": "12pm",                            "expected": "12:00:00",                    "format": "HH:mm:ss" },
    { "input": "3:30pm",                          "expected": "15:30:00",                    "format": "HH:mm:ss" },
    { "input": "14:30:00",                        "expected": "14:30:00",                    "format": "HH:mm:ss" },

    { "input": "yesterday morning",               "expected": "2026-03-17 09:00:00",         "format": "YYYY-MM-DD HH:mm:ss" },
    { "input": "yesterday evening",               "expected": "2026-03-17 18:00:00",         "format": "YYYY-MM-DD HH:mm:ss" },
    { "input": "3pm tomorrow",                    "expected": "2026-03-19 15:00:00",         "format": "YYYY-MM-DD HH:mm:ss" },
    { "input": "next monday at 9am",              "expected": "2026-03-30 09:00:00",         "format": "YYYY-MM-DD HH:mm:ss" },
    { "input": "last friday at noon",             "expected": "2026-03-13 12:00:00",         "format": "YYYY-MM-DD HH:mm:ss" },
    { "input": "last tuesday at 2pm",             "expected": "2026-03-17 14:00:00",         "format": "YYYY-MM-DD HH:mm:ss" },

    { "input": "18-3-2026",                       "expected": "2026-03-18",                  "format": "YYYY-MM-DD" },
    { "input": "2026/03/18",                      "expected": "2026-03-18",                  "format": "YYYY-MM-DD" },
    { "input": "18.3.26",                         "expected": "2026-03-18",                  "format": "YYYY-MM-DD" },

    { "input": "new years day",                   "expected": "2027-01-01",                  "format": "YYYY-MM-DD" },
    { "input": "bonfire night",                   "expected": "2026-11-05",                  "format": "YYYY-MM-DD" },

    { "input": "next monday at two in the morning", "expected": "2026-03-30 02:00:00",         "format": "YYYY-MM-DD HH:mm:ss" },
    { "input": "next monday morning at 2",         "expected": "2026-03-30 02:00:00",         "format": "YYYY-MM-DD HH:mm:ss" },
    { "input": "tomorrow at too in the morning",   "expected": "2026-03-19 02:00:00",         "format": "YYYY-MM-DD HH:mm:ss" },

    { "input": "xyzzy blob flargh",               "expected": "00:00:00",                    "format": "HH:mm:ss" },
    { "input": "the quick brown fox",             "expected": "00:00:00",                    "format": "HH:mm:ss" },
    { "input": "32/13/2026",                      "expected": "YYYY-MM-DD",                  "format": "YYYY-MM-DD" }
  ]
}