javascript - dayjs() está en la zona horaria incorrecta
Problema
Llamar a dayjs() resulta en una fecha que es correcta excepto que está desfasada por dos horas. Por alguna razón, dayjs() parece estar configurado en la zona horaria incorrecta (GMT), cuando mi zona horaria real es GMT+2.
esperada
Mon, 09 Aug 2021 17:45:55 GMT+2
Actual
Mon, 09 Aug 2021 15:45:55 GMT
Lo que he intentado
He intentado configurar mi zona horaria con el complemento de zona horaria, pero eso no pareció funcionar:
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
Estoy en Ubuntu 20.04.2 LTS, así que comprobé:
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'.
Estoy programando en TypeScript, así que también verifiqué si crear un objeto Date resultaría en la hora incorrecta, pero no fue así:
const time = new Date(); // results in correct time
Resumen
dayjs() está en GMT, pero debería estar en GMT+2. ¿Por qué?
Respuesta #1
import utc from 'dayjs/plugin/utc'; import timezone from 'dayjs/plugin/timezone'; dayjs.extend(utc); dayjs.extend(timezone); dayjs.tz.setDefault('Europe/Berlin');
Deberías intentar de esta manera. Sin embargo, ten en cuenta que esto afecta únicamente a dayjs.tz('alguna fecha'), dayjs() todavía mostrará tu hora local.
Respuesta #2
Puedes crear un servicio como este
// 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;
Y cambia tus importaciones de import dayjs from "dayjs" a import dayjs from "my-service/dayjs"
Con esto, escribir funciona incluso con complementos
