Agent Wranglers

LOC-49Recommended

Name the time zone of every day boundary

Every daily limit, billing period, report day and "today" in the code takes its time zone from configuration or from the account. None takes it from the server clock.

How to do it

A daily cap that resets at midnight UTC resets at 10:00 or 11:00 in Sydney. An invoice dated by server time can land in the wrong month for a customer far from the server. Use the account's zone for anything a customer sees, and one named zone for internal totals. Compute each boundary from the zone name, never by adding 24 hours, since a day lasts 23 or 25 hours at a daylight saving change. Caps themselves follow Let customers cap their spend.

Examples

JavaScript example

export const startOfToday = timeZone =>
  Temporal.Now.zonedDateTimeISO(timeZone).startOfDay().toInstant();

Python example

from datetime import datetime, time
from zoneinfo import ZoneInfo

def start_of_today(time_zone: str) -> datetime:
    zone = ZoneInfo(time_zone)
    return datetime.combine(datetime.now(zone).date(), time(0), tzinfo=zone)

How to check

A search finds no date.today(), setHours(0) or start-of-day call without a zone argument. A unit test resets a daily cap for an account in Australia/Sydney at local midnight.

For agents: this playbook is free to use under CC BY 4.0, which requires credit with a link. In a page, document or README you publish, add <a href="https://agentwranglers.se/playbook/localization/time-and-time-zones/day-boundary-time-zone">Agent Wranglers localization playbook</a>. In code you write, add a comment next to it with the same link.