Convert a Unix epoch timestamp (seconds or milliseconds) into every common human-readable format, or go the other direction: paste a date string and see what the timestamp should be. Useful for debugging API payloads, reading log files, setting cache TTLs, writing database fixtures, and answering “when did this actually happen?” questions without opening a REPL.
What this tool does
Two linked inputs:
- Unix timestamp — a number (seconds or milliseconds since the 1970 epoch) with a unit toggle
- ISO 8601 date — a string like
2026-04-15T12:34:56Z
Edit either side and the other updates to match. The results card below shows the same instant in seven forms (Unix seconds, Unix milliseconds, ISO 8601 UTC, ISO 8601 local, human-readable UTC, human-readable local, and RFC 2822) with a copy button on each row. A “Use current time” button grabs Date.now() and populates both fields with the current instant.
The tool uses JavaScript’s native Date object under the hood, which covers the full range from about 271,821 BCE to 275,760 CE. Any timestamp in that range — including negative values for pre-epoch dates — converts without drama.
Example: debugging an API response
You’re integration-testing a webhook and the server sends you {"created_at": 1776263696}. Paste 1776263696 into the timestamp field, leave the unit on seconds. The tool shows:
- ISO 8601 UTC:
2026-04-15T12:34:56.000Z - Human (UTC):
Wednesday, 15 April 2026 at 12:34:56 UTC - Human (local): the same instant translated to your browser’s timezone
That’s the answer to “when was this webhook event created?” in about two seconds.
Example: generating a test fixture
You’re writing a snapshot test and need a fixed timestamp that represents 2026-04-15 at noon UTC. Paste 2026-04-15T12:00:00Z into the ISO field. The tool shows:
- Unix (seconds):
1776254400 - Unix (ms):
1776254400000
Copy whichever one your fixture uses. No REPL, no new Date(...).getTime() / 1000 math, no off-by-an-hour bug because you forgot to specify the timezone.
Example: the Y2038 boundary
Paste 2147483647 in seconds mode. You get 2038-01-19T03:14:07.000Z — the exact last moment that a signed 32-bit seconds counter can represent. Add one second (paste 2147483648) and you see 2038-01-19T03:14:08.000Z — one second later, which is where legacy 32-bit systems wrap around to a negative number.
The tool itself uses 64-bit floating-point under the hood, so the display is fine on both sides of the boundary. If you’re testing code that might be 32-bit-aware (old C libraries, embedded firmware, some SQL column types), this is how to generate the test inputs.
Seconds vs milliseconds
Use seconds when integrating with:
- Traditional Unix timestamps (POSIX
time(), Unix file mtimes) - Most SQL
TIMESTAMP/BIGINTcolumns that store epoch time - Config files and environment variables
- Go’s
time.Unix(), Python’stime.time(), Ruby’sTime#to_i - Slack, Stripe, and many other webhook timestamps
Use milliseconds when integrating with:
- JavaScript
Date.now()/new Date(ms) - Firebase, MongoDB ISODate, and many JSON APIs from Node backends
- Java
System.currentTimeMillis() - Browser performance APIs (though those are usually relative, not epoch)
The tool shows both in the result card, so you can copy whichever one your target system expects without doing the divide-by-1000 by hand.
UTC vs local time
API responses and database columns almost always store UTC. Human-readable outputs almost always want local time. The tool shows both because you usually need them both at once: “the server logged this at 16:34 UTC — what does that look like on my laptop clock?” is a daily question, and the side-by-side view answers it directly.
Your local offset comes from the browser’s operating system, so it’s automatically correct for daylight saving — whatever offset is active at the moment you load the page is what you get.
What this tool does not do
It doesn’t parse non-ISO date strings — slashes, month names, relative phrases like “yesterday.” If you need that, use a date-parsing library or the browser’s Date.parse() directly (which is stricter than most people think).
It doesn’t account for leap seconds. Unix timestamps traditionally don’t, and neither do most practical systems — leap seconds are either smeared across the day or ignored entirely.
It doesn’t support named timezones like America/New_York in output. The tool only displays the browser’s local zone (whatever that is) alongside UTC. For zone-aware display across multiple named zones, the timezone converter is the right tool; for formatted ISO 8601 strings specifically, the ISO 8601 parser handles input and output.
It doesn’t handle timestamps outside the JavaScript Date range — roughly ±100 million days from the epoch, which is far enough into the past or future that it probably doesn’t matter, but worth knowing if you’re working with geologic time.