FAILURE MAP
← Case archive

FA-69126 / Tide and marine navigation tables / Open access

Tide table zone time to UTC: Crossing midnight keeps the local date · case 01

Late evening and early morning events are filed on the wrong day.

Verified by executionVariant 1 · 7 checks per implementationDownload source bundle ↓JSON ↗

ROOT CAUSE

Minutes are wrapped within the same calendar date instead of using date arithmetic.

VERIFIED REPAIR

Add the offset as a timedelta to the full datetime.

Unsuccessful approach: Advancing the date only on forward overflow leaves westward rollovers on the old day.

Case contract

Input [local "YYYY-MM-DD HH:MM", zd, dst]: zone description zd in hours (positive west, may be fractional); UTC = zone time + zd, and when the table is on daylight time the clock is one hour ahead so UTC = local + zd - 1. Return UTC as "YYYY-MM-DD HH:MM" (24-hour).

Why this case matters

Tide tables and passage plans turn published predictions into go/no-go decisions about depth, clearance and timing.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
import math
import datetime
N = 1
observations = []
def solve(x):
    s,zd,dst=x
    dt=datetime.datetime.strptime(s,'%Y-%m-%d %H:%M')
    off=zd-(1 if dst else 0)
    m=(dt.hour*60+dt.minute+round(off*60))%1440
    u=dt.replace(hour=m//60,minute=m%60)
    return u.strftime('%Y-%m-%d %H:%M')
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('tide table zone time to utc ["2026-03-14 21:40", 5, false]', ['2026-03-14 21:40', 5, False], '2026-03-15 02:40'), ('tide table zone time to utc ["2026-07-01 00:20", -2, true]', ['2026-07-01 00:20', -2, True], '2026-06-30 21:20'), ('tide table zone time to utc ["2026-03-14 06:12", 5, false]', ['2026-03-14 06:12', 5, False], '2026-03-14 11:12'), ('tide table zone time to utc ["2026-07-01 23:30", 4, true]', ['2026-07-01 23:30', 4, True], '2026-07-02 02:30'), ('tide table zone time to utc ["2026-12-31 22:15", 3, false]', ['2026-12-31 22:15', 3, False], '2027-01-01 01:15'), ('tide table zone time to utc ["2026-01-01 01:05", -9.5, false]', ['2026-01-01 01:05', -9.5, False], '2025-12-31 15:35'), ('tide table zone time to utc ["2026-06-15 12:00", -5.5, false]', ['2026-06-15 12:00', -5.5, False], '2026-06-15 06:30')], [('tide table zone time to utc ["2026-07-01 23:30", 4, true]', ['2026-07-01 23:30', 4, True], '2026-07-02 02:30'), ('tide table zone time to utc ["2026-01-01 01:05", -9.5, false]', ['2026-01-01 01:05', -9.5, False], '2025-12-31 15:35'), ('tide table zone time to utc ["2026-07-01 00:20", -2, true]', ['2026-07-01 00:20', -2, True], '2026-06-30 21:20'), ('tide table zone time to utc ["2026-12-31 22:15", 3, false]', ['2026-12-31 22:15', 3, False], '2027-01-01 01:15'), ('tide table zone time to utc ["2026-06-15 12:00", -5.5, false]', ['2026-06-15 12:00', -5.5, False], '2026-06-15 06:30'), ('tide table zone time to utc ["2026-06-15 12:00", 0, true]', ['2026-06-15 12:00', 0, True], '2026-06-15 11:00'), ('tide table zone time to utc ["2028-02-28 23:50", 1, false]', ['2028-02-28 23:50', 1, False], '2028-02-29 00:50')], [('tide table zone time to utc ["2026-07-01 00:20", -2, true]', ['2026-07-01 00:20', -2, True], '2026-06-30 21:20'), ('tide table zone time to utc ["2026-06-15 12:00", -5.5, false]', ['2026-06-15 12:00', -5.5, False], '2026-06-15 06:30'), ('tide table zone time to utc ["2026-06-15 12:00", 0, true]', ['2026-06-15 12:00', 0, True], '2026-06-15 11:00'), ('tide table zone time to utc ["2028-02-28 23:50", 1, false]', ['2028-02-28 23:50', 1, False], '2028-02-29 00:50'), ('tide table zone time to utc ["2026-09-10 13:45", -10, false]', ['2026-09-10 13:45', -10, False], '2026-09-10 03:45'), ('tide table zone time to utc ["2026-09-10 10:45", 3.5, true]', ['2026-09-10 10:45', 3.5, True], '2026-09-10 13:15'), ('tide table zone time to utc ["2026-05-05 05:05", 0, false]', ['2026-05-05 05:05', 0, False], '2026-05-05 05:05')], [('tide table zone time to utc ["2026-12-31 22:15", 3, false]', ['2026-12-31 22:15', 3, False], '2027-01-01 01:15'), ('tide table zone time to utc ["2026-01-01 01:05", -9.5, false]', ['2026-01-01 01:05', -9.5, False], '2025-12-31 15:35'), ('tide table zone time to utc ["2026-09-10 13:45", -10, false]', ['2026-09-10 13:45', -10, False], '2026-09-10 03:45'), ('tide table zone time to utc ["2026-09-10 10:45", 3.5, true]', ['2026-09-10 10:45', 3.5, True], '2026-09-10 13:15'), ('tide table zone time to utc ["2026-05-05 05:05", 0, false]', ['2026-05-05 05:05', 0, False], '2026-05-05 05:05'), ('tide table zone time to utc ["2026-03-14 06:12", 5, false]', ['2026-03-14 06:12', 5, False], '2026-03-14 11:12'), ('tide table zone time to utc ["2026-03-14 21:40", 5, false]', ['2026-03-14 21:40', 5, False], '2026-03-15 02:40')], [('tide table zone time to utc ["2026-01-01 01:05", -9.5, false]', ['2026-01-01 01:05', -9.5, False], '2025-12-31 15:35'), ('tide table zone time to utc ["2026-07-01 00:20", -2, true]', ['2026-07-01 00:20', -2, True], '2026-06-30 21:20'), ('tide table zone time to utc ["2026-03-14 06:12", 5, false]', ['2026-03-14 06:12', 5, False], '2026-03-14 11:12'), ('tide table zone time to utc ["2026-03-14 21:40", 5, false]', ['2026-03-14 21:40', 5, False], '2026-03-15 02:40'), ('tide table zone time to utc ["2026-07-01 23:30", 4, true]', ['2026-07-01 23:30', 4, True], '2026-07-02 02:30'), ('tide table zone time to utc ["2026-12-31 22:15", 3, false]', ['2026-12-31 22:15', 3, False], '2027-01-01 01:15'), ('tide table zone time to utc ["2026-06-15 12:00", -5.5, false]', ['2026-06-15 12:00', -5.5, False], '2026-06-15 06:30')]]
for label, args, expected in fixtures[N-1]:
    check(label, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
tide table zone time to utc ["2026-03-14 21:40", 5, false]2026-03-14 02:402026-03-15 02:40Failed
tide table zone time to utc ["2026-07-01 00:20", -2, true]2026-07-01 21:202026-06-30 21:20Failed
tide table zone time to utc ["2026-03-14 06:12", 5, false]2026-03-14 11:122026-03-14 11:12Passed
tide table zone time to utc ["2026-07-01 23:30", 4, true]2026-07-01 02:302026-07-02 02:30Failed
tide table zone time to utc ["2026-12-31 22:15", 3, false]2026-12-31 01:152027-01-01 01:15Failed
tide table zone time to utc ["2026-01-01 01:05", -9.5, false]2026-01-01 15:352025-12-31 15:35Failed
tide table zone time to utc ["2026-06-15 12:00", -5.5, false]2026-06-15 06:302026-06-15 06:30Passed

SHA-256 / 31fef3b5a9920c0967f5225420b0dcd8302f2f5f51883e608a6a8a953cb7236a

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
import math
import datetime
N = 1
observations = []
def solve(x):
    s,zd,dst=x
    dt=datetime.datetime.strptime(s,'%Y-%m-%d %H:%M')
    off=zd-(1 if dst else 0)
    t=dt.hour*60+dt.minute+round(off*60)
    u=dt.replace(hour=t%1440//60,minute=t%60)+datetime.timedelta(days=1 if t>=1440 else 0)
    return u.strftime('%Y-%m-%d %H:%M')
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('tide table zone time to utc ["2026-03-14 21:40", 5, false]', ['2026-03-14 21:40', 5, False], '2026-03-15 02:40'), ('tide table zone time to utc ["2026-07-01 00:20", -2, true]', ['2026-07-01 00:20', -2, True], '2026-06-30 21:20'), ('tide table zone time to utc ["2026-03-14 06:12", 5, false]', ['2026-03-14 06:12', 5, False], '2026-03-14 11:12'), ('tide table zone time to utc ["2026-07-01 23:30", 4, true]', ['2026-07-01 23:30', 4, True], '2026-07-02 02:30'), ('tide table zone time to utc ["2026-12-31 22:15", 3, false]', ['2026-12-31 22:15', 3, False], '2027-01-01 01:15'), ('tide table zone time to utc ["2026-01-01 01:05", -9.5, false]', ['2026-01-01 01:05', -9.5, False], '2025-12-31 15:35'), ('tide table zone time to utc ["2026-06-15 12:00", -5.5, false]', ['2026-06-15 12:00', -5.5, False], '2026-06-15 06:30')], [('tide table zone time to utc ["2026-07-01 23:30", 4, true]', ['2026-07-01 23:30', 4, True], '2026-07-02 02:30'), ('tide table zone time to utc ["2026-01-01 01:05", -9.5, false]', ['2026-01-01 01:05', -9.5, False], '2025-12-31 15:35'), ('tide table zone time to utc ["2026-07-01 00:20", -2, true]', ['2026-07-01 00:20', -2, True], '2026-06-30 21:20'), ('tide table zone time to utc ["2026-12-31 22:15", 3, false]', ['2026-12-31 22:15', 3, False], '2027-01-01 01:15'), ('tide table zone time to utc ["2026-06-15 12:00", -5.5, false]', ['2026-06-15 12:00', -5.5, False], '2026-06-15 06:30'), ('tide table zone time to utc ["2026-06-15 12:00", 0, true]', ['2026-06-15 12:00', 0, True], '2026-06-15 11:00'), ('tide table zone time to utc ["2028-02-28 23:50", 1, false]', ['2028-02-28 23:50', 1, False], '2028-02-29 00:50')], [('tide table zone time to utc ["2026-07-01 00:20", -2, true]', ['2026-07-01 00:20', -2, True], '2026-06-30 21:20'), ('tide table zone time to utc ["2026-06-15 12:00", -5.5, false]', ['2026-06-15 12:00', -5.5, False], '2026-06-15 06:30'), ('tide table zone time to utc ["2026-06-15 12:00", 0, true]', ['2026-06-15 12:00', 0, True], '2026-06-15 11:00'), ('tide table zone time to utc ["2028-02-28 23:50", 1, false]', ['2028-02-28 23:50', 1, False], '2028-02-29 00:50'), ('tide table zone time to utc ["2026-09-10 13:45", -10, false]', ['2026-09-10 13:45', -10, False], '2026-09-10 03:45'), ('tide table zone time to utc ["2026-09-10 10:45", 3.5, true]', ['2026-09-10 10:45', 3.5, True], '2026-09-10 13:15'), ('tide table zone time to utc ["2026-05-05 05:05", 0, false]', ['2026-05-05 05:05', 0, False], '2026-05-05 05:05')], [('tide table zone time to utc ["2026-12-31 22:15", 3, false]', ['2026-12-31 22:15', 3, False], '2027-01-01 01:15'), ('tide table zone time to utc ["2026-01-01 01:05", -9.5, false]', ['2026-01-01 01:05', -9.5, False], '2025-12-31 15:35'), ('tide table zone time to utc ["2026-09-10 13:45", -10, false]', ['2026-09-10 13:45', -10, False], '2026-09-10 03:45'), ('tide table zone time to utc ["2026-09-10 10:45", 3.5, true]', ['2026-09-10 10:45', 3.5, True], '2026-09-10 13:15'), ('tide table zone time to utc ["2026-05-05 05:05", 0, false]', ['2026-05-05 05:05', 0, False], '2026-05-05 05:05'), ('tide table zone time to utc ["2026-03-14 06:12", 5, false]', ['2026-03-14 06:12', 5, False], '2026-03-14 11:12'), ('tide table zone time to utc ["2026-03-14 21:40", 5, false]', ['2026-03-14 21:40', 5, False], '2026-03-15 02:40')], [('tide table zone time to utc ["2026-01-01 01:05", -9.5, false]', ['2026-01-01 01:05', -9.5, False], '2025-12-31 15:35'), ('tide table zone time to utc ["2026-07-01 00:20", -2, true]', ['2026-07-01 00:20', -2, True], '2026-06-30 21:20'), ('tide table zone time to utc ["2026-03-14 06:12", 5, false]', ['2026-03-14 06:12', 5, False], '2026-03-14 11:12'), ('tide table zone time to utc ["2026-03-14 21:40", 5, false]', ['2026-03-14 21:40', 5, False], '2026-03-15 02:40'), ('tide table zone time to utc ["2026-07-01 23:30", 4, true]', ['2026-07-01 23:30', 4, True], '2026-07-02 02:30'), ('tide table zone time to utc ["2026-12-31 22:15", 3, false]', ['2026-12-31 22:15', 3, False], '2027-01-01 01:15'), ('tide table zone time to utc ["2026-06-15 12:00", -5.5, false]', ['2026-06-15 12:00', -5.5, False], '2026-06-15 06:30')]]
for label, args, expected in fixtures[N-1]:
    check(label, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
tide table zone time to utc ["2026-03-14 21:40", 5, false]2026-03-15 02:402026-03-15 02:40Passed
tide table zone time to utc ["2026-07-01 00:20", -2, true]2026-07-01 21:202026-06-30 21:20Failed
tide table zone time to utc ["2026-03-14 06:12", 5, false]2026-03-14 11:122026-03-14 11:12Passed
tide table zone time to utc ["2026-07-01 23:30", 4, true]2026-07-02 02:302026-07-02 02:30Passed
tide table zone time to utc ["2026-12-31 22:15", 3, false]2027-01-01 01:152027-01-01 01:15Passed
tide table zone time to utc ["2026-01-01 01:05", -9.5, false]2026-01-01 15:352025-12-31 15:35Failed
tide table zone time to utc ["2026-06-15 12:00", -5.5, false]2026-06-15 06:302026-06-15 06:30Passed

SHA-256 / a41c66a91ad50fc3e2a8838177a2539d728c2e77e1500ee35d69d848b06db515

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json
import math
import datetime
N = 1
observations = []
def solve(x):
    s,zd,dst=x
    dt=datetime.datetime.strptime(s,'%Y-%m-%d %H:%M')
    off=zd-(1 if dst else 0)
    u=dt+datetime.timedelta(minutes=round(off*60))
    return u.strftime('%Y-%m-%d %H:%M')
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('tide table zone time to utc ["2026-03-14 21:40", 5, false]', ['2026-03-14 21:40', 5, False], '2026-03-15 02:40'), ('tide table zone time to utc ["2026-07-01 00:20", -2, true]', ['2026-07-01 00:20', -2, True], '2026-06-30 21:20'), ('tide table zone time to utc ["2026-03-14 06:12", 5, false]', ['2026-03-14 06:12', 5, False], '2026-03-14 11:12'), ('tide table zone time to utc ["2026-07-01 23:30", 4, true]', ['2026-07-01 23:30', 4, True], '2026-07-02 02:30'), ('tide table zone time to utc ["2026-12-31 22:15", 3, false]', ['2026-12-31 22:15', 3, False], '2027-01-01 01:15'), ('tide table zone time to utc ["2026-01-01 01:05", -9.5, false]', ['2026-01-01 01:05', -9.5, False], '2025-12-31 15:35'), ('tide table zone time to utc ["2026-06-15 12:00", -5.5, false]', ['2026-06-15 12:00', -5.5, False], '2026-06-15 06:30')], [('tide table zone time to utc ["2026-07-01 23:30", 4, true]', ['2026-07-01 23:30', 4, True], '2026-07-02 02:30'), ('tide table zone time to utc ["2026-01-01 01:05", -9.5, false]', ['2026-01-01 01:05', -9.5, False], '2025-12-31 15:35'), ('tide table zone time to utc ["2026-07-01 00:20", -2, true]', ['2026-07-01 00:20', -2, True], '2026-06-30 21:20'), ('tide table zone time to utc ["2026-12-31 22:15", 3, false]', ['2026-12-31 22:15', 3, False], '2027-01-01 01:15'), ('tide table zone time to utc ["2026-06-15 12:00", -5.5, false]', ['2026-06-15 12:00', -5.5, False], '2026-06-15 06:30'), ('tide table zone time to utc ["2026-06-15 12:00", 0, true]', ['2026-06-15 12:00', 0, True], '2026-06-15 11:00'), ('tide table zone time to utc ["2028-02-28 23:50", 1, false]', ['2028-02-28 23:50', 1, False], '2028-02-29 00:50')], [('tide table zone time to utc ["2026-07-01 00:20", -2, true]', ['2026-07-01 00:20', -2, True], '2026-06-30 21:20'), ('tide table zone time to utc ["2026-06-15 12:00", -5.5, false]', ['2026-06-15 12:00', -5.5, False], '2026-06-15 06:30'), ('tide table zone time to utc ["2026-06-15 12:00", 0, true]', ['2026-06-15 12:00', 0, True], '2026-06-15 11:00'), ('tide table zone time to utc ["2028-02-28 23:50", 1, false]', ['2028-02-28 23:50', 1, False], '2028-02-29 00:50'), ('tide table zone time to utc ["2026-09-10 13:45", -10, false]', ['2026-09-10 13:45', -10, False], '2026-09-10 03:45'), ('tide table zone time to utc ["2026-09-10 10:45", 3.5, true]', ['2026-09-10 10:45', 3.5, True], '2026-09-10 13:15'), ('tide table zone time to utc ["2026-05-05 05:05", 0, false]', ['2026-05-05 05:05', 0, False], '2026-05-05 05:05')], [('tide table zone time to utc ["2026-12-31 22:15", 3, false]', ['2026-12-31 22:15', 3, False], '2027-01-01 01:15'), ('tide table zone time to utc ["2026-01-01 01:05", -9.5, false]', ['2026-01-01 01:05', -9.5, False], '2025-12-31 15:35'), ('tide table zone time to utc ["2026-09-10 13:45", -10, false]', ['2026-09-10 13:45', -10, False], '2026-09-10 03:45'), ('tide table zone time to utc ["2026-09-10 10:45", 3.5, true]', ['2026-09-10 10:45', 3.5, True], '2026-09-10 13:15'), ('tide table zone time to utc ["2026-05-05 05:05", 0, false]', ['2026-05-05 05:05', 0, False], '2026-05-05 05:05'), ('tide table zone time to utc ["2026-03-14 06:12", 5, false]', ['2026-03-14 06:12', 5, False], '2026-03-14 11:12'), ('tide table zone time to utc ["2026-03-14 21:40", 5, false]', ['2026-03-14 21:40', 5, False], '2026-03-15 02:40')], [('tide table zone time to utc ["2026-01-01 01:05", -9.5, false]', ['2026-01-01 01:05', -9.5, False], '2025-12-31 15:35'), ('tide table zone time to utc ["2026-07-01 00:20", -2, true]', ['2026-07-01 00:20', -2, True], '2026-06-30 21:20'), ('tide table zone time to utc ["2026-03-14 06:12", 5, false]', ['2026-03-14 06:12', 5, False], '2026-03-14 11:12'), ('tide table zone time to utc ["2026-03-14 21:40", 5, false]', ['2026-03-14 21:40', 5, False], '2026-03-15 02:40'), ('tide table zone time to utc ["2026-07-01 23:30", 4, true]', ['2026-07-01 23:30', 4, True], '2026-07-02 02:30'), ('tide table zone time to utc ["2026-12-31 22:15", 3, false]', ['2026-12-31 22:15', 3, False], '2027-01-01 01:15'), ('tide table zone time to utc ["2026-06-15 12:00", -5.5, false]', ['2026-06-15 12:00', -5.5, False], '2026-06-15 06:30')]]
for label, args, expected in fixtures[N-1]:
    check(label, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
tide table zone time to utc ["2026-03-14 21:40", 5, false]2026-03-15 02:402026-03-15 02:40Passed
tide table zone time to utc ["2026-07-01 00:20", -2, true]2026-06-30 21:202026-06-30 21:20Passed
tide table zone time to utc ["2026-03-14 06:12", 5, false]2026-03-14 11:122026-03-14 11:12Passed
tide table zone time to utc ["2026-07-01 23:30", 4, true]2026-07-02 02:302026-07-02 02:30Passed
tide table zone time to utc ["2026-12-31 22:15", 3, false]2027-01-01 01:152027-01-01 01:15Passed
tide table zone time to utc ["2026-01-01 01:05", -9.5, false]2025-12-31 15:352025-12-31 15:35Passed
tide table zone time to utc ["2026-06-15 12:00", -5.5, false]2026-06-15 06:302026-06-15 06:30Passed

SHA-256 / 640037934acaff15365cb1feb73f6400063070d8c7deec4e76135c3832065c52

Verification & scope

A deterministic toy model with stipulated rules and constants; not certified hydrographic software or a substitute for official tide tables. This reproducer isolates one failure mechanism. Results cover the supplied fixtures. Variants within a family share a test contract and should remain grouped when constructing evaluation splits. Related mechanisms with a shared evaluation_group must also remain together; these controlled models are not independent production incidents.

Observations recorded using Python 3.12.14 at 2026-09-29T14:48:08.623099+00:00.

Case digest / 27784b83c3b9b17501073b2b4299d20da9354cb77fff3b98b793c25e7d649cf4