The bug that ships every spring and fall
A meeting scheduled for "9:00" shows up an hour off for half your team. A log entry claims a request finished before it started. A cron job that runs "every night at 2 AM" silently fires twice, or not at all, on one weekend in March. Almost every one of these bugs traces back to the same root cause: someone treated a time zone like a fact instead of a moving target, and confused a display label with the underlying instant.
If you build software with anyone in another city, this is not a corner case. It is a tax you pay until you understand three ideas clearly: what UTC actually is, how GMT differs from it, and how your local clock relates to both. Get those straight and most "time zone bugs" stop being mysterious.
This guide walks through all three in plain language, with concrete examples, and shows you how to convert between zones without doing fragile arithmetic in your head.
UTC is a standard, not a time zone
UTC stands for Coordinated Universal Time. The most important thing to know about it is that it is not a time zone at all — it is the global time standard that every time zone is defined against. Think of it the way you think of the meter: nobody lives "in" the meter, but every length on Earth is measured relative to it.
UTC is kept by a worldwide network of atomic clocks, coordinated by international timekeeping bodies. That atomic basis is why it is extraordinarily stable and precise, accurate far beyond anything you need for scheduling a call or timestamping a log line.
Two consequences follow, and both matter in practice. First, UTC never observes daylight saving time — it does not "spring forward" or "fall back," ever. It is the fixed reference that DST rules are applied on top of. Second, because it is a standard rather than a place, UTC is the same instant everywhere on the planet at once. When it is 14:30 UTC, it is 14:30 UTC in Tokyo, Toronto, and Cape Town simultaneously — only the local labels differ.
GMT is a time zone that usually reads the same
Greenwich Mean Time (GMT) is where a lot of the confusion starts, because in everyday use GMT and UTC show the identical clock time. If a website says "6:00 PM GMT" and another says "18:00 UTC," they mean the same wall-clock moment. So why keep two names?
The difference is conceptual, and it comes down to category. GMT is a time zone — the zone at UTC+0, historically tied to the Royal Observatory in Greenwich, London, and originally defined by astronomical observation of the Sun crossing the Greenwich meridian. UTC is a standard defined by atomic clocks. GMT is a label a region can sit in; UTC is the yardstick that label is measured against.
There is a practical wrinkle, too. The United Kingdom uses GMT only in winter. In summer the UK shifts to British Summer Time (BST), which is UTC+1. So a British colleague who says "I'm on GMT" in July is technically an hour off — they mean BST. This is exactly why engineers prefer to say "UTC": it is unambiguous and never shifts. Use GMT when you mean the zone; use UTC when you mean the fixed reference.
Your local time is just UTC plus or minus an offset
Every local time on Earth can be written as UTC plus or minus an offset. That offset is the whole story of "what time is it here."
Some regions are simple. India runs on UTC+5:30 year-round and does not observe daylight saving, so the offset never changes — 12:00 UTC is always 17:30 in Mumbai. Note the half-hour, too: not every offset is a whole number of hours. Nepal is even stranger at UTC+5:45.
Many regions are not simple, because of DST. New York sits at UTC−5 in winter (Eastern Standard Time) but shifts to UTC−4 in summer (Eastern Daylight Time). That means the same city has a different offset depending on the date. This is the trap: you cannot store "New York is UTC−5" as a fixed fact, because for roughly two-thirds of the year it is wrong. The offset depends on both the location and the moment in time.
This is also why converting between two arbitrary cities by hand is so error-prone. To go from São Paulo to Berlin you need each city's offset on that specific date, accounting for whether either one is currently observing DST — and their DST periods do not even line up, since seasons are reversed across the equator.
Why servers, logs, and databases store everything in UTC
There is a near-universal rule in backend engineering: store time in UTC, convert to local only when you display it to a human. Once you understand offsets, the reason is obvious.
Imagine an app with users in London, Chicago, and Sydney. If each server or record saved time in its own local zone, comparing two events would mean untangling three different offsets — and remembering which ones had DST active on the relevant date. Sorting log lines chronologically would be a nightmare. Storing everything in UTC makes every timestamp directly comparable: the same instant is written the same way regardless of where it was created, and sorting "just works."
The display layer is where local time belongs. The server records that an order was placed at 20:15 UTC; the London user sees 21:15 (BST), the Chicago user sees 15:15 (CDT), and the Sydney user sees the next morning. One stored truth, many local presentations. If you take one habit from this article, take this one: keep UTC on the inside, and translate to local time only at the very edge, in front of the user.
ISO 8601 and the meaning of that trailing Z
To store and exchange UTC cleanly, the world agreed on a format: ISO 8601. You have seen it in API responses and database columns:
2026-08-25T14:30:00Z
Read left to right, it is date (2026-08-25), a T separator, time (14:30:00), and a trailing Z. That Z is the key. It is pronounced "Zulu" (the NATO phonetic letter for Z) and it means UTC — zero offset. So the string above is "14:30 UTC on 25 August 2026," unambiguous anywhere on Earth.
A timestamp can also carry an explicit offset instead of Z. "2026-08-25T10:30:00-04:00" is the same instant expressed in New York's summer time — 14:30 UTC minus four hours. Both forms describe one identical moment; they just wear different labels. When you send times over an API, always include the Z or the offset. A bare "2026-08-25 14:30:00" with no zone information is the single most common source of time bugs, because every system that reads it is free to guess a different zone.
Also worth knowing: a Unix timestamp (seconds since 1 January 1970 UTC) is another zone-free way to store an instant. If you work with those, see our guide to Unix timestamp and epoch time.
How to convert between zones without breaking things
The safe mental model for any conversion is a two-step hop through UTC: take the source local time, convert it to UTC using the source zone's offset for that date, then convert UTC to the target zone using the target's offset for that date. Never subtract one city's offset from another's directly — that shortcut ignores DST and the mismatch of when each region changes clocks.
A few rules that prevent most mistakes: always ask "what is the offset on this specific date," not "what is the offset for this city." Remember that Northern and Southern Hemisphere DST run in opposite seasons, so the gap between two cities can change by a full hour twice a year. And be careful with the DST transition itself — when clocks "fall back," one local hour repeats, and when they "spring forward," one local hour never happens at all, which is exactly why a 2 AM job can misfire.
Rather than do this arithmetic by hand, let a tool that already knows every zone's DST rules do it for you. Our time converter converts a time from one zone to another, and translates between UTC timestamps and human-readable local times, entirely in your browser — your dates never leave your machine. It is built for exactly the São-Paulo-to-Berlin problem where hand math falls apart. If your task is counting elapsed days rather than converting a moment, our guide on how to calculate days between dates covers that instead.
Bottom line: UTC is the fixed standard, GMT is a zone that usually reads the same but drifts with British summer time, and your local time is UTC plus a date-dependent offset. Store UTC, display local, label your timestamps with a Z or an offset — and when you need to convert, reach for the time converter instead of trusting mental arithmetic.
Frequently Asked Questions
Is UTC the same as GMT?
In everyday use they show the identical clock time, so "18:00 UTC" and "18:00 GMT" mean the same moment. But they are different categories: UTC is a precise time standard based on atomic clocks, while GMT is a time zone (UTC+0) historically defined by astronomy. The UK also shifts to BST (UTC+1) in summer, so GMT is not always the local UK time.
Why does UTC never change for daylight saving time?
UTC is the fixed reference that daylight saving rules are applied on top of, not a place that observes them. DST is a local decision to shift a region's clocks forward and back; UTC is the unchanging standard those shifts are measured against. That stability is exactly why servers and APIs store time in UTC — it removes the moving target.
What does the Z mean in a timestamp like 2026-08-25T14:30:00Z?
The trailing Z marks the time as UTC with zero offset. It is pronounced "Zulu," the NATO phonetic letter for Z, and is part of the ISO 8601 format. It makes the timestamp unambiguous worldwide. An explicit offset such as -04:00 does the same job for a specific zone; a timestamp with no Z and no offset is the common cause of bugs.
Why do developers store time in UTC instead of local time?
Storing every timestamp in UTC makes them directly comparable and correctly sortable, regardless of where each event happened or whether DST was active. Local offsets change by date and differ by region, so mixing them makes comparisons unreliable. The rule of thumb is: store UTC internally, and convert to the user's local time only at the display layer.
How do I correctly convert a time from one zone to another?
Convert the source local time to UTC using the source zone's offset for that specific date, then convert UTC to the target zone using its offset for that date. Never subtract one city's offset from another directly, because that ignores DST and mismatched transition dates. A tool like our time converter applies each zone's current rules automatically.

