HomeJournalThis post

Time zones are product state

Temporal state contracts separate instants, wall-clock values, dates, durations, recurrence, named zones, and daylight-saving ambiguity.

JP
JP Casabianca
Designer/Engineer · Bogotá

A timestamp is not a complete answer to every product question about time.

A webinar begins at an exact instant. A store opens at nine in the local wall clock. A birthday is a date without a time zone. A monthly invoice follows a calendar rule. Flattening all four into UTC may preserve a number while losing the user's intent.

The TC39 Temporal proposal separates exact time, zoned date-time, plain date-time, dates, times, and durations, and makes daylight-saving ambiguity explicit. That type system is also a useful product-design vocabulary.

Before choosing a database column or date picker, I would write a temporal state contract: what the value represents, who chose the zone, whether the event moves when rules change, and how ambiguous or nonexistent local times are resolved.

Time-zone bugs are often meaning bugs wearing formatting clothes.

01 · ExactA moment on the timeline

Logs, completed payments, and live-event starts need an instant that compares globally.

02 · ZonedA moment in a region

Appointments and departures need the instant plus the named zone whose rules explain local display.

03 · PlainA human calendar value

Birthdays, business dates, and opening hours may intentionally exist without an instant.

Figure 1: Product intent chooses the temporal type.

Name the user's temporal intent

The first question is whether the user means an instant, a local clock reading, a date, an interval, or a calendar recurrence.

I would pressure-test that decision with four questions:

  • What promise is the user making?
  • Does it happen globally at once?
  • Should local time remain fixed?
  • What would moving one hour break?

The failure mode here is starting with the database's preferred timestamp type. In scheduling, billing, reporting, reminders, travel, publishing, and collaboration products where a date, wall-clock time, exact instant, duration, calendar, and regional time-zone rule are not interchangeable, that can hide the exact boundary a reviewer or teammate needs to understand. My working artifact would be a temporal intent statement. I want it close enough to the implementation that it can change the work, not created afterward to decorate the story.

The result I would look for is a model that preserves the user's meaning. That is a narrower claim than saying the whole system improved, but it is also one I can verify and defend.

In practice, I would put a temporal intent statement beside the question “What promise is the user making?” before the first implementation review. The next pass would use “Does it happen globally at once?” to test the boundary, then “Should local time remain fixed?” to expose the state most likely to be missed. I would keep “What would moving one hour break?” for the release check because it asks whether the decision still holds outside the ideal path. The work is ready to move when the artifact can explain the choice and the observed result supports a model that preserves the user's meaning.

Assign zone ownership

A time zone may belong to an event, physical location, organization, account, viewer, or device, and those are different sources of truth.

The practical review starts here:

  • Who chooses the zone?
  • Can it change later?
  • Does travel affect it?
  • Which zone wins in a conflict?

Those questions keep defaulting every value to the viewer's current device zone from becoming the default. I would capture the decision in a zone-ownership table, then use it while the work is still cheap to change. For time-aware product behavior, the artifact should make ownership, constraint, and next action visible without requiring a private explanation.

Success would look like predictable conversion across users and locations. If I cannot point to that evidence, I have a direction, not a finished decision.

The implementation move is to make a zone-ownership table part of the working surface. I would use it to answer “Who chooses the zone?” while scope is still flexible, and “Can it change later?” before code or content becomes expensive to unwind. During QA, “Does travel affect it?” and “Which zone wins in a conflict?” become concrete checks rather than discussion prompts. That sequence turns time-aware product behavior into something the team can operate and gives me a specific outcome to report: predictable conversion across users and locations.

  1. CaptureRecord user intent

    Ask whether the zone follows the person, location, organization, or event.

  2. ResolveHandle ambiguity

    Choose earlier, later, reject, or request clarification for repeated and skipped clock times.

  3. RenderShow context

    Display the zone, offset when useful, and whether a viewer conversion has occurred.

Figure 2: One local time can pass through different states.

Keep named zones when rules matter

A numeric offset describes one instant but does not preserve the regional rules needed for future scheduling.

Before implementation, I would answer:

  • Is the event in the future?
  • Can daylight rules change?
  • Is recurrence involved?
  • Must history explain local display?

The artifact is a storage decision for instant, zone, and intent. Its job is to expose the tradeoff early enough that design, engineering, support, or product can disagree with something concrete. The common trap is persisting only minus-five as if it were a time zone; it moves uncertainty downstream and makes the final interface carry a problem the system never resolved.

For me, the useful receipt is future occurrences that follow the intended region. That connects a temporal state contract that names what each time value means before it enters storage, APIs, UI, jobs, or analytics to an observable result instead of a process claim.

I would test this with one typical case and one boundary case. The typical case should make “Is the event in the future?” easy to answer. The boundary should force a decision about “Can daylight rules change?” and “Is recurrence involved?.” I would record both in a storage decision for instant, zone, and intent, including the part that stayed unresolved after the first pass. The final check, “Must history explain local display?,” is where the artifact earns its place: it either supports future occurrences that follow the intended region, or it shows exactly why another iteration is needed.

Design ambiguity states

Daylight-saving transitions create local times that occur twice or not at all, so the product needs a resolution policy.

I would use these prompts during the working review:

  • Can this time be skipped?
  • Can it repeat?
  • Should the UI ask?
  • Which default is defensible?

If the team slips into letting a runtime silently choose without product review, the product can still look complete while its operating rule stays ambiguous. I would make an ambiguity decision table the shared reference and keep it small enough to update as evidence changes.

The standard is consistent behavior at clock transitions. That tells me whether the decision helped the product, not merely whether the document was completed.

The working sequence is small: draft an ambiguity decision table, review it against “Can this time be skipped?,” implement the narrowest useful path, and then return with evidence for “Can it repeat?.” I would use “Should the UI ask?” to inspect product consequence and “Which default is defensible?” to decide whether the result is stable enough to ship. This keeps letting a runtime silently choose without product review visible as a known risk and makes consistent behavior at clock transitions the release receipt rather than a hopeful conclusion.

SignalDecisionWorking note
Every 24 hoursDuration ruleThe exact interval stays fixed while local wall-clock time may move across DST.
Every day at 09:00Wall-clock ruleThe local time stays fixed while elapsed hours between occurrences may change.
Last business dayCalendar ruleLocale, holidays, and business policy participate in the schedule.
Figure 3: Recurrence reveals whether the model is correct.

Model recurrence separately

A recurring rule is not a list of timestamps and not always a fixed duration between events.

I would pressure-test that decision with four questions:

  • What stays invariant?
  • Which calendar applies?
  • How are exceptions stored?
  • When is the next occurrence computed?

The failure mode here is adding 86,400 seconds to mean tomorrow at the same time. In scheduling, billing, reporting, reminders, travel, publishing, and collaboration products where a date, wall-clock time, exact instant, duration, calendar, and regional time-zone rule are not interchangeable, that can hide the exact boundary a reviewer or teammate needs to understand. My working artifact would be a recurrence rule plus exception model. I want it close enough to the implementation that it can change the work, not created afterward to decorate the story.

The result I would look for is schedules that preserve wall-clock and calendar intent. That is a narrower claim than saying the whole system improved, but it is also one I can verify and defend.

In practice, I would put a recurrence rule plus exception model beside the question “What stays invariant?” before the first implementation review. The next pass would use “Which calendar applies?” to test the boundary, then “How are exceptions stored?” to expose the state most likely to be missed. I would keep “When is the next occurrence computed?” for the release check because it asks whether the decision still holds outside the ideal path. The work is ready to move when the artifact can explain the choice and the observed result supports schedules that preserve wall-clock and calendar intent.

Show time context in the interface

Users need enough temporal context to detect conversion, compare participants, and understand consequential deadlines.

The practical review starts here:

  • Is the zone visible?
  • Is viewer conversion labeled?
  • Are date boundaries clear?
  • Can the original value be recovered?

Those questions keep formatting a friendly time while hiding which zone it uses from becoming the default. I would capture the decision in a display-state inventory for local and source time, then use it while the work is still cheap to change. For time-aware product behavior, the artifact should make ownership, constraint, and next action visible without requiring a private explanation.

Success would look like fewer decisions made against the wrong clock. If I cannot point to that evidence, I have a direction, not a finished decision.

The implementation move is to make a display-state inventory for local and source time part of the working surface. I would use it to answer “Is the zone visible?” while scope is still flexible, and “Is viewer conversion labeled?” before code or content becomes expensive to unwind. During QA, “Are date boundaries clear?” and “Can the original value be recovered?” become concrete checks rather than discussion prompts. That sequence turns time-aware product behavior into something the team can operate and gives me a specific outcome to report: fewer decisions made against the wrong clock.

Specify API serialization

Clients and services need a contract for offsets, named zones, date-only values, precision, recurrence, and absent information.

Before implementation, I would answer:

  • Which string format is accepted?
  • Is a zone required?
  • Can offset and zone disagree?
  • How is date-only represented?

The artifact is a temporal API schema with invalid examples. Its job is to expose the tradeoff early enough that design, engineering, support, or product can disagree with something concrete. The common trap is using one string field for every time concept; it moves uncertainty downstream and makes the final interface carry a problem the system never resolved.

For me, the useful receipt is round trips that do not lose semantic information. That connects a temporal state contract that names what each time value means before it enters storage, APIs, UI, jobs, or analytics to an observable result instead of a process claim.

I would test this with one typical case and one boundary case. The typical case should make “Which string format is accepted?” easy to answer. The boundary should force a decision about “Is a zone required?” and “Can offset and zone disagree?.” I would record both in a temporal API schema with invalid examples, including the part that stayed unresolved after the first pass. The final check, “How is date-only represented?,” is where the artifact earns its place: it either supports round trips that do not lose semantic information, or it shows exactly why another iteration is needed.

Test around transitions

Temporal QA should cluster around skipped hours, repeated hours, midnight, month end, leap years, locale calendars, and rule changes.

I would use these prompts during the working review:

  • Which zones exercise each case?
  • Can the clock be controlled?
  • Are historical rules pinned?
  • Does UI match stored intent?

If the team slips into testing noon in the developer's home zone, the product can still look complete while its operating rule stays ambiguous. I would make a transition-focused test matrix the shared reference and keep it small enough to update as evidence changes.

The standard is evidence across the boundaries where time models fail. That tells me whether the decision helped the product, not merely whether the document was completed.

The working sequence is small: draft a transition-focused test matrix, review it against “Which zones exercise each case?,” implement the narrowest useful path, and then return with evidence for “Can the clock be controlled?.” I would use “Are historical rules pinned?” to inspect product consequence and “Does UI match stored intent?” to decide whether the result is stable enough to ship. This keeps testing noon in the developer's home zone visible as a known risk and makes evidence across the boundaries where time models fail the release receipt rather than a hopeful conclusion.

Plan temporal migrations

Changing a time model requires separating values that can be converted mechanically from values whose original intent was never stored.

I would pressure-test that decision with four questions:

  • Which values lost their zone?
  • Can intent be inferred safely?
  • Which users must confirm?
  • How is the old path retired?

The failure mode here is backfilling an assumed zone as if it were fact. In scheduling, billing, reporting, reminders, travel, publishing, and collaboration products where a date, wall-clock time, exact instant, duration, calendar, and regional time-zone rule are not interchangeable, that can hide the exact boundary a reviewer or teammate needs to understand. My working artifact would be a temporal data migration ledger. I want it close enough to the implementation that it can change the work, not created afterward to decorate the story.

The result I would look for is honest repair of known and unknown temporal state. That is a narrower claim than saying the whole system improved, but it is also one I can verify and defend.

In practice, I would put a temporal data migration ledger beside the question “Which values lost their zone?” before the first implementation review. The next pass would use “Can intent be inferred safely?” to test the boundary, then “Which users must confirm?” to expose the state most likely to be missed. I would keep “How is the old path retired?” for the release check because it asks whether the decision still holds outside the ideal path. The work is ready to move when the artifact can explain the choice and the observed result supports honest repair of known and unknown temporal state.

Make time judgment visible

A portfolio-worthy scheduling story shows the semantic distinction, data contract, interface context, transition tests, and production correction.

The practical review starts here:

  • Which time concepts were confused?
  • What type made the distinction visible?
  • Which edge case changed the design?
  • How was correctness monitored?

Those questions keep showing a date picker without the model behind it from becoming the default. I would capture the decision in a redacted temporal architecture note, then use it while the work is still cheap to change. For time-aware product behavior, the artifact should make ownership, constraint, and next action visible without requiring a private explanation.

Success would look like credible evidence of global product engineering. If I cannot point to that evidence, I have a direction, not a finished decision.

The implementation move is to make a redacted temporal architecture note part of the working surface. I would use it to answer “Which time concepts were confused?” while scope is still flexible, and “What type made the distinction visible?” before code or content becomes expensive to unwind. During QA, “Which edge case changed the design?” and “How was correctness monitored?” become concrete checks rather than discussion prompts. That sequence turns time-aware product behavior into something the team can operate and gives me a specific outcome to report: credible evidence of global product engineering.

What I would show in the work

The public version needs evidence from the work itself. For this topic, the first five artifacts I would reach for are:

  • a temporal intent statement
  • a zone-ownership table
  • a storage decision for instant, zone, and intent
  • an ambiguity decision table
  • a recurrence rule plus exception model

I would not publish all five at equal weight. One should orient the reader, one should reveal the hardest tradeoff, and one should prove the result. The others can live in a downloadable note or appear as supporting frames. That edit matters because a temporal state contract that names what each time value means before it enters storage, APIs, UI, jobs, or analytics becomes harder to understand when every process detail is treated as equally important.

I would also show one rejected direction. The useful version is specific: which option looked attractive, which constraint made it wrong, and what evidence supported the narrower choice. That gives an engineering manager something real to question and keeps the case study from reading like the final answer was obvious from the beginning.

temporal-state-contract.md
# intent
clinic opens 09:00 Bogota
Plain time plus America/Bogota and location ownership; not a one-time UTC conversion.

# transition Paris reminder during DST change Resolve nonexistent time by policy; persist named zone; show adjusted occurrence to administrator.

# proof transition fixture set Test skipped hour, repeated hour, zone-rule change, viewer zone, recurrence, and serialization round trip.

Figure 4: A temporal contract makes a scheduling decision inspectable.

Resource path

The practical follow-up I would build is a temporal state contract with user intent, value type, source zone, display zone, daylight-saving disambiguation, recurrence rule, storage representation, serialization, test transitions, owner, and migration notes. I am treating that as a resource backlog item, not pretending the adjacent downloads below are the same artifact. The related cards cover useful pieces of the workflow today; this specific file should only be published when its examples, fields, and instructions are complete.

The first version should stay concise: context, constraint, decision, evidence, owner, and follow-up. Its value would come from helping someone repeat this exact review, not from adding another generic PDF to the site.

Review checklist

The article-specific review questions are:

  • What promise is the user making?
  • Who chooses the zone?
  • Is the event in the future?
  • Can this time be skipped?
  • What stays invariant?
  • Is the zone visible?
  • Which string format is accepted?
  • Which zones exercise each case?
  • Which values lost their zone?
  • Which time concepts were confused?

I would add two editorial checks before publishing: can a recruiter find the point in the first minute, and can an engineer trace at least one claim to an implementation or production receipt? If either answer is no, the article needs another edit.

Implementation notes

For time-aware product behavior, I would write the implementation note before polish. It would name the changed surface, source of truth, owner, failure boundary, and verification path. Those details prevent the principle from floating above the actual code or operational workflow.

The proof signals I care about are specific to this article:

  • fewer decisions made against the wrong clock
  • round trips that do not lose semantic information
  • evidence across the boundaries where time models fail
  • honest repair of known and unknown temporal state
  • credible evidence of global product engineering

I would choose two or three of those signals for the first release rather than instrumenting everything. The strongest pair usually combines one direct behavior check with one operating check: a route and a data query, a keyboard path and a support state, a handler replay and a reconciliation result, or a migration count and a rendered screen.

The follow-up belongs in the note before shipping. It should say what remains temporary, what evidence would trigger another pass, and who owns that decision. That is how the first version stays intentionally narrow without making the boundary invisible.

Case-study packaging

I would structure the case-study version around the four visual lessons already established:

  • Product intent chooses the temporal type.
  • One local time can pass through different states.
  • Recurrence reveals whether the model is correct.
  • A temporal contract makes a scheduling decision inspectable.

The opening frame explains the product pressure. The middle two show the decision moving through the system. The last frame is the receipt: what was checked, what held, and what remained unresolved. That order lets the reader move from product judgment into implementation detail without reconstructing the whole project first.

I would include one caveat tied to scheduling, billing, reporting, reminders, travel, publishing, and collaboration products where a date, wall-clock time, exact instant, duration, calendar, and regional time-zone rule are not interchangeable: a data limit, rollout boundary, unsupported state, external dependency, or result that is still directional. A precise caveat makes the evidence easier to trust because it shows where the claim stops.

The final test is whether the page creates a better conversation. If the artifact helps someone ask a sharper question about product judgment, implementation detail, or release proof in a live interview, it belongs in the story.

Interview angle

In an interview, I would explain this through a temporal state contract that names what each time value means before it enters storage, APIs, UI, jobs, or analytics. The story should start with the product pressure, then move into the system constraint, the artifact, and the proof. That order keeps the answer grounded. It also gives the interviewer several places to go deeper: data, frontend architecture, design systems, support, migration, accessibility, or release process.

The strongest version of the answer includes a tradeoff. I want to be able to say what I chose, what I left alone, and how I knew the work helped. That is more credible than presenting every project as a clean win.

The hiring signal

A temporal state contract is a hiring signal because it shows I can translate ambiguous product language into data types, interface states, and boundary tests that survive global use.

That is the level I want this site to communicate. The work should show taste, but it should also show operating judgment. It should make me look like someone who can enter a real product system, understand the messy middle, ship the useful version, and leave enough proof for the next person to trust it.

Companion artifacts

Use this after reading.

Practical downloads and templates that turn the article into something you can bring into a product review, implementation pass, or agent workflow.

DownloadJun 2026

Front-End State Recipes

Reusable recipes for optimistic actions, loading, empty, error, data-transition, and disabled-control states.

FrontendStatesUX
View details
RepoJun 2026

Agent-Ready API Spec Template

An OpenAPI and Postman starter template for APIs that AI agents can discover, call, and recover from safely.

OpenAPIPostmanAI agents
View details
DownloadJun 2026

UI PR Risk Review Checklist

A merge-readiness checklist for product intent, states, accessibility, visual durability, and UI implementation risk.

UI reviewQAFrontend
View details