Problem
Calling dayjs()
results in a date that is correct except it is off by two hours. For some reason, dayjs()
seems to be set to the wrong time zone (GMT), when my actual time zone is GMT+2.
Expected
Mon, 09 Aug 2021 17:45:55 GMT+2
Actual
Mon, 09 Aug 2021 15:45:55 GMT
What I've tried
I have tried setting my time zone with the time zone plugin, but that didn't seem to work:
import utc from 'dayjs/plugin/utc';
import timezone from 'dayjs/plugin/timezone';
dayjs.extend(utc);
dayjs.extend(timezone);
dayjs().tz('Europe/Berlin'); // unchanged Mon, 09 Aug 2021 15:45:55 GMT
I'm on Ubuntu 20.04.2 LTS, so I checked:
$ timedatectl
Local time: Mo 2021-08-09 17:45:55 CEST
Universal time: Mo 2021-08-09 15:45:55 UTC
RTC time: Mo 2021-08-09 17:45:55
Time zone: Europe/Berlin (CEST, +0200)
System clock synchronized: yes
NTP service: active
RTC in local TZ: yes
Warning: The system is configured to read the RTC time in the local time zone.
This mode cannot be fully supported. It will create various problems
with time zone changes and daylight saving time adjustments. The RTC
time is never updated, it relies on external facilities to maintain it.
If at all possible, use RTC in UTC by calling
'timedatectl set-local-rtc 0'.
I am coding in TypeScript, so I also checked if creating a Date
object would result in the wrong time too, but it did not:
const time = new Date(); // results in correct time
TL;DR
dayjs()
is in GMT, but should be in GMT+2. Why?
Problem
Calling dayjs()
results in a date that is correct except it is off by two hours. For some reason, dayjs()
seems to be set to the wrong time zone (GMT), when my actual time zone is GMT+2.
Expected
Mon, 09 Aug 2021 17:45:55 GMT+2
Actual
Mon, 09 Aug 2021 15:45:55 GMT
What I've tried
I have tried setting my time zone with the time zone plugin, but that didn't seem to work:
import utc from 'dayjs/plugin/utc';
import timezone from 'dayjs/plugin/timezone';
dayjs.extend(utc);
dayjs.extend(timezone);
dayjs().tz('Europe/Berlin'); // unchanged Mon, 09 Aug 2021 15:45:55 GMT
I'm on Ubuntu 20.04.2 LTS, so I checked:
$ timedatectl
Local time: Mo 2021-08-09 17:45:55 CEST
Universal time: Mo 2021-08-09 15:45:55 UTC
RTC time: Mo 2021-08-09 17:45:55
Time zone: Europe/Berlin (CEST, +0200)
System clock synchronized: yes
NTP service: active
RTC in local TZ: yes
Warning: The system is configured to read the RTC time in the local time zone.
This mode cannot be fully supported. It will create various problems
with time zone changes and daylight saving time adjustments. The RTC
time is never updated, it relies on external facilities to maintain it.
If at all possible, use RTC in UTC by calling
'timedatectl set-local-rtc 0'.
I am coding in TypeScript, so I also checked if creating a Date
object would result in the wrong time too, but it did not:
const time = new Date(); // results in correct time
TL;DR
dayjs()
is in GMT, but should be in GMT+2. Why?
4 Answers
Reset to default 3import utc from 'dayjs/plugin/utc'; import timezone from 'dayjs/plugin/timezone'; dayjs.extend(utc); dayjs.extend(timezone); dayjs.tz.setDefault('Europe/Berlin');
You should try this way. However, note, that it affects only dayjs.tz('some date'), dayjs() still will show your local time.
You can create a service like this
// Filename : dayjs.ts
import dayjs from "dayjs";
import utc from "dayjs/plugin/utc";
import timezone from "dayjs/plugin/timezone";
import "dayjs/locale/fr";
dayjs.extend(utc);
dayjs.extend(timezone);
dayjs.locale("fr");
dayjs.tz.setDefault("Europe/Paris")
const timezonedDayjs = (...args: any[]) => {
return dayjs(...args).tz();
};
const timezonedUnix = (value: number) => {
return dayjs.unix(value).tz();
};
timezonedDayjs.unix = timezonedUnix;
timezonedDayjs.duration = dayjs.duration;
export default timezonedDayjs;
And change your imports from import dayjs from "dayjs"
to import dayjs from "my-service/dayjs"
With this, typing works even with plugins
Simply using the utc plugin without the timezone plugin somehow had the desired effect.
import utc from 'dayjs/plugin/utc';
day.extend(utc);
dayjs.utc(); // results in date in correct timezone
This is what works for me.
dayjs('2021-08-09 15:45:55 UTC').tz("Africa/Lagos")
Response
{
'$L': 'en',
'$offset': 60,
'$d': 2021-08-09T15:45:55.000Z,
'$x': { '$timezone': 'Africa/Lagos' },
'$y': 2021,
'$M': 7,
'$D': 9,
'$W': 1,
'$H': 16,
'$m': 45,
'$s': 55,
'$ms': 0
}
new Date('Mon, 09 Aug 2021 17:45:55 GMT+2')
andnew Date('Mon, 09 Aug 2021 15:45:55 GMT')
what are the resulting date objects? How do they differ? – Alexander Staroselsky Commented Aug 9, 2021 at 16:36Mon Aug 09 2021 17:45:55 GMT+0200 (Central European Summer Time)
2:Mon Aug 09 2021 17:45:55 GMT+0200 (Central European Summer Time)
– Robert Schauer Commented Aug 9, 2021 at 16:45