Concepts & human language

What is "a date"?

A calendar day — birthday, civil date, contextual — and why it isn't a point in time.

A date is a civil calendar day: a (year, month, day) triple in some calendar system, such as 2026-06-05 in the Gregorian calendar. It is emphatically NOT a point in time. June 5 begins at midnight, but midnight happens at different absolute instants in different time zones — so the same date corresponds to a 48-hour-wide band of possible instants when you span the entire globe.

This matters for any date that is inherently human-centric rather than physics-centric. A birthday, an anniversary, a public holiday, or a contract expiry date is a civil date: it belongs to a calendar, not to an absolute position on the timeline. If you fly from Tokyo to Los Angeles, you do not retroactively shift your birthday by -17 hours.

“Today” depends on who is asking

“Today” is observer-relative. A server running in UTC may report a different calendar date than the user’s browser sitting in UTC−11. Any feature that displays or operates on “today’s date” must use the user’s local date, not the server’s UTC date.

Pitfall: Storing a date as a UTC midnight timestamp (e.g. 2026-06-05T00:00:00Z) and then deriving the calendar day by converting to local time. In a timezone west of UTC, midnight UTC on June 5 is still June 4 locally, so your stored “date” and your displayed date diverge.

Go deeper: date arithmetic vs instant arithmetic

Subtracting two dates gives a count of whole calendar days, which is entirely distinct from subtracting two instants.

  • 2026-06-06 − 2026-06-05 = 1 day — always, regardless of DST.
  • 2026-06-06T00:00:00 Europe/London − 2026-06-05T00:00:00 Europe/London — this is also 24 hours in summer, because no DST transition falls between these two midnights — but see DST & the edges for how DST can make a calendar day only 23 or 25 hours long.

Languages and databases expose separate types for these two operations. Python’s datetime.date vs datetime.datetime, PostgreSQL’s date vs timestamp with time zone, and JavaScript’s (lack of a native LocalDate) are all expressions of this distinction.

For the deeper reason a date is not an instant, see Instant vs civil time and Time zones vs offsets.


← Back to all topics