Skip to main content

Command Palette

Search for a command to run...

JavaScript Dates & Timezones – Study Material

Published
4 min read

This material covers how to handle dates in frontend applications, how to interpret backend data, and why things like ISO, UTC, and Intl.DateTimeFormat work the way they do.


1️⃣ Understanding JavaScript Date objects

const now = new Date();
console.log(now); // Example: 2025-12-26T12:03:19.479Z
console.log(typeof now); // "object"

Key points:

  • now is a Date object, not a string.

  • Internally, it stores UTC milliseconds since the Unix epoch (1970-01-01T00:00:00 UTC).

  • The console shows a string, but that is environment-dependent. Different browsers or consoles may display it differently.

  • Important: the Date object has no inherent timezone. Timezone is applied only during formatting.

Mental model

[UTC timestamp in milliseconds]
          ↓
Formatting (toString, toLocaleString, Intl)

2️⃣ Converting Date to ISO string (backend → frontend)

const utcString = now.toISOString();
console.log(utcString); // 2025-12-26T12:03:19.479Z
console.log(typeof utcString); // "string"

Why ISO?

  • Human-readable & standard format

  • Explicit UTC (Z suffix)

  • Guaranteed parsable by JavaScript

  • Language-agnostic and transport-safe

Rule: Send ISO strings, not local-formatted strings, from backend.


3️⃣ Parsing ISO string back in frontend

const date = new Date(utcString);
console.log(date);
console.log(typeof date); // "object"
  • Parsing is handled by JavaScript engine

  • Produces a Date object storing UTC internally

  • Console output may look like ISO or local time — this is just representation


4️⃣ Displaying date/time to the user

Use Intl.DateTimeFormat for proper formatting:

const formatted = new Intl.DateTimeFormat(navigator.language, {
  dateStyle: "medium",
  timeStyle: "short",
}).format(date);

console.log(formatted); 
// Example (US): "Dec 26, 2025, 1:03 PM"
// Example (Norway): "26 Dec 2025, 13:03"

Key points:

  • Locale: navigator.language → user’s language and regional formatting

  • Timezone: Defaults to user system timezone

  • Handles DST, offsets, and user preferences automatically


5️⃣ Displaying with specific locales

const england = new Intl.DateTimeFormat("en-GB", { dateStyle: "medium" }).format(date);
console.log(england); // "26 Dec 2025" (day before month)

const us = new Intl.DateTimeFormat("en-US", { dateStyle: "medium" }).format(date);
console.log(us); // "Dec 26, 2025" (month before day)
  • Locale controls format and language, not the clock time

  • Timezone defaults to user system unless specified


6️⃣ Explicit timezone targeting

UK audience (London)

const ukTime = new Intl.DateTimeFormat("en-GB", {
  timeZone: "Europe/London",
  dateStyle: "medium",
  timeStyle: "short",
}).format(date);
console.log(ukTime); // 26 Dec 2025, 10:15

US audience (New York)

const usTime = new Intl.DateTimeFormat("en-US", {
  timeZone: "America/New_York",
  dateStyle: "medium",
  timeStyle: "short",
}).format(date);
console.log(usTime); // Dec 26, 2025, 5:15 AM

India audience (IST)

const indiaTime = new Intl.DateTimeFormat("en-IN", {
  timeZone: "Asia/Kolkata",
  dateStyle: "medium",
  timeStyle: "short",
}).format(date);
console.log(indiaTime); // 26-Dec-2025, 3:45 pm

Key idea:

  • Timezone → determines the actual hour/minute

  • Locale → determines how it is displayed (language, order, punctuation)

  • You can mix and match intentionally


7️⃣ Why we don’t send formatted dates from backend

  • Backend should always send ISO UTC strings (or epoch numbers if needed)

  • Frontend handles human-readable formatting using Intl

  • Keeps responsibilities clean:

    | Layer | Responsibility | | --- | --- | | Backend | Store UTC timestamp | | Transport | ISO 8601 string | | Frontend | Parse & format for display | | Intl / OS | Locale + timezone rules |


8️⃣ Final mental model

Database          → stores UTC instant
Backend           → sends ISO 8601 string
JS engine         → parses string → Date object (UTC milliseconds)
Intl.DateTimeFormat → formats Date object → human-readable string

Rule of thumb:

  • Epoch/UTC → computation

  • ISO string → transport

  • Intl → presentation

  • Locale → language & format

  • Timezone → clock


✅ Key Takeaways

  1. Date objects store UTC internally, console output may be misleading

  2. Always send ISO strings from backend

  3. Always parse ISO strings into Date objects in frontend

  4. Use Intl.DateTimeFormat to handle locale and timezone formatting

  5. Timezone and locale are independent

  6. Only convert to human-readable formats at the UI layer