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 =newDate()Sat,24Mar201205: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.
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.
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).
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.
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:
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.
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'>(newDate().toString())'Fri Mar 20 2020 09:39:59 GMT+0000 (Greenwich Mean Time)'> process.env.TZ ='Europe/Amsterdam';'Europe/Amsterdam'>(newDate().toString())'Fri Mar 20 2020 10:40:07 GMT+0100 (Central European Standard Time)'
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.
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:
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
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.
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
Respuestas:
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.
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.
fuente
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.zone.tab
archivo en ese archivo.Otro enfoque que parecía funcionar para mí al menos en el entorno Linux es ejecutar su aplicación Node.js de esta manera:
Esto debería al menos garantizar que la zona horaria esté configurada correctamente desde el principio.
fuente
Aquí hay un ejemplo 100% funcional para obtener la zona horaria personalizada Fecha Hora en NodeJs sin usar ningún módulo externo:
fuente
Desafortunadamente, la configuración
process.env.TZ
no 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.
fuente
La solución
env TZ='Europe/Amsterdam' node server.js
de @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 comandogulp
tomará los valores env, pero El proceso creado por Gulp not (su aplicación).Para resolver esto, tienes que hacer:
Esto establecerá la
TZ
variable 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 ejecutarlosexport TZ="Europe/Amsterdam";
nuevamente con el prefijo .fuente
Etc/UTC
También hay compensaciones específicas disponiblesEtc
, pero el desplazamiento es inverso al que cabría esperar.Etc/GMT-1
es UTC + 1 hora. Verhttps://en.wikipedia.org/wiki/List_of_tz_database_time_zones
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
Para configurar la zona horaria
Verificar zona horaria
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,
fuente
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
fuente
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 claveTZ
y su zona horariaAmerica/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.fuente
A partir del Nodo 13 , ahora puede configurarlo repetidamente
process.env.TZ
y 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.fuente
set TZ='UTC' node index.js
Puedes tomar la zona horaria del momento . Le permite establecer su ubicación y también se ocupa del horario de verano.
fuente
Date
otros módulos integrados.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.
fuente
yo trabajo con este paquete npm unix-system-timezone
fuente
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:
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
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
fuente
Puede configurar la zona horaria global con la biblioteca tzdata:
Después de configurar su entorno con la variable, por ejemplo: TZ = America / Bogota
Y probando en su proyecto:
Te espero
fuente
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:
fuente
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:
esto establecerá la zona horaria que se utilizará en toda su aplicación de nodo
fuente