Table of Contents
- Creating Date Objects
- Understanding Date-Time Components
- Getting and Setting Date Parts
- Date Parsing
- Date Formatting
- Date Arithmetic
- Time Zones
- Common Pitfalls
- Best Practices
- References
1. Creating Date Objects
The Date object is instantiated with the new Date() constructor. It supports several parameter formats to create dates:
1.1 No Arguments: Current Date/Time
If no arguments are provided, new Date() returns a Date object representing the current date and time in the user’s local time zone.
const now = new Date();
console.log(now); // e.g., "2024-03-15T12:34:56.789Z" (UTC string)
1.2 Timestamp: Milliseconds Since Epoch
A numeric timestamp (milliseconds since the Unix Epoch—January 1, 1970, 00:00:00 UTC) creates a date from that moment.
// January 1, 1970, 00:00:00 UTC (epoch start)
const epochStart = new Date(0);
console.log(epochStart); // "1970-01-01T00:00:00.000Z"
// March 15, 2024 (timestamp for 2024-03-15T00:00:00Z)
const march15 = new Date(1710412800000);
console.log(march15); // "2024-03-15T00:00:00.000Z"
To get the current timestamp, use Date.now():
const currentTimestamp = Date.now(); // e.g., 1710412800000
1.3 Date String
Pass a string representing a date (e.g., ISO 8601, RFC 2822). ISO 8601 strings (YYYY-MM-DDTHH:MM:SSZ) are the most reliable.
// ISO 8601 (recommended)
const isoDate = new Date("2024-03-15T14:30:00Z");
console.log(isoDate); // "2024-03-15T14:30:00.000Z"
// Shorthand ISO (date only)
const dateOnly = new Date("2024-03-15");
console.log(dateOnly); // "2024-03-15T00:00:00.000Z" (UTC midnight)
⚠️ Warning: Non-ISO strings (e.g., "10/05/2023") are parsed inconsistently across browsers (some treat "MM/DD/YYYY", others "DD/MM/YYYY"). Stick to ISO 8601.
1.4 Individual Components
Pass year, month, day, hour, minute, second, millisecond (order matters).
// new Date(year, monthIndex, day, hour, minute, second, millisecond)
const specificDate = new Date(2024, 2, 15, 14, 30, 0);
console.log(specificDate); // "2024-03-15T13:30:00.000Z" (local time → UTC)
⚠️ Critical Note: monthIndex is 0-based (0 = January, 11 = December).
2. Understanding Date-Time Components
Internally, the Date object stores dates as a single numeric value: the number of milliseconds since the Unix Epoch. This timestamp is timezone-agnostic, but methods like toString() convert it to the user’s local time.
3. Getting and Setting Date Parts
Date provides methods to get/set individual components (year, month, day, etc.), in local time or UTC.
3.1 Getting Components
| Method | Description | Example (for 2024-03-15T14:30:00Z) |
|---|---|---|
getFullYear() | 4-digit year (local time) | 2024 |
getMonth() | Month index (0-11, local time) | 2 (March) |
getDate() | Day of the month (1-31, local time) | 15 |
getHours() | Hour (0-23, local time) | 14 (if UTC+0) |
getMinutes() | Minutes (0-59, local time) | 30 |
getSeconds() | Seconds (0-59, local time) | 0 |
getMilliseconds() | Milliseconds (0-999, local time) | 0 |
getDay() | Day of the week (0=Sunday, 6=Saturday, local) | 5 (Friday) |
getTime() | Timestamp (ms since epoch) | 1710455400000 |
UTC Versions: Append UTC to the method name (e.g., getUTCFullYear(), getUTCMonth()).
3.2 Setting Components
Use setX() methods to modify components. They update the Date object and return the new timestamp.
const date = new Date(2024, 2, 15); // March 15, 2024
// Set month to April (index 3)
date.setMonth(3);
console.log(date.getMonth()); // 3 (April)
// Set day to the 20th
date.setDate(20);
console.log(date.getDate()); // 20
⚠️ Edge Cases: Setting values beyond valid ranges auto-corrects. For example:
const date = new Date(2024, 1, 30); // February 30, 2024 (invalid)
console.log(date); // "2024-03-01T13:00:00.000Z" (auto-corrected to March 1)
4. Date Parsing
To convert a string to a Date, use Date.parse() or the Date constructor. Both return a timestamp (or NaN for invalid dates).
const timestamp = Date.parse("2024-03-15T14:30:00Z");
console.log(timestamp); // 1710455400000 (valid)
const invalid = Date.parse("invalid-date");
console.log(invalid); // NaN
Best Practice: Always validate parsed dates:
const dateStr = "2024-03-15";
const date = new Date(dateStr);
if (isNaN(date.getTime())) {
console.error("Invalid date:", dateStr);
}
5. Date Formatting
JavaScript has no built-in “format” method, but Date provides several string conversion methods.
5.1 Basic Formatting
| Method | Output Example |
|---|---|
toString() | ”Fri Mar 15 2024 14:30:00 GMT+0100 (CET)“ |
toISOString() | ”2024-03-15T13:30:00.000Z” (UTC, ISO 8601) |
toUTCString() | ”Fri, 15 Mar 2024 13:30:00 GMT” |
toDateString() | ”Fri Mar 15 2024” |
toTimeString() | ”14:30:00 GMT+0100 (CET)“ |
5.2 Locale-Specific Formatting
Use toLocaleString(), toLocaleDateString(), or toLocaleTimeString() for human-readable, locale-aware formats.
const date = new Date(2024, 2, 15, 14, 30);
// Default locale (user's system settings)
console.log(date.toLocaleString()); // "3/15/2024, 2:30:00 PM" (en-US)
// Specify locale
console.log(date.toLocaleString("de-DE")); // "15.03.2024, 14:30:00" (German)
// Custom options
const options = {
weekday: "long",
year: "numeric",
month: "long",
day: "numeric"
};
console.log(date.toLocaleDateString("en-US", options));
// "Friday, March 15, 2024"
For advanced control, use the Intl.DateTimeFormat API:
const formatter = new Intl.DateTimeFormat("fr-FR", {
year: "numeric",
month: "long",
day: "numeric",
hour: "2-digit",
minute: "2-digit",
timeZone: "America/New_York"
});
console.log(formatter.format(date)); // "15 mars 2024 à 10:30" (Paris time for NYC)
6. Date Arithmetic
To add/subtract days, months, or years, manipulate the timestamp or use setX() methods.
6.1 Adding/Subtracting Days
const today = new Date();
// Add 1 day (using timestamp)
const tomorrow = new Date(today.getTime() + 24 * 60 * 60 * 1000);
// Add 1 day (using setDate()) – better for DST
const tomorrow2 = new Date(today);
tomorrow2.setDate(today.getDate() + 1);
6.2 Adding/Subtracting Months
const date = new Date(2024, 2, 15); // March 15
// Add 1 month
date.setMonth(date.getMonth() + 1);
console.log(date); // April 15
6.3 Calculating Date Differences
const start = new Date(2024, 0, 1); // Jan 1
const end = new Date(2024, 2, 15); // March 15
const diffMs = end - start; // Difference in ms
const diffDays = Math.round(diffMs / (24 * 60 * 60 * 1000));
console.log(diffDays); // 75 days
7. Time Zones
The Date object stores time in UTC but displays it in the user’s local time by default. To work with specific time zones, use toLocaleString() with the timeZone option:
const date = new Date("2024-03-15T14:30:00Z");
// Format in Tokyo time
console.log(date.toLocaleString("en-US", { timeZone: "Asia/Tokyo" }));
// "3/16/2024, 1:30:00 AM"
Common time zone identifiers: "UTC", "America/New_York", "Europe/London", "Asia/Tokyo".
8. Common Pitfalls
- 0-based Months:
new Date(2024, 1, 1)is February 1, not January. - Inconsistent Parsing: Avoid non-ISO strings (e.g.,
"10/05/2023"). - Daylight Saving Time (DST): Adding 24h may skip/duplicate hours. Use
setDate()instead. - 2-Digit Years:
new Date(23, 0, 1)parses as 1923, not 2023. Use 4-digit years.
9. Best Practices
- Use ISO 8601 Strings: For parsing/serialization (e.g.,
"2024-03-15T14:30:00Z"). - Validate Dates: Check
isNaN(date.getTime())after parsing. - Prefer UTC for Storage: Store timestamps or ISO strings (UTC) to avoid timezone issues.
- Use Libraries for Complex Logic: For advanced needs (e.g., time zones, recurrence), use
date-fns,Luxon, ormoment.js(legacy).
10. References
Mastering the Date object unlocks robust date handling in JavaScript. With careful attention to time zones and parsing, you’ll avoid common bugs and build reliable applications.