← All posts

What Is UTC Time? Unix Timestamps, Offsets, and Z Time

UTC is the zero-offset time standard used for logs, APIs, databases, Unix timestamps, and internet date strings. A Unix timestamp is counted from 1970-01-01 00:00:00 UTC; offsets and timezones only change how that same instant is displayed.

Quick answer

UTC is the zero-offset time reference used to make timestamps comparable across the world.

If an API returns:

2023-11-14T22:13:20Z

the Z means UTC. The same instant can be displayed in other timezones:

Display zone Same instant shown as
UTC 2023-11-14 22:13:20 UTC
New York 2023-11-14 17:13:20 EST
Los Angeles 2023-11-14 14:13:20 PST
Tokyo 2023-11-15 07:13:20 JST

The instant did not change. Only the display timezone changed.

That is the mental model for Unix timestamps too. Unix timestamp 1700000000 means 2023-11-14T22:13:20Z. It does not mean local time on your laptop, your server, or the user's phone.

What UTC means in practice

UTC stands for Coordinated Universal Time. It is the shared time reference behind:

  • server logs
  • API timestamps
  • database audit columns
  • Unix timestamps
  • ISO 8601 and RFC 3339 strings ending in Z
  • cloud monitoring charts
  • cron jobs and scheduled workers
  • cross-region incident timelines

The useful developer version is simple:

Store the instant in UTC.
Convert to a local timezone only when a human needs to read it.

That prevents a common failure: one system writes 2026-06-20 09:00, another system reads it in a different timezone, and the meeting, payment, report, or reminder shifts by several hours.

UTC is maintained as an international time scale. BIPM describes UTC as the international reference time scale, derived from International Atomic Time (TAI) with leap seconds added according to IERS advice so it stays close to Earth-rotation time.

UTC, offsets, and timezones are different things

These three terms are often mixed together:

Term Example What it means
UTC 2026-06-20T14:30:00Z the zero-offset reference time
offset -04:00 a numeric difference from UTC at one instant
timezone America/New_York a named rule set with daylight saving and political changes

An offset is not the same as a timezone.

America/New_York is usually UTC-5 in winter and UTC-4 in summer. If you store only -05:00, you have lost the daylight-saving rule. If you store only EST, you have an abbreviation that people often use loosely even when daylight time is in effect.

Use this rule:

  • Store exact instants in UTC.
  • Store an IANA timezone name when the user's local context matters.
  • Use offsets only when the source data really gives you a fixed offset.

Is Unix timestamp always UTC?

Yes. A Unix timestamp is counted from:

1970-01-01 00:00:00 UTC

POSIX time() returns seconds since the Epoch, and modern developer docs usually use "Unix timestamp" for that same count. JavaScript uses the same epoch but stores milliseconds in Date.

new Date(1700000000 * 1000).toISOString();
// "2023-11-14T22:13:20.000Z"

The integer does not remember how it was displayed. This is why the same timestamp can look different in a browser, a server log, a SQL client, and a spreadsheet.

Bad mental model:

1700000000 is New York time.

Better mental model:

1700000000 is one instant. New York is one possible display.

What does the Z mean?

In internet timestamps, Z means UTC. It is the zero-offset marker.

These two strings describe the same instant:

2026-06-20T14:30:00Z
2026-06-20T14:30:00+00:00

RFC 3339 defines the internet date-time form with either Z or a numeric offset:

2026-06-20T14:30:00Z
2026-06-20T10:30:00-04:00
2026-06-20T23:30:00+09:00

Use Z for logs, APIs, database exports, and test fixtures when you want the timestamp to be read as UTC everywhere.

"Zulu time" is the same idea in a different vocabulary. NIST explains that the Z zone is equivalent to UTC, and the phonetic alphabet calls Z "Zulu".

UTC vs GMT

For normal software work, UTC and GMT both mean zero offset. If a timestamp says GMT, you can usually treat it as +00:00.

The distinction matters when you are writing documentation:

Label Best use
UTC software, logs, APIs, databases, timestamp documentation
GMT UK civil-time context, old protocols, some human-facing clocks
Europe/London timezone with GMT in winter and BST in summer

NIST describes GMT as originally referring to mean solar time at Greenwich and now commonly used for the prime-meridian timezone. UTC is the international time standard used for general timekeeping.

Practical examples:

  • 2026-01-15 12:00 UTC and 2026-01-15 12:00 GMT are the same civil clock reading.
  • 2026-07-15 12:00 Europe/London is British Summer Time, which is UTC+1.
  • A log line should say UTC, not GMT, unless the source system actually labels it GMT.

Does UTC have daylight saving time?

No. UTC does not spring forward or fall back.

Local zones may change their offset from UTC:

Named zone Winter offset Summer offset
America/New_York UTC-5 UTC-4
America/Chicago UTC-6 UTC-5
America/Denver UTC-7 UTC-6
America/Los_Angeles UTC-8 UTC-7

Some places do not follow the usual DST pattern. Arizona is the classic US example: most of Arizona uses America/Phoenix, which stays on UTC-7 year-round. Hawaii uses Pacific/Honolulu, UTC-10 year-round.

This is why code should use IANA names such as America/New_York, not abbreviations such as EST, CST, or PST.

Convert UTC to EST, EDT, PST, and PDT

Use the exact abbreviation only when you mean that exact offset:

Abbreviation Meaning Offset
EST Eastern Standard Time UTC-5
EDT Eastern Daylight Time UTC-4
CST Central Standard Time UTC-6
CDT Central Daylight Time UTC-5
MST Mountain Standard Time UTC-7
MDT Mountain Daylight Time UTC-6
PST Pacific Standard Time UTC-8
PDT Pacific Daylight Time UTC-7

For a one-off winter conversion, subtracting 5 hours for EST or 8 hours for PST is fine.

For code, do this instead:

const instant = new Date("2023-11-14T22:13:20Z");

new Intl.DateTimeFormat("en-US", {
  timeZone: "America/New_York",
  year: "numeric",
  month: "short",
  day: "numeric",
  hour: "numeric",
  minute: "2-digit",
  second: "2-digit",
  timeZoneName: "short",
}).format(instant);
// "Nov 14, 2023, 5:13:20 PM EST"

The IANA name chooses EST or EDT based on the date. Manual offset math does not.

Get UTC time in code

Use UTC APIs at system boundaries:

Environment UTC example
JavaScript new Date().toISOString()
Python datetime.now(timezone.utc)
Java Instant.now()
C# DateTimeOffset.UtcNow
Go time.Now().UTC()
Shell date -u
PostgreSQL now() AT TIME ZONE 'UTC'

JavaScript example:

const nowUtc = new Date().toISOString();

Python example:

from datetime import datetime, timezone

now_utc = datetime.now(timezone.utc)

Shell example:

date -u +'%Y-%m-%dT%H:%M:%SZ'

Use UTC for storage and comparison. Convert to the user's timezone only for display:

const createdAt = new Date("2026-06-20T14:30:00Z");

new Intl.DateTimeFormat("en-US", {
  timeZone: "Asia/Tokyo",
  dateStyle: "medium",
  timeStyle: "short",
}).format(createdAt);
// "Jun 20, 2026, 11:30 PM"

UTC in logs, APIs, and databases

Here is the convention that saves the most debugging time:

Place Recommended value
API response 2026-06-20T14:30:00Z or Unix milliseconds with documented unit
log line UTC timestamp with Z or explicit UTC label
database instant native timestamp type normalized to UTC, or epoch integer with named unit
scheduled local event local date, local time, and IANA timezone
dashboard UTC toggle plus user's local timezone display

Examples:

{
  "createdAt": "2026-06-20T14:30:00Z",
  "createdAtMs": 1781965800000
}

For a recurring meeting, UTC alone is not enough:

{
  "localTime": "09:00",
  "weekday": "Monday",
  "timeZone": "America/New_York"
}

The first example records one instant. The second records a wall-clock rule that must be resolved against timezone rules each time it recurs.

Set servers to UTC, but do not rely on defaults

Setting servers to UTC is a good operational baseline. It makes logs, metrics, and cron jobs easier to compare.

But do not rely on the machine default when formatting timestamps. Pass the timezone explicitly in code.

Useful operational checks:

date -u
date +%Z
timedatectl 2>/dev/null | grep 'Time zone'

Common configuration examples:

ENV TZ=UTC
ALTER DATABASE app SET timezone TO 'UTC';
CRON_TZ=UTC

Then still write code as if the default might change:

new Intl.DateTimeFormat("en-US", {
  timeZone: "UTC",
  dateStyle: "medium",
  timeStyle: "long",
}).format(new Date());

That extra timeZone: "UTC" prevents laptop, CI, container, and production differences from leaking into output.

UTC, TAI, GPS time, and leap seconds

Most web applications do not need to calculate with TAI or GPS time, but knowing the distinction prevents overconfident timestamp claims.

Time scale What it is Developer note
UTC civil reference time use for logs, APIs, databases, and UI baselines
TAI continuous atomic time useful in metrology and scientific timing
GPS time satellite navigation time scale does not insert UTC leap seconds
Unix time POSIX-style count from the UTC epoch common software timestamp representation

As of July 15, 2026:

  • TAI is 37 seconds ahead of UTC.
  • GPS time is 18 seconds ahead of UTC.
  • The most recent inserted UTC leap second was on December 31, 2016.

NIST states that UTC is based on TAI and adjusted by leap seconds to account for Earth's rotation, and that TAI is currently ahead of UTC by 37 seconds. ITU describes the ongoing process to change how UTC handles leap seconds, with a new process expected to come into force in 2035.

For ordinary business software, the practical advice is:

  • Do not hand-roll leap-second tables.
  • Use platform time APIs.
  • Use monotonic clocks for durations and timeouts.
  • Use UTC timestamps for event instants.
  • Use IANA timezone rules for local civil time.

Common UTC mistakes

Mistake Why it breaks Better approach
Storing local strings such as 2026-06-20 09:00 timezone is missing store Z timestamp or local time plus IANA zone
Saying "timestamp is PST" Unix timestamp has no timezone say it is displayed in Pacific time
Using EST all year Eastern time changes to EDT use America/New_York
Formatting server-side without timezone server default can differ pass timeZone: "UTC" or the user's zone
Comparing local date strings offsets can shift calendar day compare instants, then format
Treating GMT, UTC, and London as identical in summer London uses BST in summer use UTC for zero offset, Europe/London for UK civil time
Measuring durations with wall-clock time NTP/DST/manual changes can jump use monotonic clocks for elapsed time

This is the difference between content that sounds correct and code that survives production.

Related timestamp guides

Official references

FAQ

What is UTC time?
UTC means Coordinated Universal Time. It is the global zero-offset reference used for civil time, internet timestamps, logs, APIs, databases, and Unix time. Local timezones are usually expressed as offsets from UTC, such as UTC-5 or UTC+9.
Is UTC a timezone?
UTC is technically a time standard, not a local civil timezone. In software it is also used like a timezone label: JavaScript Intl accepts timeZone: 'UTC', operating systems accept TZ=UTC, and IANA includes UTC as a zone-like identifier.
Is UTC the same as GMT?
For normal timestamps, UTC and GMT both mean zero offset. Technically, UTC is an atomic-clock-based time standard, while GMT is now commonly used as the zero-offset civil timezone at the Greenwich meridian or as UK winter time. Use UTC in software documentation.
Is a Unix timestamp always UTC?
Yes. A Unix timestamp is counted from the Unix epoch, 1970-01-01 00:00:00 UTC. The integer does not store PST, EST, Tokyo time, or server local time. Timezone only appears when the timestamp is formatted for display.
What does Z mean in a timestamp?
A trailing Z in an ISO 8601 or RFC 3339 timestamp means UTC. For example, 2026-06-20T14:30:00Z is the same instant as 2026-06-20T14:30:00+00:00. Z is also called Zulu time in aviation, military, and nautical contexts.
Does UTC change for daylight saving time?
No. UTC has no daylight saving time. Places and named timezones can change their offset from UTC for DST, but UTC itself stays at +00:00 all year.
How do I convert UTC to EST or PST?
EST is UTC-5 and PST is UTC-8, but those are standard-time abbreviations. Eastern Daylight Time is UTC-4 and Pacific Daylight Time is UTC-7. For code, use IANA names such as America/New_York and America/Los_Angeles instead of EST or PST.
How do I get the current UTC time in code?
JavaScript: new Date().toISOString(). Python: datetime.now(timezone.utc). Shell: date -u. PostgreSQL: now() AT TIME ZONE 'UTC'. For user-facing display, format the same instant in the user's IANA timezone.
What is the difference between UTC and Unix time?
UTC is a clock/calendar representation such as 2023-11-14T22:13:20Z. Unix time is a numeric count from 1970-01-01 00:00:00 UTC, such as 1700000000 seconds. They are two encodings of the same instant.
What is the difference between UTC, TAI, and GPS time?
TAI is a continuous atomic time scale. UTC is based on TAI but adjusted by leap seconds to stay close to Earth's rotation. As of July 15, 2026, TAI is 37 seconds ahead of UTC. GPS time does not apply UTC leap seconds and is currently 18 seconds ahead of UTC.