I'm building a calendar and I noticed that the date is incorrect on one day of the year.
I wanted to standardize dates to ISO 8601. Let's take 2022-03-27 for example:
const foo = new Date(2022, 2, 27).toISOString()
This gives 2022-03-27T00:00:00.000Z as one would expect.
However, the next day, 2022-03-28:
const bar = new Date(2022, 2, 28).toISOString()
This gives 2022-03-27T23:00:00.000Z - 27th March at 23:00.
Why does this happen?
CodePudding user response:
What's happening is that British Summer Time (Daylight Saving Time, aka DST) is kicking in between your two examples (specifically, it starts at 01:00 on 2022-03-27). toISOString always gives you UTC time (GMT) as you can tell from the Z at the end of the string, but your local time is an hour ahead of UTC after 01:00 on 2022-03-27 until DST ends at 02:00 on 30 October 2022.
In your first example, you're creating a Date with the local time of midnight on 2022-03-27, when your local time is (apparently) GMT 00:00 (like mine here in the UK). So toISOString gives you back 00:00 because your local time is GMT/UTC (that date/time is an hour before DST kicks in).
But in your second example, you're creating a Date in local time at midnight on 2022-03-28, when you're on DST. So you're offset from UTC by an hour (UTC is one hour behind you). Midnight 2022-03-28 UK time is 23:00 2022-03-27 UTC.
I don't know what you want to do with this stuff, but if you want to create a Date for midnight UTC on 2022-03-28, use new Date(Date.UTC(2022, 2, 28)).
