Home > OS >  dayjs format method returns one day off and gives me a wrong date
dayjs format method returns one day off and gives me a wrong date

Time:12-01

When I fetch data from my PostgreSQL database, it comes in the following format: 2022-11-30T21:00:00.000Z and it's not a string; it's in the form of a date object.

The library that I'm using to work with dates is dayjs. So here is the issue.

When I call the format method, I get a bad date. like one day off.

dayjs('2022-11-30T21:00:00.000Z') and it gives me 2022-12-01T00:00:00 03:00.So the real date that was stored was 30th November, but it gives me 1st December.

I saw this post dayjs returns wrong date with format in Stack overflow but the accepted solution is wired because it assumes that I manually remove the Z at the end.

And even when i try to convert it in a YYYY-MM-DD by using dayjs('2022-11-30T21:00:00.000Z').format('YYYY-MM-DD') it's returning 2020-12-01.

I really stuck.

CodePudding user response:

The date conversion is correct. The given date is 0 UTC and the output is 3 UTC. Since the time provided is 21.00, the converted date with 3 UTC is the next day at time 00.00

CodePudding user response:

This happens because the library converts the time to the local timezone. In this timezone (UTC 3), the time happens to fall on a different date as well. If you want to keep the original date, you have to tell dayjs to use UTC instead of the local timezone.

As the library's docs explain, you can customize which timezone you use for the parsing/converting. For this, you have to add the timezone and UTC plugins. For example, in the browser:

<script src="https://cdn.jsdelivr.net/npm/dayjs@1/plugin/utc.js"></script>
<script src="https://cdn.jsdelivr.net/npm/dayjs@1/plugin/timezone.js"></script>
dayjs.extend(window.dayjs_plugin_utc);
dayjs.extend(window.dayjs_plugin_timezone);

Once you add the plugins, you can get the correct and formatted UTC days in this way:

dayjs.tz("2022-11-30T21:00:00.000Z", "UTC").format('YYYY-MM-DD');

You can see the complete solution here.

CodePudding user response:

You have to use dayjs utc like this:

dayjs('2022-11-30T21:00:00.000Z').utc().format('YYYY-MM-DD'); //or whatever date format you want

If you set utc(true), it will return Dec 1 instead of Nov 30.

Source: https://day.js.org/docs/en/manipulate/utc#docsNav

  • Related