← All posts

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

UTC is the zero-offset time standard used to define the Unix epoch. A Unix timestamp is always counted from 1970-01-01 00:00:00 UTC; timezone only changes how that same instant is displayed.

What is UTC?

UTC is the world's primary time standard — the zero-offset reference that every other time zone is computed from. It runs on a network of atomic clocks (the TAI scale) with occasional leap-second adjustments to keep wall-clock time aligned with Earth's irregular rotation. UTC is the timestamp format almost every server log, API response, database column, and protocol message uses internally, because it's unambiguous: there's exactly one UTC time at any physical instant. Local timezones — EST, IST, CET, JST — are calculated as offsets from UTC, applied only when a human needs to read the time.

  • UTC = Coordinated Universal Time
  • Zero-offset reference for every world time zone
  • Maintained by the BIPM and ITU; leap seconds coordinated by the IERS
  • Always unambiguous — one UTC value per physical instant
  • Year-round constant — no DST or seasonal adjustments
  • Used in computing: ISO 8601 trailing Z, RFC 3339 format, Unix timestamps

UTC as zero-offset time

UTC has offset +00:00. It does not observe daylight saving time, so every other zone can be described as an offset from UTC at a specific instant.

Unix timestamps count from UTC

The Unix epoch is 1970-01-01 00:00:00 UTC. That makes epoch to UTC conversion the canonical way to inspect a timestamp.

Timezones only change display

The same Unix timestamp can display as Monday in UTC and Sunday in Pacific time. The underlying instant does not change.

Is Unix timestamp always UTC?

Yes. A Unix timestamp is an integer count from a UTC reference point, so the value itself has no local timezone. The confusion comes from display: converters and runtimes often show the same instant in the viewer's local zone by default. For debugging, convert epoch to UTC first; for user-facing output, choose the named timezone where the person expects to read it.

  • Epoch to UTC: paste the Unix timestamp and choose UTC output
  • Epoch to local time: use a timezone tool with an IANA name such as America/Los_Angeles
  • UTC to timestamp: use Date to Epoch with UTC selected as the source timezone
  • Timezone conversion terms should use the dedicated timezone tools, not manual offset math

What does UTC mean — and why the letters are out of order

UTC stands for Coordinated Universal Time. The acronym is deliberately out of order — it's neither the English initials (CUT) nor the French initials (TUC, for Temps Universel Coordonné). When the ITU formalized the modern coordinated time scale in 1970, the agreement was to pick a language-neutral acronym so that no nation's preferred initialism would dominate. UTC was the compromise. The order doesn't match either language's word order, but it's the same in every language — which was the entire point.

  • English word order would give 'CUT' (Coordinated Universal Time)
  • French word order would give 'TUC' (Temps Universel Coordonné)
  • UTC is neither — it's a language-neutral compromise from 1970
  • ITU-R Recommendation TF.460 standardized the modern UTC scale
  • The arrangement also matches CCITT (now ITU-T) conventions for other time-related acronyms

Is UTC a time zone?

Strictly, UTC is a time standard rather than a time zone — it's the reference instant, not a place's wall-clock convention. But every modern time-handling system treats it as a zone-like label: the IANA time zone database has a zone named 'UTC', JavaScript's Intl.DateTimeFormat accepts 'UTC' as a timeZone option, and operating systems can set TZ=UTC. Places that observe UTC year-round as their civil time include Iceland (Africa/Abidjan-equivalent in tz terms), Burkina Faso, and most cloud-container hosts. In practice 'UTC' is both — a global standard and a usable zone label.

  • Standard: UTC is the world reference time, maintained by atomic clocks
  • Zone label: 'UTC' is accepted by Intl.DateTimeFormat, IANA tz database, every OS
  • Civil time: Iceland, Burkina Faso, Mali, Senegal, parts of Antarctica use UTC year-round
  • Container default: most Docker images and Kubernetes pods run TZ=UTC
  • Server convention: production deployments should set TZ=UTC explicitly

UTC vs GMT — are they the same?

For civil and computing purposes, yes — UTC and GMT share the zero-offset reference and the same prime-meridian baseline. The technical distinction: GMT is a time zone (the Europe/London standard-time offset, observed in the UK winter); UTC is a time standard maintained by atomic clocks. Wall-clock-wise they match to within fractions of a second. British civil time switches between GMT (winter) and BST (summer); UTC never changes. Modern internet and computing standards prefer UTC because it's unambiguous; older British and shipping conventions still use GMT, and the two are interchangeable in casual usage.

  • UTC: time standard; atomic-clock based; never changes
  • GMT: time zone (Europe/London winter); shifts to BST in summer
  • Wall-clock identical when GMT is in effect (UK winter)
  • Difference: GMT can drift slightly from the atomic UTC reference (microseconds)
  • Style: modern computing uses 'UTC'; shipping, astronomy, and British civil contexts often still use 'GMT'
  • IANA: the zone Europe/London is GMT in winter, BST in summer — UTC is a separate zone

How to read UTC time

UTC is always written in 24-hour format — there's no AM or PM. The standard ISO 8601 representation is YYYY-MM-DDTHH:MM:SSZ, where Z (Zulu) signals UTC. 14:30 UTC means 2:30 PM UTC; 02:30 UTC means 2:30 AM UTC. The 'Z' suffix in datetime strings is the unambiguous machine-readable marker for UTC and is the format every API, log file, and serialized timestamp should use when there's no specific timezone requirement.

  • 00:00 UTC = midnight UTC (start of the UTC day)
  • 12:00 UTC = noon UTC
  • 14:30 UTC = 2:30 PM UTC
  • 23:59 UTC = one minute before midnight UTC
  • ISO 8601 form: 2026-06-20T14:30:00Z (the Z is required for UTC)
  • RFC 3339 (internet datetime): same as ISO 8601 with stricter sub-second formatting
  • Avoid 12-hour 'UTC' display — it's always 24-hour by convention

What time is it in UTC right now?

The site's home page shows the current UTC time as a live ticking clock that updates every second. Run the page in a tab to use it as a constantly-fresh UTC reference. For a one-off check in any environment, every operating system and language has a one-line call: date -u in shell, new Date().toISOString() in JavaScript, datetime.now(timezone.utc) in Python. The live tool is the easiest answer when you just need to read the value; the code snippets are what you reach for when you're building something that needs UTC programmatically.

  • Live tool: see / — ticks every second in UTC and your local zone
  • JavaScript: new Date().toISOString() → '2026-06-20T14:30:00.000Z'
  • Python: datetime.now(timezone.utc).isoformat() → '2026-06-20T14:30:00+00:00'
  • Shell: date -u → 'Sat Jun 20 14:30:00 UTC 2026'
  • Shell ISO: date -u +'%Y-%m-%dT%H:%M:%SZ'
  • Postgres: SELECT NOW() AT TIME ZONE 'UTC'

How to convert UTC to your local time

Add or subtract the offset of your local zone from UTC. The catch is that offsets can change twice a year because of daylight saving time — America/New_York is UTC-5 in winter and UTC-4 in summer. Always use an IANA timezone name (like 'America/New_York') rather than an abbreviation (like 'EST') for code that needs to be correct year-round. Manual offset math is fragile; library calls that take an IANA name are right by construction.

  • Manual: localTime = UTC + offset (offset is negative west of UTC, positive east)
  • Better (JS): new Intl.DateTimeFormat('en-US', { timeZone: 'America/New_York' }).format(utcDate)
  • Better (Python): utcDate.astimezone(ZoneInfo('America/New_York'))
  • Better (Postgres): SELECT utc_col AT TIME ZONE 'UTC' AT TIME ZONE 'America/New_York'
  • Avoid manual offset arithmetic — DST transitions happen at different local times in different years
  • Always pass the IANA name, never the abbreviation — 'EST' is ambiguous between standard and daylight

Convert UTC to EST, CST, MST, and PST

The four major US time zones each have a standard-time offset and a daylight-time offset. The table below covers both forms. For code, always use the IANA name (America/New_York etc.) rather than the abbreviation — the IANA name automatically picks the right offset for the date. The abbreviation form is only correct for specific times of year; using it year-round is one of the most common timezone bugs in US-only codebases.

  • EST (Eastern Standard): UTC-5 // winter; America/New_York in November-March
  • EDT (Eastern Daylight): UTC-4 // summer; America/New_York in March-November
  • CST (Central Standard): UTC-6 // winter; America/Chicago
  • CDT (Central Daylight): UTC-5 // summer; America/Chicago
  • MST (Mountain Standard): UTC-7 // winter; America/Denver
  • MDT (Mountain Daylight): UTC-6 // summer; America/Denver
  • PST (Pacific Standard): UTC-8 // winter; America/Los_Angeles
  • PDT (Pacific Daylight): UTC-7 // summer; America/Los_Angeles
  • Arizona note: mostly UTC-7 year-round (no DST); America/Phoenix not America/Denver
  • Hawaii: UTC-10 year-round (Pacific/Honolulu, no DST)

UTC in code — setting and using it correctly

The recurring source of timezone bugs in server code is reading the system's local timezone instead of explicitly using UTC. The fix is to set TZ=UTC at every layer and to pass explicit timeZone options to any formatting call. This is the developer-focused angle most explainers skip; it's also the most actionable. Apply the patterns below to any codebase that handles timestamps across servers, time zones, or container deployments, and most timezone bugs become impossible to ship.

  • Docker: ENV TZ=UTC in Dockerfile so the container runs in UTC
  • systemd: timedatectl set-timezone UTC on the host
  • JavaScript: pass timeZone: 'UTC' to every Intl.DateTimeFormat and toLocaleString call in server code
  • Python: from datetime import timezone; datetime.now(timezone.utc) — never datetime.now() without the tz argument
  • Java: ZoneId.of("UTC") for any zone-aware operation
  • Go: time.UTC for explicit UTC; time.Local is the system's local zone (avoid in server code)
  • Postgres: ALTER DATABASE name SET timezone TO 'UTC'
  • MySQL: SET GLOBAL time_zone = '+00:00'; or run the server with --default-time-zone=+00:00
  • Cron: set CRON_TZ=UTC at the top of the crontab

UTC history, IERS, and TAI

UTC was formalized in 1972 as a compromise between two competing precision time scales: TAI (atomic time, monotonic, no leap seconds) and UT1 (astronomical time, follows Earth's rotation). The agreement was to base civil time on the atomic count but insert occasional leap seconds to keep wall-clock noon aligned with the sun. The leap-second mechanism is overseen by the IERS (International Earth Rotation and Reference Systems Service), which announces them roughly six months in advance. As of 2026, UTC is 37 seconds behind TAI. The international standards body voted in 2022 to abolish leap seconds by 2035 — after that point, UTC will drift slowly from solar noon, but no application code will see a leap-second repeat.

  • TAI: International Atomic Time — monotonic, no leap seconds, the underlying scale
  • UT1: astronomical time — follows Earth's rotation, varies slightly
  • UTC: TAI minus the current leap-second offset, kept within ±0.9s of UT1
  • Leap seconds: inserted at June 30 or December 31, announced ~6 months ahead
  • Current offset: TAI = UTC + 37 seconds (as of 2026)
  • Future: leap seconds abolished by 2035 per CGPM 2022 + ITU-R WRC-23 (2023)

How UTC fits into the broader timestamp cluster

UTC is the wall-clock representation of every Unix timestamp — they're two views of the same instant. The cluster's other guides explain the surrounding topics: the Unix epoch itself, how to convert between Unix integers and UTC display, the language-specific recipes, and the production bugs that come from not setting UTC explicitly. Use this article as the link target when someone first asks 'what does UTC mean?'; pair it with the cluster's developer-focused guides when the question turns to 'how do I use it correctly in code?'.

  • What Unix time is: see /blog/epoch-time-explained
  • Convert UTC to a Unix integer: see /blog/date-time-to-epoch
  • Convert a Unix integer to UTC: see /blog/unix-time-to-date
  • Use a converter for timezone-specific output: see /timezone and /timezone/utc
  • JavaScript-specific UTC handling: see /blog/timezone-javascript and /blog/javascript-date-timestamp
  • Storage in UTC: see /blog/unix-timestamp-databases
  • Bugs from non-UTC defaults: see /blog/timestamp-bugs
  • Live UTC clock: see / (the home tool)

FAQ

What is UTC time?
UTC is Coordinated Universal Time — the world's primary time standard, used as the zero-offset reference that every other time zone is computed from. It runs on atomic clocks (TAI) with occasional leap-second adjustments to stay aligned with Earth's rotation.
What does UTC stand for?
Coordinated Universal Time. The acronym is intentionally out of order — it's a compromise between English 'CUT' and French 'TUC' (Temps Universel Coordonné), agreed by the ITU in 1970 so that no language gets either form.
Is UTC the same as GMT?
Effectively yes for civil use — they share the zero offset and the prime-meridian reference. Technically GMT is a time zone (Europe/London standard time); UTC is a time standard maintained by atomic clocks. Wall-clock-wise they match. Many style guides use 'GMT' for British civil time and 'UTC' for everything else.
What time zone is UTC?
UTC is the reference time standard, not strictly a time zone — but it's labelled UTC, GMT, or Z (Zulu) in time displays, and the IANA tz database represents it as the zone name 'UTC'. Places that observe UTC year-round include Iceland, Burkina Faso, parts of Antarctica, and most container hosts.
How do I convert UTC to EST?
Subtract 5 hours from UTC in winter; subtract 4 in summer (when EDT is in effect). 'EST' strictly means UTC-5 year-round, but in common usage 'EST' is often used loosely for Eastern time, which observes DST. For automatic correctness use the IANA name America/New_York, not the abbreviation EST.
Does UTC change for daylight saving time?
No. UTC never changes — it has no DST. The local time zones that reference UTC change by ±1 hour for DST, which is why the difference between UTC and your local time shifts twice a year if you observe daylight saving.
How do I get UTC time in code?
JavaScript: new Date().toISOString() returns ISO 8601 UTC. Python: datetime.now(timezone.utc). Java: Instant.now(). C#: DateTimeOffset.UtcNow. Linux shell: date -u. Postgres: SELECT NOW() AT TIME ZONE 'UTC'. The site's companion guides cover each runtime in depth.
What is the difference between UTC and Unix time?
Unix time is an integer count of seconds since 1970-01-01 00:00:00 UTC; UTC is the wall-clock representation of that instant. The same instant has one Unix timestamp value and one UTC date-time string — they're different encodings of the same moment in time.
Is Unix timestamp always UTC?
Yes. Unix timestamps are counted from the UTC epoch and do not store a timezone. A converter can display the same timestamp in UTC, PST, EST, or any IANA timezone, but the integer still represents one UTC-based instant.
How do I convert epoch to UTC?
Use an epoch-to-date converter and choose UTC as the output timezone. In code, JavaScript uses new Date(seconds * 1000).toISOString(); Python uses datetime.fromtimestamp(seconds, tz=timezone.utc).
Why is UTC also called Z or Zulu?
In the NATO military phonetic alphabet, the letter Z is 'Zulu'. The zero-offset military time zone is the Z zone, which has been adopted in aviation, computing (ISO 8601 trailing Z), and pilot communications as the unambiguous label for UTC.
What is the difference between UTC, TAI, and GPS time?
TAI (International Atomic Time) is the underlying monotonic time scale based on atomic clocks. UTC is TAI minus the current leap-second offset (37 seconds as of 2026). GPS time is TAI minus 19 seconds — close to UTC but doesn't observe leap seconds. All three differ from each other by an integer number of seconds.