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.