Time & Time Zones
The current time in any zone, plus conversion between ISO 8601, RFC 2822, HTTP dates and Unix timestamps, differences between two times, and DST-aware date arithmetic. Computed in your browser.
—
This page uses your computer's clock and time zone. “Now”, “today” and times without an offset are read in your zone unless you choose another zone in a tool below. If your computer's clock is wrong, “now” is wrong too; compare it with the server clock below.
To read the server's clock, this page sends one HEAD request to its own address
and reads the response's Date header. The request contains nothing you type, and
goes only to this site.
Comma-separated IANA zones. Your browser's zone is listed first. Updates every second from your device clock.
Where your data goes
| Using this page | Using the API, MCP or A2A | |
|---|---|---|
| Where it runs | In your browser. Parsing, conversion, differences and date arithmetic run in the page with Luxon and your browser's built-in time-zone data (Intl); the live clock reads your device's clock, zone and locale. | In a Cloudflare Pages Function at the Cloudflare data centre nearest the caller. |
| What leaves your device | Nothing you enter. To show the server's clock, the page sends one HEAD request to its own address and reads the Date response header. It contains nothing you type, and the page's Content-Security-Policy (connect-src 'self') lets it reach only this site. | The server receives only the zone names and format options, reads its own clock, and returns the result. Your input is not stored or logged; only the per-call metadata row (operation, time, status, sizes) is recorded. The server receives the date-time string and zone names, converts them in memory, and returns the result. Your input is not stored or logged; only the per-call metadata row (operation, time, status, sizes) is recorded. The server receives the two date-time strings and the zone name, computes the difference in memory, and returns it. Your input is not stored or logged; only the per-call metadata row (operation, time, status, sizes) is recorded. The server receives the date-time, duration and zone name, computes the result in memory, and returns it. Your input is not stored or logged; only the per-call metadata row (operation, time, status, sizes) is recorded. |
| Stored | Nothing leaves the page. No cookies, analytics or third-party scripts; the browser keeps only your View → Inline config choice. | Your inputs and results: never. What is stored is your client record (client ID, a SHA-256 hash of your secret, expiry, and the profile you registered with) and one metadata row per call: operation, time, transport, status, error code, duration, request and response sizes, and country. |
| Logged | Nothing by this service. Cloudflare sees the request metadata of the page load and that one request. | Only the per-call metadata above, attributed to your client ID. Never parameters, bodies, results, or credentials. Cloudflare, as the host, also processes request metadata (IP address, full URL including the query string, headers) under its own policies, so put inputs in POST bodies. |
| Access | Open to anyone. | Requires a client ID and secret (how to get one). HTTPS only; TLS terminates at Cloudflare. |
Details and how to verify this yourself: Security & privacy.
User guide
The tool sits in a window that works like a desktop app: menus on the top row and the full-screen icon at its right (Esc leaves full screen). The set-up options described below are in Settings → Options…, an overlay, and the Settings menu also lists the common choices directly. To keep the options in view instead, choose View → Inline config; the page remembers that choice. Help → Keyboard shortcuts… lists the keys.
The page has four panels.
-
Now. The current time in your browser’s zone and in any IANA zones you list, updated every second. It shows the UTC offset, the zone abbreviation, and whether daylight saving time (DST) is in effect.
-
Convert. Paste almost any timestamp to see it in UTC, as a Unix timestamp, and in other zones:
- ISO 8601 / RFC 3339:
2026-10-13T14:30:00Z,2026-10-13T14:30:00+02:00,2026-10-13 14:30,2026-10-13 - an email or HTTP date:
Tue, 13 Oct 2026 14:30:00 +0200 - a Unix timestamp in seconds, milliseconds, microseconds or nanoseconds
- the word
now
A time without an offset (
2026-03-08 02:30) is a wall-clock time. It is read in the zone given under Zone for times without an offset, which defaults to your browser’s zone. The summary line says exactly how the input was read. If the wall-clock time was skipped or repeated by a DST change, it says so. - ISO 8601 / RFC 3339:
-
Difference. Two times give both the calendar difference (
P1M2D, “1 month, 2 days later”) and the elapsed time (PT23H, total hours, seconds and milliseconds). The two differ across a DST change: noon to noon over the spring change is one calendar day, but only 23 hours. -
Add. Add or subtract an ISO 8601 duration such as
P1D,PT36Hor-P1M. Days, weeks, months and years keep the wall-clock time; hours, minutes and seconds are exact elapsed time.
Why “P1D” and “PT24H” differ. In New York, 2026-03-07 12:00 plus
P1Dis 2026-03-08 12:00 (23 hours later, because clocks moved forward). PlusPT24Hit is 2026-03-08 13:00. Use days for “same time tomorrow” and hours for “exactly 24 hours later”.
For agents. Call time_now instead of assuming today’s date. Pass explicit zones such as America/New_York; abbreviations such as EST are refused because they are ambiguous. Read notes in the response: they list every assumption that was made.
Specification
Input formats. Inputs are tried in this order; the first that matches wins.
| Order | Format | Rules |
|---|---|---|
| 1 | now | Case-insensitive. The time at which the request (or the page) evaluates it. |
| 2 | Unix timestamp | An optional sign, digits, and optional decimals (1791900000, -1.5, 1791900000123). Any all-digit input is a timestamp. An 8-digit input that is also a valid YYYYMMDD date gets a note suggesting YYYY-MM-DD. |
| 3 | ISO 8601 | Luxon’s ISO parser: calendar, ordinal (2026-286) and week (2026-W42-2) dates; basic or extended form; fractional seconds; 24:00 (read as the next day’s 00:00, with a note). A space may replace T, and a space may precede the offset. An RFC 9557 suffix such as [Europe/Paris] is honoured. |
| 4 | HTTP-date | IMF-fixdate, RFC 850 and asctime forms (RFC 9110 §5.6.7), always GMT. |
| 5 | RFC 2822 | Numeric offsets and the obsolete zone names (GMT, EST, …). The weekday, if present, must match the date, or the input is rejected. |
Unix timestamp units. With unit=auto (the default), the unit follows the magnitude of the integer part:
| Magnitude | Unit | Example |
|---|---|---|
| below 10^11 | seconds | 1791900000 |
| 10^11 to below 10^14 | milliseconds | 1791900000123 |
| 10^14 to below 10^17 | microseconds | 1791900000123456 |
| 10^17 or more | nanoseconds | 1791900000123456789 |
Each threshold is 10^11 of the smaller unit (1973-03-03) and the year 5138 in the larger unit, so any date from March 1973 to 5138 is detected correctly whatever its unit. A millisecond timestamp before March 1973 is read as seconds: pass unit. An auto-detected unit is always reported in notes, together with what the number would mean in the neighbouring units. Pass unit to override it. Parsing is exact (big integers), then rounded down to the millisecond, which is the resolution of every result. When digits were dropped, notes says so.
Range. Instants must lie within ±8.64 × 10^15 ms of 1970-01-01T00:00:00Z (the JavaScript Date range, years −271821 to 275760).
Wall-clock times. An input without an offset has no meaning until a zone is given.
- Which zone:
time_convertusesfrom_zoneand fails without it;time_diffandtime_addusezone(defaultUTC). A bracketed[Zone]in the input takes precedence. - How it resolves: the resolver finds every instant whose local time in that zone equals the input. The result is reported in
local_time:
local_time | Meaning | compatible (default) | earlier | later | reject |
|---|---|---|---|---|---|
unique | One instant | that instant | that instant | that instant | that instant |
gap | Skipped (clocks moved forward) | shift forward by the gap: 02:30 → 03:30 | the instant before the gap: 02:30 → 01:30 | as compatible | 422 error |
overlap | Repeated (clocks moved back) | the first occurrence | the first occurrence | the second occurrence | 422 error |
These are the rules of JavaScript Temporal’s disambiguation option. If both an offset and a bracketed zone are present, the offset decides the instant; a mismatch between them is reported in notes.
Zones.
- Accepted:
- IANA names, with letter case corrected (
america/new_york→America/New_York); UTC(alsoGMT,Z,Zulu);- fixed offsets
±H,±HH:MM,UTC±HH:MMorGMT±HHMM, up to ±18:00, reported asUTC±HH:MM.
- IANA names, with letter case corrected (
- Rejected:
localandsystem;- unknown names;
- the abbreviations PST, PDT, EST, EDT, CST, CDT, MST, MDT, BST, CET, CEST, IST, JST, AEST and AEDT, each with a suggested IANA zone. Some of these are valid IANA names, but they are fixed offsets without DST, or now aliases of an unexpected zone.
- Warnings:
- fixed offsets (they never change for DST);
- legacy names without a
/(such asJapan); Etc/GMT±N, whose sign is inverted:Etc/GMT+5is UTC−05:00.
Output for each zone.
| Field | Definition |
|---|---|
iso | ISO 8601 with offset; Z only when the zone is UTC (so Europe/London in winter prints +00:00); milliseconds only when non-zero |
local, date, time | Wall-clock values without offset, 24-hour clock |
offset, offset_minutes | Offset from UTC, ±HH:MM and signed minutes (east positive) |
abbreviation, offset_name | Zone names as Intl prints them for en-US. Many zones have no English abbreviation and show GMT+2; the exact text depends on the ICU version |
dst | Luxon’s rule: true when the offset at this instant is greater than the zone’s offset at the same time on 1 January or in May of that year; always false for UTC and fixed offsets |
weekday_number | ISO 8601: Monday = 1 … Sunday = 7 |
iso_week, iso_week_year, iso_week_number | ISO 8601 week date. Near 1 January the week-numbering year can differ from the calendar year (2027-01-01 is in 2026-W53) |
day_of_year | 1–366 |
formatted | Extra formats on request: rfc2822, http (always GMT), sql, iso_basic, iso_week_date, iso_ordinal, human, and a Luxon token pattern |
unix_seconds is rounded down, so −0.5 s is −1.
Durations.
- Grammar:
[+|-]P[nY][nM][nW][nD][T[nH][nM][nS]], case-insensitive, with at least one component. Weeks may be combined with other units, as ISO 8601-2 and Temporal allow. - Fractions: only on the smallest of hours, minutes and seconds, with
.or,, to whole milliseconds.PT1.5His normalised toPT1H30M. - Rejected: fractional years, months, weeks or days (
P1.5D), because those units have no fixed length. - API alternative:
amountwithamount_unit(years…milliseconds).subtract=truenegates the duration.
Addition (time_add) follows Temporal.ZonedDateTime.prototype.add:
- Years and months are added to the wall-clock date in
zone. A day that does not exist in the target month is clamped to its last day (Jan 31 +P1M= Feb 28; Feb 29 +P1Y= Feb 28). Clamping is reported innotes. - Weeks (7 days) and days are added to the wall-clock date.
- The resulting wall-clock time is resolved in
zonewithdisambiguation, as in the table above. - Hours, minutes, seconds and milliseconds are added as exact elapsed time.
A duration with no calendar part (only PT…) never consults the zone’s rules. The offset written in input does not choose the zone: 2026-03-07T12:00-05:00 plus P1D in UTC is exactly 24 hours later.
Differences (time_diff).
total: exact elapsed time, end minus start (signed); a day is 86,400,000 ms. Values other than milliseconds are IEEE 754 doubles and may be fractional.calendar: counted forward from the earlier to the later instant inzone, largest units first. Months are the largest whole number that does not pass the later instant, then days the same way. The rest is elapsed hours, minutes, seconds and milliseconds. Magnitudes are non-negative;signgives the direction. By construction,time_addofcalendarto the earlier instant in the same zone returns the later instant exactly; the test suite checks this over thousands of random pairs in DST zones.iso_duration: the calendar breakdown as ISO 8601, prefixed with-when end is before start (the ISO 8601-2 / Temporal convention), orPT0S. Weeks are not used.iso_duration_exact: elapsed time in hours, minutes and seconds only (PT23H).calendar_days: the local date of end minus the local date of start inzone, ignoring time of day.
Limits. Inputs up to 100 characters; up to 20 zones per request; pattern up to 100 characters.
API & MCP
The same logic is available over HTTP and as MCP tools. Unlike this page, these run on the server: see where your data goes.
/api/time/now The current instant from the server clock, in one or more time zones. GET POST /api/time/convert Parse a date-time or Unix timestamp and show it in other zones and formats. GET POST /api/time/diff Elapsed time and calendar difference between two instants, DST-aware. GET POST /api/time/add Add or subtract an ISO 8601 duration to an instant, calendar-aware in a time zone.