marnusw/date-fns-tz

Working with UTC is messed up

bmakan opened this issue · 1 comments

What are the UTC functions supposed to do? Because they don't do what I expect them to. Actually, none of the functions I tried do what is described they should do.

Europe/Bratislava is currently UTC+2.

const isoDate = '2023-04-21 06:04:23';

console.log(zonedTimeToUtc(isoDate , 'Europe/Bratislava'));
Fri Apr 21 2023 06:04:23 GMT+0200 (Central European Summer Time)
// Expected: 2023-04-21 04:04:23
// Reasoning: input is in the specified time zone, so I expect the output to be in the UTC

console.log(utcToZonedTime(isoDate , 'Europe/Bratislava'));
Fri Apr 21 2023 06:04:23 GMT+0200 (Central European Summer Time)
// Expected: 2023-04-21 08:04:23
// Reasoning: input is in UTC, so I expect the output to be in the specified time zone

They both return the exact same date in my local time zone. I understand my local time zone will always be there internally - it's how JS works. But I would expect the date values to be set to either UTC or my target timezone.

So, again, what are these functions supposed to do?

I found the cause of this behavior.

const isoDate = '2023-04-21 06:04:23';

My date here doesn't have the time zone info. It's missing the Z at the end indicating it's in the UTC (as described in ISO 8601). Once I add it, it works as expected.

const isoDate = '2023-04-21 06:04:23Z';
'2023-04-21 06:04:23Z'

utcToZonedTime(isoDate, 'Europe/Bratislava')
Fri Apr 21 2023 08:04:23 GMT+0200 (Central European Summer Time)

utcToZonedTime(isoDate, 'Europe/Athens')
Fri Apr 21 2023 09:04:23 GMT+0200 (Central European Summer Time)

Closing. Hopefully this helps others with the same issue.