A design sweep of Deeper, my SQL Server estate application, came back with a finding I would
have called cosmetic. More than twenty
surfaces were printing the wire value of a timestamp directly into the page: 2026-09-17T12:31:13.658Z,
some of them with seven decimal places, a few of them wrapping mid-token in a narrow table cell. One
page managed four different formats. All of this sat under a bar that announces “Your timezone:
America/Chicago”, which made the raw UTC strings underneath it look like a joke at the reader’s
expense.
The sweep wrote its acceptance condition as a grep: no rendered text node on any authenticated
surface may match /\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d+Z/. I like findings I can check that
way. It is the difference between “make the times nicer” and a condition that either holds or
doesn’t.
The fix looked like an afternoon of find-and-replace. There was already a formatter hook that the
tables used, so the work was to put every remaining time through it. I wrapped it in a component,
which renders a <time> element with the formatted value visible and the ISO string on both
title and dateTime, so the exact instant stays one hover away. Seventy files in the first
pass, then a second commit the next morning for seven surfaces I had missed.
What I did not expect was having to decide what a timestamp is.
Not every value the backend sends is an instant. A SQL Server start time and some community-tool
log times arrive without a zone on them - no Z, no numeric offset. They are readings taken in
whatever timezone that server happens to think it is in. If I hand one of those to the browser’s
date parser, it assigns the local zone silently and renders a confident, specific, wrong time. No
error, no empty cell, nothing that would show up in a screenshot review. A grep for ISO strings
would have passed.
So the component tests the value before it trusts it. An ISO instant carries Z or a numeric
offset; anything that does not is shown exactly as received, unformatted. That is uglier on the
page than the alternative and it is the only version I can defend, because the alternative is to
invent a zone for a value that never had one.
The other boundary was evidence. Exports, clipboard values, and URL parameters keep their ISO form and do not go through the component at all. Those are read by other machines and by me in six months; they should not carry a rendering preference from whoever happened to click the button.
That is now one component and one regex, which is a smaller surface to be wrong on than seventy files were. It is still an assumption: I am inferring “this is an instant” from the shape of a string rather than from anything the backend told me. A field that declared its own kind would be better. This was the version I could apply everywhere in two days.