How can I get a date having the format yyyy-mm-dd from an ISO 8601 date?
My 8601 date is
2013-03-10T02:00:00Z
How can I get the following?
2013-03-10
How can I get a date having the format yyyy-mm-dd from an ISO 8601 date?
My 8601 date is
2013-03-10T02:00:00Z
How can I get the following?
2013-03-10
Try this
date = new Date('2013-03-10T02:00:00Z');
date.getFullYear()+'-' + (date.getMonth()+1) + '-'+date.getDate();//prints expected format.
Update:-
As pointed out in comments, I am updating the answer to print leading zeros for date and month if needed.
date = new Date('2013-08-03T02:00:00Z');
year = date.getFullYear();
month = date.getMonth()+1;
dt = date.getDate();
if (dt < 10) {
dt = '0' + dt;
}
if (month < 10) {
month = '0' + month;
}
console.log(year+'-' + month + '-'+dt);
dt = dt.padStart(2, '0'));
and month = month.padStart(2, '0'));
–
Semitics padStart
function. You must use .toString()
first. Either way, yes, I'd also use padStart
turning it into nice oneliner :) Not like it can't be turned into oneliner while operating on integers. –
Piglet d = new Date("25-Aug-2023"); d.toISOString().substr(0,10)
leads to 2023-08-24
–
Remanent Just crop the string:
var date = new Date("2013-03-10T02:00:00Z");
date.toISOString().substring(0, 10);
Or if you need only date out of string.
var strDate = "2013-03-10T02:00:00Z";
strDate.substring(0, 10);
YYYYY-MM-DD
in the year 10000. To avoid this you could split on the T
character instead. (See en.wikipedia.org/wiki/Year_10,000_problem) –
Diffidence new Date
will convert the string to your time zone. To prove it, paste this in the console utc= new Date("2022-04-01T23:59:00Z")
(or T00:00:01Z, depending on your zone) and, unless you are in UTC, the outcome will be a different day. –
Cornered Try this
date = new Date('2013-03-10T02:00:00Z');
date.getFullYear()+'-' + (date.getMonth()+1) + '-'+date.getDate();//prints expected format.
Update:-
As pointed out in comments, I am updating the answer to print leading zeros for date and month if needed.
date = new Date('2013-08-03T02:00:00Z');
year = date.getFullYear();
month = date.getMonth()+1;
dt = date.getDate();
if (dt < 10) {
dt = '0' + dt;
}
if (month < 10) {
month = '0' + month;
}
console.log(year+'-' + month + '-'+dt);
dt = dt.padStart(2, '0'));
and month = month.padStart(2, '0'));
–
Semitics padStart
function. You must use .toString()
first. Either way, yes, I'd also use padStart
turning it into nice oneliner :) Not like it can't be turned into oneliner while operating on integers. –
Piglet d = new Date("25-Aug-2023"); d.toISOString().substr(0,10)
leads to 2023-08-24
–
Remanent This is what I do to get date only:
let isoDate = "2013-03-10T02:00:00Z";
alert(isoDate.split("T")[0]);
let isoDate = "2013-03-10T02:00:00Z";
var d = new Date(isoDate);
d.toLocaleDateString('en-GB'); // dd/mm/yyyy
d.toLocaleDateString('en-US'); // mm/dd/yyyy
Moment.js will handle date formatting for you. Here is how to include it via a JavaScript tag, and then an example of how to use Moment.js to format a date.
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.14.1/moment.min.js"></script>
moment("2013-03-10T02:00:00Z").format("YYYY-MM-DD") // "2013-03-10"
moment
is a pretty huge library to use just for formatting. Rather use date-fns which is much smaller in size and gives the same functionality. –
Hotpress .toISODateString()
, because it's very frequent case... –
Wigan Moment.js is pretty big library to use for a single use case. I recommend using date-fns
instead. It offers basically the most functionality of Moment.js with a much smaller bundle size and many formatting options
.
import format from 'date-fns/format'
format('2013-03-10T02:00:00Z', 'YYYY-MM-DD'); // 2013-03-10, YYYY-MM-dd for 2.x
One thing to note is that, since it's the ISO 8601 time format, the browser generally converts from UTC time to local timezone. Though this is simple use case where you can probably do '2013-03-10T02:00:00Z'.substring(0, 10);
.
For more complex conversions date-fns
is the way to go.
Using toLocaleDateString
with the Swedish locale returns a date in ISO format.
function getISODate(date) {
//return date.toLocaleDateString('fr-CA');
return date.toLocaleDateString('sv-SE');
}
getISODate(new Date()); // '2022-03-24'
P.S. This used to work with in Canadian 'en-CA' locale, but now at least since Feb 2023 Firefox and Chromium v110+ use the US date format. It still works in Canadian 'fr-CA' locale. Not sure which one is more future-proof.
To all who are using split, slice and other string-based attempts to obtain the date, you might set yourself up for timezone related fails!
An ISO-String has Zulu-Timezone and a date according to this timezone, which means, it might use a date a day prior or later to the actual timezone, which you have to take into account in your transformation chain.
See this example:
const timeZoneRelatedDate = new Date(2020, 0, 14, 0, 0);
console.log(timeZoneRelatedDate.toLocaleDateString(
'ja-JP',
{
year: 'numeric',
month: '2-digit',
day: '2-digit'
}
).replace(/\//gi,'-'));
// RESULT: "2020-01-14"
console.log(timeZoneRelatedDate.toISOString());
// RESULT: "2020-01-13T23:00:00.000Z" (for me in UTC+1)
console.log(timeZoneRelatedDate.toISOString().slice(0,10));
// RESULT: "2020-01-13"
toLocaleDateString
with a Canadian locale returns a date in ISO format. e.g. date.toLocaleDateString('en-ca')
. –
Kathiekathleen This will output the date in YYYY-MM-DD format:
let date = new Date();
date = date.toISOString().slice(0,10);
The best way to format is by using toLocaleDateString with options
const options = {year: 'numeric', month: 'numeric', day: 'numeric' };
const date = new Date('2013-03-10T02:00:00Z').toLocaleDateString('en-EN', options)
Check Date section for date options here https://www.w3schools.com/jsref/jsref_tolocalestring.asp
en-EN
with en-GB
This SO link has a list of other locales and their short codes –
Openminded WARNING: Most of these answers are wrong.
That is because toISOString()
always returns the UTC date, not local date. So, for example, if your UTC time is 0500
and your timezone is GMT-0800
, the day returned by toISOString()
will be the UTC day, which will be one day ahead of the local timezone day.
You need to first convert the date to the local date.
const date = new Date();
date.setTime(date.getTime() - date.getTimezoneOffset()*60*1000)
Now date.toISOString()
will always return the proper date according to the local timezone.
But wait, there's more. If we are also using toTimeString()
that will now be wrong because time is now local and toTimeString()
assumes it is UTC and converts it. So we need to first extract toTimeString()
as a variable before doing the conversion.
The Date()
class in javascript is inconsistent because of this and should really be updated to avoid this confusion. The toISOString()
and toTimeString()
methods should both do the same default things with respect to timezone.
date.getTime() + date.getTimezoneOffset() * 60 *1000
See developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… –
Cantoris Pass your date in the date object:
var d = new Date('2013-03-10T02:00:00Z');
d.toLocaleDateString().replace(/\//g, '-');
toLocaleDateString
with a Canadian locale returns a date in ISO format. e.g. date.toLocaleDateString('en-ca')
. –
Kathiekathleen If you have a date object:
let date = new Date()
let result = date.toISOString().split`T`[0]
console.log(result)
or
let date = new Date()
let result = date.toISOString().slice(0, 10)
console.log(result)
If you have the timezone you can do:
const myDate = "2022-10-09T18:30:00.000Z"
const requestTimezone = "Asia/Calcutta";
const newDate = new Date(myDate).toLocaleString("en-CA", {
dateStyle: "short",
timeZone: requestTimezone,
});
console.log(newDate)
>> 2022-10-10
Another outputs:
const myDate = "2022-10-02T21:00:00.000Z"
const requestTimezone = "Asia/Jerusalem";
>> 2022-10-03
const myDate = "2022-09-28T04:00:00.000Z"
const requestTimezone = "America/New_York";
>> 2022-09-28
To extend on rk rk's solution: In case you want the format to include the time, you can add the toTimeString()
to your string, and then strip the GMT part, as follows:
var d = new Date('2013-03-10T02:00:00Z');
var fd = d.toLocaleDateString() + ' ' + d.toTimeString().substring(0, d.toTimeString().indexOf("GMT"));
let dt = new Date('2013-03-10T02:00:00Z');
let dd = dt.getDate();
let mm = dt.getMonth() + 1;
let yyyy = dt.getFullYear();
if (dd<10) {
dd = '0' + dd;
}
if (mm<10) {
mm = '0' + mm;
}
return yyyy + '-' + mm + '-' + dd;
I used this:
HTMLDatetoIsoDate(htmlDate){
let year = Number(htmlDate.toString().substring(0, 4))
let month = Number(htmlDate.toString().substring(5, 7))
let day = Number(htmlDate.toString().substring(8, 10))
return new Date(year, month - 1, day)
}
isoDateToHtmlDate(isoDate){
let date = new Date(isoDate);
let dtString = ''
let monthString = ''
if (date.getDate() < 10) {
dtString = '0' + date.getDate();
} else {
dtString = String(date.getDate())
}
if (date.getMonth()+1 < 10) {
monthString = '0' + Number(date.getMonth()+1);
} else {
monthString = String(date.getMonth()+1);
}
return date.getFullYear()+'-' + monthString + '-'+dtString
}
var d = new Date("Wed Mar 25 2015 05:30:00 GMT+0530 (India Standard Time)");
alert(d.toLocaleDateString());
Many of these answers give potentially misleading output if one is looking for the day in the current timezone.
This function will output the day corresponding with the date's timezone offset:
const adjustDateToLocalTimeZoneDayString = (date?: Date) => {
if (!date) {
return undefined;
}
const dateCopy = new Date(date);
dateCopy.setTime(dateCopy.getTime() - dateCopy.getTimezoneOffset()*60*1000);
return dateCopy.toISOString().split('T')[0];
};
Tests:
it('return correct day even if timezone is included', () => {
// assuming the test is running in EDT timezone
// 11:34pm eastern time would be the next day in GMT
let result = adjustDateToLocalTimeZoneDayString(new Date('Wed Apr 06 2022 23:34:17 GMT-0400'));
// Note: This is probably what a person wants, the date in the current timezone
expect(result).toEqual('2022-04-06');
// 11:34pm zulu time should be the same
result = adjustDateToLocalTimeZoneDayString(new Date('Wed Apr 06 2022 23:34:17 GMT-0000'));
expect(result).toEqual('2022-04-06');
result = adjustDateToLocalTimeZoneDayString(undefined);
expect(result).toBeUndefined();
});
Misleading approach:
To demonstrate the issue with the other answers' direct ISOString().split()
approach, note how the output below differs from what one might expect:
it('demonstrates how the simple ISOString().split() may be misleading', () => {
// Note this is the 7th
expect(new Date('Wed Apr 06 2022 23:34:17 GMT-0400').toISOString().split('T')[0]).toEqual('2022-04-07');
});
You can also use a package like Luxon. With this you can parse the full ISO date (fromISO
) and to with it what you want, for example output to a date only ISO (toISODate
).
const isoDate = DateTime.fromISO('2013-03-10T02:00:00Z').toISODate() // 2013-03-10
Simpler way to get Year Or Month
let isoDateTime = "2013-03-10T02:00:00Z";
console.log(isoDateTime.split("T")[0]); //2013-03-10
Using Split Method
console.log(isoDateTime.split("-")[0]); //2013
console.log(isoDateTime.split("-")[1]); //03
Here is a short javascript code to convert ISO 8601 timestamp to a readable local date and time.
var myDate = new Date('2013-03-10T02:00:00Z').toString();
console.log(myDate);
Outputs: Sun Mar 10 2013 07:45:00 GMT+0545 (Nepal Time)
A shorter version for @Mritunjay's Answer
let d = new Date()
mysql_date = d.toISOString().slice(0, 10);
mysql_date = d.getFullYear()+'-' +(d.getMonth()<9?'0':'') + (d.getMonth()+1) + '-'+ (d.getDate()<10?'0':'') + d.getDate();
Use the below code. It is useful for you.
let currentDate = new Date()
currentDate.toISOString()
© 2022 - 2024 — McMap. All rights reserved.
date.split("T")[0]
would do – Drumstickdate.split("T")[0]
. The output may vary depending on the time portion of the Date. Ex: https://mcmap.net/q/118546/-how-to-convert-an-iso-date-to-the-date-format-yyyy-mm-dd-duplicate – Anthracosis