Milliseconds to Date Converter
Read a Unix timestamp in milliseconds as a date, with the sub-second part kept in the ISO 8601 line.
One timestamp or date per line, up to 500.
Paste the code into a Discord message; everyone sees it in their own time zone and language.
Convert this timestamp in your own code.
Convert Epoch Milliseconds to a Date
Most of the time values a front-end developer meets are in milliseconds, because that is what the language hands them: Date.now() counts milliseconds, not seconds. Everything downstream, from log pipelines to database columns, then has to agree on the unit. This page opens the Timestamp Converter with the Unit menu already on Milliseconds so a thirteen-digit number reads correctly the moment you paste it.
The answer appears on four lines at once: the instant in whichever zone is selected at the top right, the same instant in <abbr title="Coordinated Universal Time">UTC, the ISO 8601 form that most APIs want back, and the distance from now in plain words. All of it is computed in the page, so values out of a production log stay on your machine.
Thirteen digits, and when counting them is not enough
Auto-detect works from the digit count and is right for anything dated in this century, but the unit is a property of the system that produced the number, not of the number itself. Pin the Unit menu and the guess disappears. The cost of getting it wrong is not subtle, because each step between units moves the date by three orders of magnitude.
Unit chosen for 1735689600000 | Date it produces | Verdict |
|---|---|---|
| Seconds | 25 October 56971 | Off by a factor of 1000 the wrong way |
| Milliseconds | 1 January 2025, 00:00:00 UTC | What the number means |
| Microseconds | 21 January 1970, 02:08:09 UTC | A near-1970 date is the classic symptom |
| Nanoseconds | 1 January 1970, 00:28:55 UTC | Almost the epoch itself |
A date in the opening days of 1970 or one in the tens of thousands of years is therefore almost never bad data. It is the same integer read under the wrong unit, and the fix is the menu rather than the number.
Where millisecond timestamps come from
- JavaScript:
Date.now()andnew Date().getTime()both return milliseconds, andnew Date(n)expects them, which is why a ten-digit value has to be multiplied by 1000 first. - Java:
System.currentTimeMillis()andInstant.toEpochMilli(). - MongoDB: the BSON date type is a signed 64-bit count of milliseconds since the epoch.
- Kafka, Elasticsearch and most JSON log formats, which inherited the unit from the languages that write into them.
Databases and Unix tooling lean the other way and count in seconds, so the boundary between a JavaScript service and a SQL column is exactly where the factor of 1000 gets lost. Converting a suspect value here and reading the date is the fastest way to see which side dropped it.
Rounding, and converting more than one
Going from milliseconds to seconds is a truncation, so do it in one place and in one direction. Mixing a floor in one service with a round in another produces off-by-one-second differences that only show up when two events land in the same second. The Batch tab under the converter follows the same rule: paste up to 500 lines, and each row gets a Seconds column with the fraction dropped alongside an ISO 8601 column that keeps it, ready to copy as CSV.
Related conversions
For a ten-digit value there is Timestamp to Date, and for the opposite direction Date to Timestamp, which returns both seconds and milliseconds for a date you pick. The current Unix timestamp is the live counter in the toolbar, and Discord timestamps needs the seconds form, which is a common reason to convert down.