99tools

Date Format Converter

runs in your browser

Paste a date in almost any form and get it in every other: ISO 8601, RFC 2822, HTTP-date, Unix time, SQL, relative, or your own dayjs or strftime pattern.

Day / month

Paste a date in almost any form — ISO 8601, RFC 2822, Unix seconds or milliseconds, a JavaScript Date string, “9 September 2026”, 09/09/2026. Times without an offset are read in the zone above.

Date

Recognised as

The instant, and anything the parser had to assume, appears here.

Formats

Every common format of the date, once one is recognised.

Custom pattern

Dialect

Recognise a date first.

Token cheat sheet
dayjs / momentstrftimeMeaning
YYYY%Yyear, four digits
YY%yyear, two digits
MM / M%mmonth, 01–12 / 1–12
MMM / MMMM%b / %Bmonth name, short / long
DD / D%d / %eday of month
ddd / dddd%a / %Aweekday, short / long
HH / H%Hhour, 24-hour
hh / h%Ihour, 12-hour
mm%Mminute
ss%Ssecond
SSS%Lmilliseconds
A / a%p / %PAM/PM
Z / ZZ%zoffset +05:30 / +0530
%Zzone abbreviation
X / x%sUnix seconds / milliseconds
[text]%%literal text / a percent sign

about this tool

What it reads

The parser is written down rather than borrowed from new Date(string), whose behaviour outside ISO 8601 differs between browsers. It recognises, in this order: Unix time (seconds, milliseconds, microseconds or nanoseconds, told apart by digit count); ISO 8601 and RFC 3339 in extended or basic form, with or without fractional seconds and an offset; RFC 2822 and the HTTP-date form, including the obsolete zone names the RFC lists (EST, GMT); JavaScript's Date.toString() output; written dates in either order ("9 September 2026", "Sep 9, 2026 at 2:30 pm", with ordinals and weekdays); and numeric dates with /, . or -. It tells you which one it matched.

What it has to assume

Two things a string cannot say for itself, and the tool says for it:

  • The zone of an offset-less time. "2026-09-09 14:30" is a wall-clock reading, not an instant. It is read in the zone you choose above the input, and the note under the result says so. A date with no time is midnight in that zone. A time that falls in a daylight-saving gap is moved forward, and one that occurs twice takes the first occurrence, each with a note.
  • The order of numeric dates. 25/12/2026 is unambiguous; 09/03/2026 is not. When a number exceeds 12 the order is obvious; otherwise the tool reads day first, says it guessed, and the switch lets you choose month first. Two-digit years follow RFC 2822's rule: 00–49 is this century, 50–99 the last.

What it writes

Every common form at once, in the zone you pick: ISO 8601 in UTC and in the zone, RFC 2822, HTTP-date (always GMT, as RFC 7231 requires), Unix seconds and milliseconds, SQL, date and time alone, a long form, day-first and month-first, 12-hour, and a relative phrase ("3 hours ago"). The pattern that produces each is shown beside it, and every machine form round-trips through the parser to the same second — a test says so.

The custom pattern takes either dialect people paste from code: dayjs and moment tokens (YYYY-MM-DD HH:mm:ss Z, with [brackets] for literal text) or strftime (%Y-%m-%d %H:%M:%S %z). The cheat sheet lists both side by side.

Limits

No natural language ("next Tuesday", "in three days"); no ISO week dates or ordinal dates (2026-W37-3, 2026-252); no leap seconds (23:59:60 is out of range, as it is for every JavaScript date). Zone abbreviations on output are the browser's, so ambiguous ones such as IST appear as an offset. Month and weekday names are English.

For epoch values specifically, the Unix timestamp converter detects seconds, milliseconds and microseconds for you. To measure the gap between two dates once parsed, date difference & duration.

questions

Why does it ask which zone to read the time in?
Because “2026-09-09 14:30” names a wall-clock time and not an instant: it is a different moment in Kolkata than in London. A date with its own offset (+05:30, Z, GMT) needs no help; one without is read in the zone you choose, and the tool says so.
Is 09/03/2026 the 9th of March or the 3rd of September?
Nobody can tell from the string. When one number is over 12 the order is obvious and the tool uses it; otherwise it reads day first and tells you it guessed, and the switch above the input lets you say month first. Unambiguous forms — ISO 8601 or a month name — avoid the question.
Why not just use new Date(string)?
Outside ISO 8601, what JavaScript makes of a string is left to each browser, and they disagree. This parser is written down, so the same text means the same instant everywhere, and it can explain what it recognised and what it assumed.
How does it know whether a number is seconds or milliseconds?
By length: up to eleven digits is seconds, twelve to fourteen is milliseconds, up to seventeen is microseconds, and beyond that nanoseconds. It says which it chose. A current time is ten digits in seconds and thirteen in milliseconds.
Which format tokens work in the custom pattern?
The dayjs and moment set — YYYY, MM, DD, HH, mm, ss, SSS, ddd, MMMM, A, Z and so on, with square brackets for literal text — or the common strftime codes from %Y to %s. The cheat sheet under the pattern lists both side by side.