Mixed units? Handled per row.
With Auto detection, every line is classified independently by digit count, so a paste that mixes a ten-digit seconds column from one service with a thirteen-digit milliseconds column from another converts correctly without you splitting the file first. Set the unit explicitly when you know it — that turns off detection and treats every row the same way, which is what you want when a column really is uniform and contains values near the ambiguous 11–12 digit boundary.
Working with Excel and Google Sheets
Copying a spreadsheet column puts one value per line on the clipboard, which is exactly what this page expects — paste straight in. Going the other way, the Text output is tab-separated, so pasting it back into a sheet lands each field in its own column. Use CSV when you are saving to a file, and JSON when the next step is a script rather than a spreadsheet. If you would rather the conversion live in the sheet itself, the Excel and Google Sheets serial-date formulas do both directions in one cell.
If your paste is a two-column CSV, only the first field of each line is converted and the
rest is left alone — so an id,timestamp export does not need pre-processing
if the timestamp comes first.
Failed rows stay in place
A line that cannot be read as an instant renders as a failure where it is, with its original line number intact. That matters when the paste came out of a grep: the row numbers in the table still match the row numbers in your terminal. Blank lines are skipped silently and do not consume a row, but they do not renumber the rows around them either.
The 500-line cap
Parsing runs on the main thread, in your browser, with no upload — which is what keeps it instant and private, but also means a ten-thousand-line paste would freeze the tab. The tool converts the first 500 lines and tells you exactly how many it did not parse, rather than silently truncating. For larger jobs, split the file, or take the snippet below and run it locally.
# One line per timestamp, converted in place
while read -r ts; do
date -u -r "$ts" +"%Y-%m-%dT%H:%M:%SZ"
done < timestamps.txt
Nothing leaves your browser
There is no upload step and no server round-trip: the rows are parsed and formatted by the same code that renders the main converter, running in this tab. Production log exports frequently contain more than timestamps, so this is worth knowing before you paste one into any online tool.
Frequently asked questions
Can I convert a column that mixes seconds and milliseconds?
Yes. With Auto detection, every line is classified independently by digit count, so a paste that mixes a ten-digit seconds column from one service with a thirteen-digit milliseconds column from another converts correctly without splitting the file first. Set the unit explicitly when you already know it — that turns detection off and treats every row the same way, which is what you want when a column really is uniform and its values sit near the ambiguous 11-12 digit boundary.
How many timestamps can I convert at once?
500 lines per paste. Parsing runs on the main thread in your browser with no upload, which is what keeps it instant and private, but also means a ten-thousand-line paste would freeze the tab. The tool converts the first 500 lines and tells you exactly how many it did not parse, rather than silently truncating. For larger jobs, split the file or run the shell snippet above locally.
Do my timestamps get uploaded to a server?
No. There is no upload step and no server round-trip — the rows are parsed and formatted in this tab by the same code that renders the main converter. Production log exports frequently contain more than timestamps, so this is worth knowing before pasting one into any online tool.
How do I paste the results back into Excel or Google Sheets?
Use the Text output: it is tab-separated, so pasting it into a sheet lands each field in its own column. Copying a spreadsheet column the other way puts one value per line on the clipboard, which is exactly what this page expects. Choose CSV when you are saving to a file, and JSON when the next step is a script rather than a spreadsheet.
What happens to rows that cannot be parsed?
A line that cannot be read as an instant renders as a failure where it is, with its original line number intact — so if the paste came out of a grep, the row numbers in the table still match the row numbers in your terminal. Blank lines are skipped silently and do not consume a row, but they do not renumber the rows around them either. If your paste is a two-column CSV, only the first field of each line is converted and the rest is left alone.
Where to go next
Got one odd value rather than a column? Check its unit — the same detector runs there, but with the digit ruler and both readings side by side. If the converted dates come out in 1970, the epoch-zero debugger will name the bug. And any single row here links straight through to the main converter, which shows that instant in seven formats with a live clock. Pasting a column of ISO 8601 or RFC 3339 strings rather than bare numbers? That page explains how the offset on each string is resolved before it becomes an epoch value.