Skip to content

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

Learn how to reliably parse ISO 8601 strings into JavaScript Date objects using new Date() and convert them back with toISOString(), while avoiding timezone pitfalls and non-standard string issues.

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)

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

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"

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.
Navigation