Skip to main content

How to Convert ISO Strings to and from Date Objects in JavaScript

The ISO 8601 string format (e.g., 2023-10-27T10:00:00.000Z) is the international standard for representing dates and times. It is the recommended format for data interchange in modern applications because it is unambiguous and machine-readable.

This guide will teach you the standard, modern methods for working with these strings in JavaScript. You will learn how to parse an ISO string into a Date object and how to format a Date object back into an ISO string. Most importantly, you will understand the critical concept of UTC vs. local time.

Parsing: Converting an ISO String to a Date Object

The new Date() constructor is specifically designed to parse ISO 8601 strings. This is the most reliable way to create a Date object from a string.

For example, we have a date string from an API and need to convert it into a Date object to work with it in our application.

// Problem: How to convert this ISO string to a Date object?
const isoString = '2023-10-27T10:00:00.000Z';

Solution: simply pass the ISO string directly to the Date constructor.

const isoString = '2023-10-27T10:00:00.000Z';
const dateObject = new Date(isoString);

console.log(dateObject);

Output (The output will vary based on your local timezone):

Fri Oct 27 2023 07:00:00 GMT-0300 (Eastern Daylight Time)
note

JavaScript automatically parses the string and creates a Date object that represents that specific moment in time, adjusted for your local timezone.

Understanding Timezones: The "Z" and its Importance

The Z at the end of an ISO string is critical. It is the zone designator for "Zulu" time, which means UTC (Coordinated Universal Time).

  • With Z: new Date('2023-10-27T10:00:00.000Z') creates a date representing 10:00 AM in the UTC timezone. When you display this date, your browser will automatically convert it to your local time.
  • Without Z: new Date('2023-10-27T10:00:00.000') creates a date representing 10:00 AM in the user's local timezone.

This distinction is crucial for avoiding timezone-related bugs.

// This is 10:00 AM in UTC
const dateUTC = new Date('2023-10-27T10:00:00.000Z');

// This is 10:00 AM in the user's local time
const dateLocal = new Date('2023-10-27T10:00:00.000');

console.log('UTC Time (in UTC):', dateUTC.getUTCHours()); // Output: UTC Time (in UTC): 10
console.log('Local Time (in UTC):', dateLocal.getUTCHours()); // Output: Local Time (in UTC): 10
note

Best Practice: For data consistency, always store and transmit your dates in the full ISO 8601 format with the Z designator.

Formatting: Converting a Date Object to an ISO String

To perform the inverse operation—converting a Date object back into a standardized ISO 8601 string—you use the toISOString() method.

For example, we have a Date object and need to send it to a server in the standard ISO format.

// Problem: How to format this Date object as an ISO string?
const now = new Date();

Solution: the toISOString() method returns a string in the YYYY-MM-DDTHH:mm:ss.sssZ format, always in UTC.

const now = new Date();
const isoString = now.toISOString();

console.log(isoString); // Output: (e.g.) "2023-10-27T13:00:00.000Z"
note

This is the standard and most reliable way to serialize Date objects for storage or transmission.

A Note on Non-Standard Date Strings

The new Date() constructor can be unpredictable when given non-standard date strings (like "10/27/2023" or "October 27, 2023"). Its behavior can vary between browsers and is not recommended.

Best Practice: If you have a date string in a non-standard format, you should manually parse it to create your Date object to ensure reliability.

const dateStr = '10/27/2023';
const [month, day, year] = dateStr.split('/');

// Create the date object using the components.
// Note: The month is 0-indexed (0 for January).
const myDate = new Date(year, month - 1, day);

// Now you can reliably format it.
const isoString = myDate.toISOString();
console.log(isoString); // Output: "2023-10-27T00:00:00.000Z" (varies by timezone)

Conclusion

Working with ISO 8601 date strings in JavaScript is a core skill for any web developer.

  • To parse an ISO string into a Date object, pass it directly to the new Date() constructor.
  • To format a Date object into an ISO string, use the myDate.toISOString() method.
  • Always be mindful of the Z timezone designator. For consistency, it is a best practice to always store and transmit dates in the full UTC format.
  • Avoid passing non-standard strings to the Date constructor; parse them manually for reliable results.