209

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
Flip
  • 6,233
  • 7
  • 46
  • 75
Neeraj
  • 8,625
  • 18
  • 60
  • 89
  • 1
    possible duplicate of [Where can I find documentation on formatting a date in JavaScript](http://stackoverflow.com/questions/1056728/where-can-i-find-documentation-on-formatting-a-date-in-javascript) – bPratik Aug 06 '14 at 11:40
  • 32
    `date.split("T")[0]` would do – Aravindh Gopi Dec 23 '17 at 13:06
  • Beware `date.split("T")[0]`. The output may vary depending on the time portion of the Date. Ex: https://stackoverflow.com/a/71773898/101095 – Cuga Apr 07 '22 at 15:19

26 Answers26

240

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);
Captain Sparrow
  • 1,114
  • 17
  • 26
DriveByPoster
  • 2,465
  • 2
  • 9
  • 2
  • 3
    I think this is the easiest and most elegant solution from them all but is here any downfall for this? – Aida_Aida Mar 14 '17 at 11:04
  • 57
    @Aida_Aida The only issue I can think of is that if your code deals with geoloical-scale time at least 8000 years in the future, your code could break because the format will be `YYYYY-MM-DD` in the year 10000. To avoid this you could split on the `T` character instead. (See https://en.wikipedia.org/wiki/Year_10,000_problem) – apsillers Oct 12 '17 at 14:01
  • 35
    This way won't handle timezones correctly since the ISOString is UTC but the Date object is local. You have to take this in consideration. – Guillaume F. Apr 04 '19 at 10:45
  • 4
    @GuillaumeF. an important consideration but it does comply with OP's requirements – jamesjansson Sep 06 '19 at 06:56
  • 1
    I can't fathom why the string should be parsed to a Date. The *substring* option seems to be the simplest answer. – RobG Sep 10 '19 at 11:51
  • I was just looking for a simple answer for my particular problem so its a +1 from me – markc Jan 29 '20 at 13:00
  • Simple and concise! – kingisaac95 Jul 31 '20 at 11:32
  • The first option does handle time zones since ISO String is in UTC and `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. – daniel p Apr 01 '22 at 04:10
164

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);
Mritunjay
  • 25,338
  • 7
  • 55
  • 68
  • 20
    Note, I don't think this will print a leading zero for day or month – user3413723 Jan 23 '15 at 07:14
  • 3
    Agree with @user3413723 this doesn't answer the question because it removes leading 0 therefore doesn't meet the requirements of YYYY-MM-DD format – James Murphy Apr 01 '15 at 09:14
  • This is longer and more typo-prone compared to the answer by DriveByPoster. But I'll not give a downvote because it is more language-agnostic. It just doesn't use the simple tools at our disposal. – RoboticRenaissance Mar 01 '19 at 17:43
  • sir can you please tell me how to pass 2013 3 1 this format date in new Date(date) – Kapil Soni Jul 23 '20 at 07:07
  • 5
    Instead of two IFs, you can simply use `dt = dt.padStart(2, '0'));` and `month = month.padStart(2, '0'));` – Avatar Jan 25 '21 at 15:33
  • 2
    @Avatar close, but that won't work. your variables are numbers, so they don't have `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. – Soul Reaver May 10 '21 at 11:56
  • @RoboticRenaissance In a lot of normal uses that answer gives the wrong result. In London, for example, with daylight saving: ```d = new Date("25-Aug-2023"); d.toISOString().substr(0,10)``` leads to ```2023-08-24``` – havlock Aug 25 '23 at 16:15
101

You could checkout date-fns or Day.js for nice date manipulation, including formatting as YYYY-MM-DD.

Or just extract the first part of your ISO string, it already contains what you want:

"2013-03-10T02:00:00Z".slice(0, 10) // "2013-03-10"
"2013-03-10T02:00:00Z".split("T")[0] // "2013-03-10"
Antoine
  • 5,504
  • 5
  • 33
  • 54
34

This is what I do to get date only:

let isoDate = "2013-03-10T02:00:00Z";

alert(isoDate.split("T")[0]);
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Aravindh Gopi
  • 2,083
  • 28
  • 36
  • 3
    This is the first answer to actually propose the split() idea as answer answer as far as I can tell and I like that solution for the effort vs reliability vs effectively factor though I use moment() everywhere I can though. – rainabba May 25 '18 at 22:00
  • 2
    toISOString uses UTC, which will produce the wrong local date for the period of the local timezone offset from midnight. – RobG – Michael Dimmitt Feb 13 '20 at 15:16
27

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
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Ammar H Alshaar
  • 303
  • 3
  • 4
22

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"
Elijah
  • 8,381
  • 2
  • 55
  • 49
  • 2
    While this code snippet may solve the question, [including an explanation](//meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) really helps to improve the quality of your post. Remember that you are answering the question for readers in the future, and those people might not know the reasons for your code suggestion. Please also try not to crowd your code with explanatory comments, as this reduces the readability of both the code and the explanations! – Blue Jul 23 '16 at 22:26
  • 4
    `moment` is a pretty huge library to use just for formatting. Rather use [date-fns](https://date-fns.org/v1.28.5/docs/format) which is much smaller in size and gives the same functionality. – Hozefa Sep 21 '17 at 23:27
  • @Hozefa, then answer the OP question with your solution. – Elijah Sep 22 '17 at 02:24
  • I wish moment had some function like `.toISODateString()`, because it's very frequent case... – Lev Lukomsky Dec 13 '18 at 15:22
  • 1
    moment is deprecated. even moment.js recommend to use another time libs as alternative.https://momentjs.com/docs/#/-project-status/ – Logan Lee Apr 04 '21 at 17:36
16

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.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Hozefa
  • 1,676
  • 6
  • 22
  • 34
13

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.

Eugene Ryabtsev
  • 2,232
  • 1
  • 23
  • 37
naturallyfoster
  • 389
  • 1
  • 4
  • 15
10

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"
Jook
  • 4,564
  • 3
  • 26
  • 53
8

Use:

new Date().toISOString().substring(0, 10);
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Ankita
  • 289
  • 4
  • 16
6

This will output the date in YYYY-MM-DD format:

let date = new Date();
date = date.toISOString().slice(0,10);
sebhs
  • 133
  • 1
  • 4
  • I dont know why this is not getting more votes, it worked perfectly, and answered the question with minimal effort – Wolfiebae Jul 02 '20 at 02:36
  • 2
    This solution fails to properly handle timezones and will lead to unexpected output in many cases. – inopinatus Feb 05 '21 at 07:45
6

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

  • nice solution but mainly for amercian's i'm afraid us brits get '3/10/2013' "new Date('2013-03-10T02:00:00Z').toLocaleDateString('en-EN', {year: 'numeric', month: 'numeric', day: 'numeric' }) === '3/10/2013'" – aqm Oct 15 '21 at 07:54
  • 2
    @aqm you can replace `en-EN` with `en-GB` This [SO link](https://stackoverflow.com/questions/3191664/list-of-all-locales-and-their-short-codes) has a list of other locales and their short codes – BrunoElo Dec 04 '21 at 17:10
4

Pass your date in the date object:

var d = new Date('2013-03-10T02:00:00Z');
d.toLocaleDateString().replace(/\//g, '-');
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
rk rk
  • 314
  • 1
  • 8
3

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)
  • 2
    *toISOString* uses UTC, which will produce the wrong local date for the period of the local timezone offset from midnight. – RobG Sep 10 '19 at 11:48
3

A better version of answer by @Hozefa.

If you have date-fns installed, you could use formatISO function

const date = new Date(2019, 0, 2)
import { formatISO } from 'date-fns'
formatISO(date, { representation: 'date' }) // '2019-01-02' string
Alex Antonov
  • 14,134
  • 7
  • 65
  • 142
3

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
Pablo
  • 643
  • 9
  • 12
3

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.

fred
  • 1,146
  • 11
  • 16
  • I think it should be `date.getTime() + date.getTimezoneOffset() * 60 *1000` See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getTimezoneOffset#negative_values_and_positive_values – danielperaza Apr 03 '23 at 21:13
2

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"));
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Airwavezx
  • 323
  • 1
  • 9
0
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;
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
MemoryLeak
  • 485
  • 3
  • 8
  • 20
0

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
}
Alan
  • 9,167
  • 4
  • 52
  • 70
0

    var d = new Date("Wed Mar 25 2015 05:30:00 GMT+0530 (India Standard Time)");
    alert(d.toLocaleDateString());
Suraj Rao
  • 29,388
  • 11
  • 94
  • 103
Abilash Raghu
  • 383
  • 3
  • 8
0

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');
});
Cuga
  • 17,668
  • 31
  • 111
  • 166
-1

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
Surya R Praveen
  • 3,393
  • 1
  • 24
  • 25
-1

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)

Albert Einstein
  • 7,472
  • 8
  • 36
  • 71
Nabin Poudel
  • 59
  • 1
  • 6
-2

$moment(date).format("YYYY-MM-DD")

reza.ansarirad
  • 197
  • 1
  • 4
-6

Use the below code. It is useful for you.

let currentDate = new Date()
currentDate.toISOString()
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131