Búsqueda de sitios web

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

Artículos relacionados