different result for yyyy-mm-dd and yyyy/mm/dd in javascript when passed to new Date
It boils down to how Date.parse()
handles the ISO-8601 date format.
Your first date formatThe 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. The UTC time zone is used to interpret arguments in ISO 8601 format that do not contain time zone information (note that ECMAScript ed 6 draft specifies that date time strings without a time zone are to be treated as local, not UTC)
2015/03/31
is assumed to be March 31st, 2015 at 12am in your current time zone.Your second date format
2015-03-31
is seen as ISO-8601 and is assumed to be March 31st, 2015 at 12am UTC time zone.The "Differences in assumed time zone" heading from the linked documentation goes into a bit more detail:
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. Therefore Date objects produced using those strings will represent different moments in time 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 (this behavior is changed in ECMAScript ed 6 so that both will be treated as local).
Is the Javascript date object always one day off?
Notice that Eastern Daylight Time is -4 hours
and that the hours on the date you're getting back are 20
.
20h + 4h = 24h
which is midnight of 2011-09-24. The date was parsed in UTC (GMT) because you provided a date-only string without any time zone indicator. If you had given a date/time string w/o an indicator instead (new Date("2011-09-24T00:00:00")
), it would have been parsed in your local timezone. (Historically there have been inconsistencies there, not least because the spec changed more than once, but modern browsers should be okay; or you can always include a timezone indicator.)You're getting the right date, you just never specified the correct time zone.
If you need to access the date values, you can use getUTCDate()
or any of the other getUTC*()
functions:
var d,
days;
d = new Date('2011-09-24');
days = ['Sun', 'Mon', 'Tues', 'Wed', 'Thurs', 'Fri', 'Sat'];
console.log(days[d.getUTCDay()]);
Why is YYYY-MM-DD != YYYY/MM/DD
I believe that the difference is caused by Date.parse
adding UTC to one string but not the other, namely: /
is not a legal separator in Date.parse() which means that UTC isn't added to the time once it's parsed. Because '
is a legal separator, it is parsed and then UTC is added to the returned time.
Date.parse
is used by the new Date()
method and its implementation is browser specific, I'm surprised this sort of thing doesn't come up more often.
The specification for Date.parse
says:
So I'd suggest either adding in a timezone manually before you parse, or discarding the time returned byThe String may be interpreted as a local time, a UTC time, or a time in some other time zone, depending on the contents of the String. The function first attempts to parse the format of the String according to the rules called out in Date Time String Format (15.9.1.15). If the String does not conform to that format the function may fall back to any implementation-specific heuristics or implementation-specific date formats.
new Date()
, however that could lead to issues around midnight etc. The safest thing would be to see if you can get the date in a more specific format from both systems, with timezone information. I want to change the date format to yyyy-mm-dd
With PHP get date of today and change format
$origDate = "2019-01-15";
$newDate = date("m-d-Y", strtotime($origDate));
echo $newDate;
Output 01-15-2019
With js var date = new Date();
var year=date.getFullYear();
var month= date.getMonth();
var date=date.getDay();
console.log(` ${day}:${month}:${year}`);
How do I get a date in YYYY-MM-DD format?
Just use the built-in .toISOString()
method like so: toISOString().split('T')[0]
. Simple, clean and all in a single line.
var date = (new Date()).toISOString().split('T')[0];document.getElementById('date').innerHTML = date;
<div id="date"></div>
How to convert dd/mm/yyyy string into JavaScript Date object?
MM/DD/YYYY format
If you have the MM/DD/YYYY
format which is default for JavaScript, you can simply pass your string to Date(string)
constructor. It will parse it for you.
var dateString = "10/23/2015"; // Oct 23
var dateObject = new Date(dateString);
document.body.innerHTML = dateObject.toString();
Related Topics
Why Let and Var Bindings Behave Differently Using Settimeout Function
Event.Path Is Undefined Running in Firefox
How to Filter an Array in JavaScript
How to Add a "Readonly" Attribute to an <Input>
Get Selected HTML in Browser via JavaScript
Create Copy of Multi-Dimensional Array, Not Reference - JavaScript
Why Do I Need to Copy an Array to Use a Method on It
Sending Binary Data in JavaScript Over Http
Getting Access Is Denied Error on IE8
How to Sum the Values of a JavaScript Object
Rails 5: How to Use $(Document).Ready() with Turbo-Links
How to Randomly Generate HTML Hex Color Codes Using JavaScript
What Causes the Error "Can't Execute Code from a Freed Script"
Scope of Default Function Parameters in JavaScript