¿Cómo puedo configurar la zona horaria predeterminada en node.js?


153

¿Cómo configuro la zona horaria predeterminada en node.js?


2
Estoy bastante seguro de que realmente no puedes hacer eso. Cambiar la configuración de la zona horaria del sistema.
thejh

1
thejh tiene razón, no puedes cambiar la zona horaria. Use una biblioteca de tiempo JS (como moment.js) y agregue / reste horas en su lugar.
alessioalex

2
La forma más fácil y correcta de hacerlo es simplemente cambiar la zona horaria de su sistema.
Munim

1
Estos son comentarios útiles, pero la mayoría de las veces usted no es el administrador del sistema;)
Mário de Sá Vera

Respuestas:


135

De acuerdo con este hilo del grupo de Google , puede configurar la variable de entorno TZ antes de llamar a cualquier función de fecha. Solo lo probé y funciona.

> process.env.TZ = 'Europe/Amsterdam' 
'Europe/Amsterdam'
> d = new Date()
Sat, 24 Mar 2012 05:50:39 GMT
> d.toLocaleTimeString()
'06:50:39'
> ""+d
'Sat Mar 24 2012 06:50:39 GMT+0100 (CET)'

Sin embargo, no puede cambiar la zona horaria más adelante, ya que para ese momento Node ya ha leído la variable de entorno.


3
Eso es interesante. La discusión del error sugiere que hay algún problema con el enhebrado. Pero el ejemplo fue cambiar process.env.TZ varias veces. Parece que configurarlo una vez al principio y dejarlo solo funciona. Sin embargo, gracias lorancou por la referencia al tiempo de nodo para un manejo más flexible y robusto.
webjprgm

66
Lamentablemente, no funciona en Windows. Funciona bien en mac os-x y unix
Ritesh Kumar Gupta

14
Buena respuesta. Desafortunadamente, cada vez que veo algo así como process.env.TZ = 'Europe/Amsterdam' "bien, ahora ¿dónde puedo encontrar una lista de todos los valores válidos que puedo establecer?" y no lo encuentro, cada vez.
Rafael Eyng

55
@RafaelEyng, la IANA (Asociación Internacional de Números Asignados) se usa a menudo para proporcionar configuraciones de zona horaria actualizadas. Puede encontrar la última configuración de zona horaria aquí: ftp.iana.org/tz/tzdata-latest.tar.gz Para obtener una descripción general de las posibles cadenas de zona horaria, consulte el zone.tabarchivo en ese archivo.
JohannesB

8
@RafaelEyng: como JohannesB mencionó iana.org/time-zones es la fuente oficial, pero es difícil trabajar con su formato de datos. Me resulta mucho más fácil trabajar desde en.wikipedia.org/wiki/List_of_tz_database_time_zones , que está construido a partir del conjunto de datos de IANA (actualmente la versión 2017c).
Peter Rust

66

Otro enfoque que parecía funcionar para mí al menos en el entorno Linux es ejecutar su aplicación Node.js de esta manera:

env TZ='Europe/Amsterdam' node server.js

Esto debería al menos garantizar que la zona horaria esté configurada correctamente desde el principio.


¡Agradable! Funciona para mí
Rotem

¿Puedes hacer lo mismo para las culturas?
Jim Aho

Esto hizo que sea mucho más simple forzar una zona horaria, que intentar hacerlo en código .
Dan Dascalescu

33

Aquí hay un ejemplo 100% funcional para obtener la zona horaria personalizada Fecha Hora en NodeJs sin usar ningún módulo externo:

const nDate = new Date().toLocaleString('en-US', {
  timeZone: 'Asia/Calcutta'
});

console.log(nDate);


Estoy desconcertado: esto es muy votado pero tiene un problema crítico de la OMI. Las versiones de nodo <13 solo tienen datos locales para 'en-us', lo que significa que arroja (en algunos casos) o da un formato de fecha incorrecto para todos los demás países. ¡Y en muchos casos la fecha se verá correcta pero se intercambian día y mes! Y el Nodo 13 solo se lanzó hace unas semanas, por lo que este problema se aplica a casi todos.
Tom

Veo que la respuesta de @Marshall a continuación sugiere una forma de resolver esto en algunas situaciones (no funcionará en Lambda y otros FaaS).
Tom

31

Desafortunadamente, la configuración process.env.TZno funciona muy bien , básicamente es indeterminado cuándo será efectivo el cambio).

Por lo tanto, configurar la zona horaria del sistema antes de iniciar el nodo es su única opción adecuada.

Sin embargo, si no puede hacer eso, debería ser posible utilizar el tiempo de nodo como solución alternativa: obtenga sus horas en hora local o UTC y conviértalas a la zona horaria deseada. Consulte ¿Cómo usar el desplazamiento de zona horaria en Nodejs? para detalles.


1
El tiempo del módulo npm funcionó muy bien para mí. configuré a utc, luego configuré todo el tiempo usando utc, por lo que el código es portátil entre diferentes máquinas con diferentes zonas horarias.
Mark Shust en M.academy

Ya no hay problemas con esto, ¿verdad?
Bloke

16

La solución env TZ='Europe/Amsterdam' node server.jsde @uhef funciona en los casos en que su aplicación no funciona con el proceso bifurcado, pero cuando está trabajando con el proceso bifurcado, especialmente cuando inicia su aplicación con una herramienta de construcción como gulp , el comando gulptomará los valores env, pero El proceso creado por Gulp not (su aplicación).

Para resolver esto, tienes que hacer:

$ export TZ="Europe/Amsterdam"; gulp myTask

Esto establecerá la TZvariable de entorno para todo el proceso iniciado en la consola en la que está trabajando, incluidos todos los procesos posteriores ejecutados después del comando gulp en la misma consola sin la necesidad de ejecutarlos export TZ="Europe/Amsterdam";nuevamente con el prefijo .


dado que Amsterdam tiene horario de verano, ¿sigue siendo el objetivo deseable para lograr la "medianoche UTC" en GMT +1?
FlavorScape

1
@FlavorScape que uso Etc/UTC También hay compensaciones específicas disponibles Etc, pero el desplazamiento es inverso al que cabría esperar. Etc/GMT-1es UTC + 1 hora. Verhttps://en.wikipedia.org/wiki/List_of_tz_database_time_zones
npskirk

9

Establezca la zona horaria del servidor y use la sincronización NTP. Aquí hay una mejor solución para cambiar la hora del servidor.

Para enumerar zonas horarias

timedatectl list-timezones

Para configurar la zona horaria

sudo timedatectl set-timezone America/New_York

Verificar zona horaria

timedatectl

Prefiero usar la zona horaria UTC para mis servidores y bases de datos. Cualquier conversión debe ser manejada en el cliente. Podemos utilizar moment.js en el lado del cliente.

Será fácil mantener muchas instancias también,


2
Si bien moment.js fue una gran biblioteca en el pasado, actualmente hay alternativas mucho más pequeñas (por ejemplo, date-fns ). El momento es enorme ; por favor no lo recomiende para aplicaciones cliente.
Dan Dascalescu

5

Sé que este hilo es muy antiguo, pero creo que esto ayudaría a cualquiera que haya llegado aquí desde Google como yo.

En GAE Flex (NodeJs), puede establecer la variable de entorno TZ (la que administra todas las zonas horarias de fecha en la aplicación) en el archivo app.yaml, le dejo aquí un ejemplo:

app.yaml

# [START env]
env_variables:
  # Timezone
  TZ: America/Argentina/Buenos_Aires

5

Aquí hay una respuesta para aquellos que implementan una aplicación Node.js en Amazon AWS Elastic Beanstalk . No he visto esto documentado en ningún otro lugar:

Debajo Configuration -> Software -> Environment Properties, simplemente establezca el par de valores clave TZy su zona horaria America/Los Angeles, por ejemplo , y aplique el cambio.

Puede verificar el efecto imprimiendo new Date().toString()en su aplicación Node y prestando atención al sufijo de zona horaria.


3

A partir del Nodo 13 , ahora puede configurarlo repetidamente process.env.TZy se reflejará en la zona horaria de los nuevos objetos Date. No sé si usaría esto en el código de producción, pero definitivamente sería útil en pruebas unitarias.

> process.env.TZ = 'Europe/London';
'Europe/London'
> (new Date().toString())
'Fri Mar 20 2020 09:39:59 GMT+0000 (Greenwich Mean Time)'

> process.env.TZ = 'Europe/Amsterdam';
'Europe/Amsterdam'
> (new Date().toString())
'Fri Mar 20 2020 10:40:07 GMT+0100 (Central European Standard Time)'

1
Esto funciona muy bien en Linux / Mac, pero no funciona en Windows.
Nate

No, también funciona para Windows, useset TZ='UTC' node index.js
user3896501

@ user3896501 no, esa sintaxis establece la variable de entorno para todo el proceso, no mientras se ejecuta como en el ejemplo del OP.
Ian Grainger

2

Puedes tomar la zona horaria del momento . Le permite establecer su ubicación y también se ocupa del horario de verano.


2
momento es bastante pesado para una tarea como esta y no lo recomendaría a menos que el comportamiento que desea no sea posible a través de Dateotros módulos integrados.
Chris Williamson

2

A veces puede estar ejecutando código en un servidor virtual en otro lugar: eso puede ser confuso al ejecutar NODEJS u otros tipos.

Aquí hay una solución que le permitirá usar cualquier zona horaria fácilmente.

Consulte aquí para obtener una lista de zonas horarias

Simplemente ponga su frase de zona horaria dentro de los corchetes de su línea FORMAT.

En este caso, estoy convirtiendo EPOCH a Eastern.

//RE: https://www.npmjs.com/package/date-and-time
const date = require('date-and-time');

let unixEpochTime = (seconds * 1000);
const dd=new Date(unixEpochTime);
let myFormattedDateTime = date.format(dd, 'YYYY/MM/DD HH:mm:ss A [America/New_York]Z');
let myFormattedDateTime24 = date.format(dd, 'YYYY/MM/DD HH:mm:ss [America/New_York]Z');


1

Actualización para node.js v13

Como señaló @Tom, el soporte completo de icu está integrado en v13 ahora. Por lo tanto, los pasos de configuración pueden omitirse. Todavía puede personalizar cómo quiere construir o usar icu en tiempo de ejecución: https://nodejs.org/api/intl.html

Para node.js en Windows , puede hacer lo siguiente:

  1. Instale full-icu si se ha instalado, que aplica las configuraciones regionales de fecha correctamente

    npm i full-icu o globalmente: npm i -g full-icu

  2. Use toLocaleString () en su código, por ejemplo:

    new Date().toLocaleString('en-AU', { timeZone: 'Australia/Melbourne' })

    Esto producirá algo como: 25/02/2019, 3:19:22 pm. Si prefiere 24 horas, 'en-GB' producirá:25/02/2019, 15:19:22

Para node.js como aplicación web de Azure , además de la configuración de la aplicación WEBSITE_TIME_ZONE, también debe configurar NODE_ICU_DATA para, por ejemplo,<your project>\node_modules\full-icu , , después de haber realizado el npm i full-icu. No se sugiere instalar el paquete globalmente en Azure, ya que ese directorio es temporal y puede eliminarse.

Ref: 1. NodeJS no aplica las configuraciones regionales de fecha correctamente

  1. También puede construir node.js con opciones intl, más información aquí

1
full-icu se incluye en las compilaciones estándar / oficiales de Node a partir de v13, por lo que los pasos anteriores ya no serán necesarios.
Tom

1

Puede configurar la zona horaria global con la biblioteca tzdata:

npm install tzdata -y

Después de configurar su entorno con la variable, por ejemplo: TZ = America / Bogota

Y probando en su proyecto:

new Date()

Te espero


1

Puede aplicar la zona horaria del proceso Node.js configurando la variable de entorno TZ enUTC

Entonces todo el tiempo se medirá en UTC + 00: 00

Lista llena: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones

Ejemplo package.json:

{
  "scripts": {
    "start": "TZ='UTC' node index.js"
  }
}

Esto no funciona en Windows. No puede configurar la TZ env var de esta manera. Y si configura TZ, no se reconocerá como la zona horaria predeterminada de Node.
Nate

-1

solo establezca la variable de entorno en su archivo principal como index.js o app.js o main.js o el nombre de su archivo:

process.env.TZ = "Aisa/Tehran";

esto establecerá la zona horaria que se utilizará en toda su aplicación de nodo

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.