Exact ages and date differences worked out on the calendar itself, with no arithmetic on milliseconds, so the answer is the same in every time zone. Shows which days are not 86,400 seconds long.
Initializing in your browser…
Add and subtract durations with the sign kept, so one hour minus two hours is minus one hour. Also moves a time of day forward or back and says how many midnights it crossed.
Exact arithmetic on rationals, with both evaluation conventions named and the precedence table the parser runs on printed on the page.
Add, subtract, multiply, divide, compare and simplify fractions of any size, exactly. Reads mixed numbers and repeating decimals, and gives the decimal expansion with its repeating cycle.
Somebody born on 21 March 1990 opens the tool in Los Angeles. What star sign does it report?
Date of birth
1990-03-21
Result
Aries, and 36 years, 5 months, 16 days
A date field hands over the string "1990-03-21", and `new Date("1990-03-21")` is UTC midnight because that is what the language specifies for the date-only form. Reading it back with the local getters gives 20 March everywhere west of Greenwich, which puts the birthday under Pisces and makes every age a day too many. Nothing here goes through a Date object at all: the date is read as calendar fields and the age comes from those fields with a borrow, so the answer is identical in Auckland, London and Los Angeles. Days are counted as midnights crossed rather than by dividing milliseconds, because in a zone that changes its clocks two days a year are 23 and 25 hours long.
Ages and date differences worked out on the calendar itself, with no arithmetic on milliseconds anywhere. A birthday of 21 March gives Aries in Auckland and in Los Angeles, and the age is the same number in both.
A date on a form is not an instant, and a day is not a fixed number of seconds. Getting either of those wrong is how a date calculator gives an answer that depends on where the reader is sitting.
**A date typed into a date field is read as calendar fields.** Nothing here goes through a Date object. `new Date("1990-03-21")` is UTC midnight, because that is what the language specifies for the date-only form, and reading it back with the local getters gives 20 March everywhere west of Greenwich. That is not a subtle difference: it makes every age a day too many and it puts a 21 March birthday under Pisces instead of Aries.
**Days between two dates are midnights crossed.** They are counted from a day number computed from the calendar (the fixed-date arithmetic of Reingold and Dershowitz), not by dividing a difference in milliseconds by 86,400,000. In any zone that changes its clocks, two days a year are 23 and 25 hours long, and the division comes out short or long across them. There is a whole mode devoted to showing this: pick a month and a zone and it lists which days are not 86,400 seconds. In New York, 8 March 2026 is 82,800 seconds and 1 November is 90,000.
**Years, months and days come from the fields with a borrow**, which is how anybody does it on paper. The borrow takes the length of the month before the later date, which is why 31 January to 1 March is one month and one day.
**A 29 February birthday has no arithmetic answer**, and the tool says so instead of picking. In a common year the anniversary is 28 February in New Zealand and several US states, and 1 March in England and Wales, where a person born on 29 February attains an age at the start of 1 March. Both rules are offered, with the reason for each; the shipped version silently produced 1 March through a Date constructor rolling over.
**The date it is today is stated on the page**, along with the zone it was read in, and it can be pinned in the link so a shared result is reproducible. Alongside all that: total days, weeks and whole months, the weekday you were born on, the next birthday with the age you turn, working days between two dates, a countdown that stays right across a clock change, the star sign with the note that the newspaper dates are a convention rather than astronomy, and the sexagenary animal with the note that its year begins at the lunar new year and not on 1 January.
Enter 1990-03-21. The star sign is Aries. A tool that reads the field with the Date constructor and the local getters reports Pisces everywhere west of Greenwich, because it has silently moved the birthday to 20 March.
Enter today's date. The answer is 0 years, 0 months and 0 days, and 0 total days. A tool that subtracts a UTC midnight from a local now and floors the result says one day.
One month and one day, and 29 days. The borrow takes the length of February, the month before the later date.
Open the day-length mode: that day is 82,800 seconds, which is 23 hours. Dividing a millisecond difference by 86,400,000 across it loses a day.
For a form, an application, or an eligibility rule where a day matters.
With the working-day count alongside the calendar-day count.
The day-length panel usually explains it.
Almost always one of two things. Either it parsed the date field as UTC midnight and read it back with local getters, which moves the date a day west of Greenwich, or it counted days by dividing a millisecond difference by 86,400,000, which is wrong across a clock change. Neither happens here: nothing goes through a Date object and days are counted as midnights.
There is no arithmetic answer. In a common year, New Zealand and several US states treat it as 28 February; England and Wales treat it as 1 March, where a person attains an age at the start of that day. Both rules are offered here and the page says which is in force.
No, and that is the point. The count is the number of midnights crossed, which is the same whatever the clocks did in between. The "how long is a day" mode shows the days that are 23 or 25 hours long so you can see why the alternative goes wrong.
On the calendar fields with a borrow, and the borrow takes the length of the month before the later date. So 31 January to 1 March is one month and one day, and 31 January to 28 February is 28 days rather than a month.
They are the conventional newspaper dates, which is a convention rather than an observation. The sun's actual entry into a sign moves by up to a day between years, so a birthday on a boundary can genuinely fall either side. The page says so, and marks a date that sits on one.
Because the sexagenary year begins at the lunar new year, which falls between 21 January and 20 February, not on 1 January. A birthday before about 20 February may belong to the previous animal, and the page marks those.
Yes. The day count is midnights crossed and the hours, minutes and seconds are the real time left on the chosen zone's clock, so the two are computed separately and the total stays right across a transition.
Every calculation runs locally in your browser. Your numbers and expressions are not transmitted or stored.