Unix Timestamp Converter
Convert a Unix timestamp to every common date format at once, ISO 8601, RFC 2822, UTC, local, and relative time, or turn any date back into epoch seconds and milliseconds.
- Free, no account
- No watermark
- No usage limit
About the Unix Timestamp Converter
Paste an epoch number like 1753104189 and it lays out every common way of writing that instant at once, not the single date string most converters stop at. Relative time comes first, so 3 hours ago or in 5 days tells you where the number sits with no arithmetic. Below that sit ISO 8601 in UTC and in your own zone with the offset, RFC 2822 the way an email or HTTP header wants it, the plain UTC and local readouts, and both epoch units, seconds and milliseconds. Every row has its own copy button. Grab the format your code actually needs and move on. The whole thing runs in your browser, and the only thing that leaves the machine is what you put in a share link yourself: the timestamp you were converting.
How to use
- Decode a number. Drop a timestamp into the Timestamp to date box. It reads seconds versus milliseconds off the digit count, then fills the panel with relative time, ISO 8601, RFC 2822, UTC, local, and both epoch units.
- Copy the one you need. Every row has its own Copy button, so if your API wants ISO 8601 and your log wants epoch seconds, you take each straight from its row without reformatting anything by hand.
- Go the other direction. Set a day and time in the Date to timestamp picker. The same full panel comes back, so you get epoch seconds and milliseconds plus the ISO and RFC strings for that exact moment.
- Hit Use now beside the picker to prefill this instant, then nudge the date or time from there.
- The live count up top ticks the current Unix time every second, a reference number sitting right there to compare against.
- Share it. The Share button copies a link that reopens with your input already converted, which is handy for dropping into a ticket or a chat so a teammate sees the same breakdown you did.
Every format from one paste
The format you need out of a raw epoch is never the one a basic converter hands you. It shows a GMT string when the API wanted ISO 8601, or local time when a mail header needed the +0000 RFC 2822 shape. So you copy the date into a second tool, reformat, and lose two minutes on a thing that should cost none. This panel prints all of them off the one number, and you copy the exact string you were after.
A quick map of what to reach for. ISO 8601 is the one you want inside JSON, a database, or almost any API, because it sorts correctly as plain text and every language ships a parser for it. RFC 2822 is the older email and HTTP shape, Tue, 21 Jul 2026 14:03:09 +0000, still what a Date: header or an RSS feed expects. The relative row, 3 hours ago or in 5 days, is for people, and it doubles as the quickest expiry check you have: paste a token's exp claim, and if the row reads a time in the past, that token is already dead. UTC and local are the readable forms for eyeballing a value, and the two epoch units are there because whatever you are feeding speaks one of them.
The unit is where it breaks
Most epoch bugs come from the unit, not the value. Classic Unix time counts whole seconds. Plenty of modern platforms count milliseconds instead, and JavaScript is the loud one, Date.now() and new Date(n) both work in milliseconds while most databases, APIs, and Unix tools work in seconds. Feed a seconds number to something reading milliseconds and your date lands a few weeks after January 1970. Do the reverse and you get a year in the tens of thousands. The tell is the length of the number, so the converter counts digits for you. Thirteen digits or more and it reads the value as milliseconds, and anything shorter it reads as seconds. That guess is right nearly every time, and on the rare miss the date it shows makes the mismatch plain on sight.
| Value | Digits | Unit |
|---|---|---|
1783238400 |
10 | seconds |
1783238400000 |
13 | milliseconds |
1783238400000000 |
16 | microseconds |
1783238400000000000 |
19 | nanoseconds |
All four rows are the same instant with more zeros stacked on. Seconds and milliseconds get read automatically. Microsecond and nanosecond values (the sixteen and nineteen digit ones out of Postgres or Go's UnixNano) are rarer, and if you land one, trim it to milliseconds first.
JavaScript trips people on this daily. Call new Date(1700000000) and you get a date less than three weeks past the epoch, because the language read 1.7 billion as milliseconds. What you meant was new Date(1700000000 * 1000), which gives you November 2023. The mistake runs both ways, and either way the digit count is what gives it away.
A timestamp has no time zone
A Unix timestamp is one absolute instant anchored to UTC, with no zone baked in. The zone only shows up when you format the number for a human. So 1783238400 has no single wall-clock answer until you say where. That value is 08:00 UTC on 5 July 2026, which is the same moment as 09:00 in London on summer time and 13:45 in Kathmandu.
That is why the panel prints UTC and your local time next to each other. A value that looks wrong is usually just being read in a different zone than the one it was made in, and seeing both together settles it in a second instead of costing you an afternoon. The picker runs the other way, it takes whatever you enter as your computer's local time and converts that to the universal number, which is what you want when you turn "today at 5pm my time" into something to store.
One rule falls out of all this, and it is worth keeping. Store the timestamp, not a local wall-clock string. An instant always refers to the same point in time. Store a local "2:30pm" instead and its meaning shifts the moment daylight saving flips or the user moves to another zone.
Frequently asked questions
Why does the picker give me a different number than another converter?
Because this one reads your date in your local time zone, which is almost always what you want. If the other tool assumed UTC and you sit a few hours off, the two timestamps differ by exactly that offset, and both are correct because each read your date in a different zone. Check the ISO 8601 (local) row here, with its offset, and you can see which interpretation you are looking at.
Can it convert dates before 1970?
Yes. Epoch values go negative, counting backward from the epoch, so -86400 is 31 December 1969. Paste a negative number and every format fills in as normal, which is how you would store a birthday or any pre-1970 event as a timestamp.
What is the Year 2038 problem?
Older systems held Unix time in a signed 32-bit integer that tops out at 2,147,483,647, a ceiling reached at 03:14:07 UTC on 19 January 2038. One second past that the counter overflows and wraps back to a date in 1901. Anything 64-bit is fine for the next few billion years. The real risk is a legacy database column typed as 32-bit INT, so migrate it to a wider type well before the date arrives.
Does Unix time count leap seconds?
No, and it is a genuine quirk. Every Unix day is defined as exactly 86,400 seconds, so when a real leap second gets added, Unix time repeats or smears a second rather than counting the extra one. Ordinary apps never notice. Precision timekeeping is about the only place it bites.
Why do the ISO strings sometimes end in a fraction of a second?
When you paste a millisecond value that is not a whole second, the ISO 8601 rows keep the .SSS part so no precision is dropped. A plain seconds value has nothing after the seconds, so it shows a clean time with no fraction. Same reason the epoch milliseconds row does not always end in three zeros.
Seconds or milliseconds, which should I store?
Whichever your stack already uses, then name the column after it. A field called created_at_ms prevents more late-night debugging sessions than any amount of caution, because the trouble almost always comes from a column that never states its unit, not from either unit being the wrong pick.
Is anything I paste sent to a server?
Not by the conversion. The whole tool runs in your browser and keeps working if you go offline once the page has loaded, so a timestamp pulled straight from production logs stays on your machine while you read it. Share and Embed are the exception, and they are yours to press: both put the timestamp into the address, and an address reaches our server on every open. Read the number and close the tab if it came off something live.