The Date.parse()
method parses a string representation of a date, and returns the number of milliseconds since January 1, 1970, 00:00:00 UTC or NaN
if the string is unrecognized or, in some cases, contains illegal date values (e.g. 2015-02-31).
It is not recommended to use Date.parse
as until ES5, parsing of strings was entirely implementation dependent. There are still many differences in how different hosts parse date strings, therefore date strings should be manually parsed (a library can help if many different formats are to be accommodated).
Syntax
Direct call:
Date.parse(dateString)
Implicit call:
new Date(dateString)
Parameters
dateString
- A string representing an RFC2822 or ISO 8601 date (other formats may be used, but results may be unexpected).
Return value
A number representing the milliseconds elapsed since January 1, 1970, 00:00:00 UTC and the date obtained by parsing the given string representation of a date. If the argument doesn't represent a valid date, NaN
is returned.
Description
The parse()
method takes a date string (such as "Dec 25, 1995"
) and returns the number of milliseconds since January 1, 1970, 00:00:00 UTC. This function is useful for setting date values based on string values, for example in conjunction with the setTime()
method and the Date
object.
Given a string representing a time, parse()
returns the time value. It accepts the RFC2822 / IETF date syntax (RFC2822 Section 3.3), e.g. "Mon, 25 Dec 1995 13:30:00 GMT"
. It understands the continental US time zone abbreviations, but for general use, use a time zone offset, for example, "Mon, 25 Dec 1995 13:30:00 +0430"
(4 hours, 30 minutes east of the Greenwich meridian).
GMT and UTC are considered equivalent. The local time zone is used to interpret arguments in RFC2822 Section 3.3 format that do not contain time zone information.
Because of the variances in parsing of date strings, it is recommended to always manually parse strings as results are inconsistent, especially across different ECMAScript implementations where strings like "2015-10-12 12:00:00"
may be parsed to as NaN
, UTC or local timezone.
ECMAScript 5 ISO-8601 format support
The date time string may be in ISO 8601 format. For example, "2011-10-10"
(just date) or "2011-10-10T14:48:00"
(date and time) can be passed and parsed. Where the string is ISO 8601 date only, the UTC time zone is used to interpret arguments. If the string is date and time in ISO 8601 format, it will be treated as local.
While time zone specifiers are used during date string parsing to interpret the argument, the value returned is always the number of milliseconds between January 1, 1970 00:00:00 UTC and the point in time represented by the argument or NaN
.
Because parse()
is a static method of Date
, it is called as Date.parse()
rather than as a method of a Date
instance.
Differences in assumed time zone
Given a date string of "March 7, 2014"
, parse()
assumes a local time zone, but given an ISO format such as "2014-03-07"
it will assume a time zone of UTC (ES5 and ECMAScript 2015). Therefore Date
objects produced using those strings may represent different moments in time depending on the version of ECMAScript supported unless the system is set with a local time zone of UTC. This means that two date strings that appear equivalent may result in two different values depending on the format of the string that is being converted.
Fall-back to implementation-specific date formats
The ECMAScript specification states: If the String does not conform to the standard format the function may fall back to any implementation–specific heuristics or implementation–specific parsing algorithm. Unrecognizable strings or dates containing illegal element values in ISO formatted strings shall cause Date.parse()
to return NaN
.
However, invalid values in date strings not recognized as ISO format as defined by ECMA-262 may or may not result in NaN
, depending on the browser and values provided, e.g.:
// Non-ISO string with invalid date values new Date('23/25/2014');
will be treated as a local date of 25 November, 2015 in Firefox 30 and an invalid date in Safari 7. However, if the string is recognized as an ISO format string and it contains invalid values, it will return NaN
in all browsers compliant with ES5 and later:
// ISO string with invalid values new Date('2014-25-23').toISOString(); // returns "RangeError: invalid date" in all es5 compliant browsers
SpiderMonkey's implementation-specific heuristic can be found in jsdate.cpp
. The string "10 06 2014"
is an example of a non–conforming ISO format and thus falls back to a custom routine. See also this rough outline on how the parsing works.
new Date('10 06 2014');
will be treated as a local date of 6 October, 2014 and not 10 June, 2014. Other examples:
new Date('foo-bar 2014').toString(); // returns: "Invalid Date" Date.parse('foo-bar 2014'); // returns: NaN
Examples
Using Date.parse()
If IPOdate
is an existing Date
object, it can be set to August 9, 1995 (local time) as follows:
IPOdate.setTime(Date.parse('Aug 9, 1995'));
Some other examples of parsing non–standard date strings:
Date.parse('Aug 9, 1995');
Returns 807937200000
in time zone GMT-0300, and other values in other time zones, since the string does not specify a time zone and is not ISO format, therefore the time zone defaults to local.
Date.parse('Wed, 09 Aug 1995 00:00:00 GMT');
Returns 807926400000
no matter the local time zone as GMT (UTC) is provided.
Date.parse('Wed, 09 Aug 1995 00:00:00');
Returns 807937200000
in time zone GMT-0300, and other values in other time zones, since there is no time zone specifier in the argument and it is not ISO format, so is treated as local.
Date.parse('Thu, 01 Jan 1970 00:00:00 GMT');
Returns 0
no matter the local time zone as a time zone GMT (UTC) is provided.
Date.parse('Thu, 01 Jan 1970 00:00:00');
Returns 14400000
in time zone GMT-0400, and other values in other time zones, since no time zone is provided and the string is not in ISO format, therefore the local time zone is used.
Date.parse('Thu, 01 Jan 1970 00:00:00 GMT-0400');
Returns 14400000
no matter the local time zone as a time zone GMT (UTC) is provided.
Specifications
Specification | Status | Comment |
---|---|---|
ECMAScript 1st Edition (ECMA-262) | Standard | Initial definition. Implemented in JavaScript 1.0. |
ECMAScript 5.1 (ECMA-262) The definition of 'Date.parse' in that specification. |
Standard | ISO 8601 format added. |
ECMAScript 2015 (6th Edition, ECMA-262) The definition of 'Date.parse' in that specification. |
Standard | |
ECMAScript Latest Draft (ECMA-262) The definition of 'Date.parse' in that specification. |
Draft |
Browser compatibility
The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out https://github.com/mdn/browser-compat-data and send us a pull request.
Feature | Chrome | Firefox | Edge | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|---|
Basic Support | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) |
ISO 8601 format | (Yes) | 4 | ? | 9 | (Yes) | (Yes) |
Feature | Android | Chrome for Android | Edge mobile | Firefox for Android | IE mobile | Opera Android | iOS Safari |
---|---|---|---|---|---|---|---|
Basic Support | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) |
ISO 8601 format | (Yes) | (Yes) | ? | (Yes) | (Yes) | (Yes) | (Yes) |
Compatibility notes
- Firefox 49 (Firefox 49 / Thunderbird 49 / SeaMonkey 2.46) changed the parsing of 2-digit years to be aligned with the Google Chrome browser instead of Internet Explorer. Now, 2-digit years that are less than or equal to
50
are parsed as 21st century years. For example,04/16/17
, previously parsed as April 16, 1917, will be April 16, 2017 now. To avoid any interoperability issues or ambiguous years, it is recommended to use the ISO 8601 format like "2017-04-16" (bug 1265136).