iamkun / dayjs

⏰ Day.js 2kB immutable date-time library alternative to Moment.js with the same modern API
https://day.js.org
MIT License
46.78k stars 2.29k forks source link

Having some issues when use a timezone with zero offset with locale method #2248

Closed nkeyy0 closed 2 months ago

nkeyy0 commented 1 year ago

I'm having some issues with parsing timezones with zero offsets.

Issue description

I have unexpected results when applying locale for the dayjs object in UTC and timezone with zero offsets. When I call the locale method after .tz() looks like the locale method is changed date-time according to my local time. But with timezones which is different from UTC, everything works fine.

Code

My plugins

import dayjs from 'dayjs';
import advancedFormat from 'dayjs/plugin/advancedFormat';
import calendar from 'dayjs/plugin/calendar';
import customParseFormat from 'dayjs/plugin/customParseFormat';
import localizedFormat from 'dayjs/plugin/localizedFormat';
import timezone from 'dayjs/plugin/timezone';
import utc from 'dayjs/plugin/utc';

dayjs.extend(advancedFormat);
dayjs.extend(customParseFormat);
dayjs.extend(utc);
dayjs.extend(localizedFormat);
dayjs.extend(timezone);
dayjs.extend(calendar);

I don't import locales here, but I import them dynamically after a user selects a specific locale.

Code with issues

dayjs.utc(date).tz(timeZone).locale(locale).format(localizedFormats[dateFormat])

The date argument in that case is a date string in ISO format. Timezone is the string, locale is the string with one of the dayjs locales. Everything works fine until I pass the timezone with zero offsets. I've tried to test this behavior and found that the issue is probably in the clone method

Logs

Date argument is 2022-02-27T11:05:51.439Z in ISO format

Code

      console.log('only timezone', dayjs.utc(date).tz(timeZone));
      console.log('timezone + locale', dayjs.utc(date).tz(timeZone).locale(locale));
      console.log('clone + timezone', dayjs.utc(date).tz(timeZone).clone());

Results

  1. With zero offset image
  2. With non-zero offset image image

Expected behavior

The date and time should be the same after locale method call

Information

ohsory1324 commented 1 year ago

+1

@iamkun Do you know this issue?

dungle1811 commented 10 months ago

I've got the same problem when I passed in the timezone "UTC":

dayjs.tz("2023-12-06T07:43:14.674Z", "UTC").locale("en").format("LT") returns wrong value 12:43 AM dayjs.tz("2023-12-06T07:43:14.674Z", "UTC").format("LT") returns the expected value 7:43 AM