Como posso definir o fuso horário padrão no node.js?

153

Como defino o fuso horário padrão no node.js?

Olu
fonte
2
Tenho certeza que você realmente não pode fazer isso. Altere as configurações do fuso horário do sistema.
thejh
1
thejh está certo, você não pode alterar o fuso horário. Use uma biblioteca de tempo JS (como moment.js) e adicione / subtraia horas.
Alessioalex
2
A maneira mais fácil e correta de fazer isso é simplesmente alterar o fuso horário do seu sistema.
Munim 27/11
1
Estes são comentários úteis, mas na maioria das vezes você não é o gerente do sistema;)
Mário de Sá Vera

Respostas:

135

De acordo com este segmento de grupo do Google , você pode definir a variável de ambiente TZ antes de chamar qualquer função de data. Apenas testei e 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)'

Você não pode alterar o fuso horário mais tarde, pois o Node já leu a variável de ambiente.

webjprgm
fonte
3
Isso é interessante. A discussão do bug sugere que há algum problema com o encadeamento. Mas o exemplo foi alterar process.env.TZ várias vezes. Parece que defini-lo uma vez no início e deixá-lo sozinho funciona. Obrigado lorancou pela referência ao tempo do nó, no entanto, para um manuseio mais flexível e robusto.
Webjprgm
6
Infelizmente, ele não funciona no Windows. Funciona bem no Mac OS X e UNIX
Ritesh Kumar Gupta
14
Boa resposta. Infelizmente, toda vez que vejo algo como process.env.TZ = 'Europe/Amsterdam' "legal, agora, onde posso encontrar uma lista de todos os valores válidos que posso definir?" e eu não acho, todas as vezes.
Rafael Eyng
5
@RafaelEyng a IANA (Associação Internacional de Números Atribuídos) é frequentemente usada para fornecer configurações atualizadas de fuso horário. Você pode encontrar as configurações mais recentes do fuso horário aqui: ftp.iana.org/tz/tzdata-latest.tar.gz Para obter uma visão geral das possíveis strings de fuso horário, verifique o zone.tabarquivo nesse arquivo.
JohannesB
8
@RafaelEyng: como JohannesB mencionou, iana.org/time-zones é a fonte oficial, mas seu formato de dados é difícil de trabalhar. Acho muito mais fácil trabalhar em en.wikipedia.org/wiki/List_of_tz_database_time_zones , criado a partir do conjunto de dados da IANA (atualmente a versão 2017c).
Peter Rust
66

Outra abordagem que parecia funcionar para mim, pelo menos no ambiente Linux, é executar o aplicativo Node.js. desta forma:

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

Isso deve pelo menos garantir que o fuso horário esteja definido corretamente desde o início.

uhef
fonte
Agradável! Funciona para mim
Rotem
Você pode fazer o mesmo pelas culturas?
Jim Aho
Isso tornou mais fácil forçar um fuso horário do que tentar fazê-lo no código .
Dan Dascalescu 20/03/19
33

Aqui está um exemplo de trabalho de 100% para obter o fuso horário personalizado Date Time nos NodeJs sem usar nenhum módulo externo:

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

console.log(nDate);

Vikas Kandari
fonte
Estou confuso - isso é muito votado, mas tem um problema crítico na IMO. As versões do nó <13 possuem apenas dados de localidade para 'en-us', o que significa que ele lança (em alguns casos) ou fornece o formato de data incorreto para todos os outros países. E, em muitos casos, a data parecerá correta, mas dia e mês são trocados! E o Nó 13 foi lançado apenas algumas semanas atrás, portanto esse problema se aplica a praticamente todos.
Tom
Vejo que a resposta de @Marshall abaixo sugere uma maneira de resolver isso em algumas situações (não funcionará no Lambda e em outros FaaS).
Tom
31

Infelizmente, a configuração process.env.TZnão funciona muito bem - basicamente, é indeterminado quando a alteração será efetiva).

Portanto, definir o fuso horário do sistema antes de iniciar o nó é sua única opção adequada.

No entanto, se você não puder fazer isso, deve ser possível usar o horário do nó como uma solução alternativa: obtenha seus horários no horário local ou UTC e converta-os no fuso horário desejado. Consulte Como usar o deslocamento de fuso horário no Nodejs? para detalhes.

Laurent Couvidou
fonte
1
o tempo do módulo npm funcionou muito bem para mim. defino como utc, em seguida, defino todos os horários usando utc, para que o código seja portátil entre máquinas diferentes com fusos horários diferentes.
Mark Shust em M.academy
Não há mais problemas com isso, existem?
Bloke
16

A solução env TZ='Europe/Amsterdam' node server.jsdo @uhef funciona nos casos em que seu aplicativo não funciona com o processo bifurcado, mas quando você está trabalhando com o processo bifurcado, especialmente quando você inicia o aplicativo com uma ferramenta de construção como gulp , o comando gulpaceita os valores env, mas o processo criado pelo gulp not (seu aplicativo).

Para resolver isso, você precisa:

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

Isso definirá a TZvariável de ambiente para todo o processo iniciado no console em que você está trabalhando, incluindo todos os processos subsequentes executados após o comando gulp no mesmo console, sem a necessidade de executá-los com o prefixo export TZ="Europe/Amsterdam";novamente.

Mariano Ruiz
fonte
como Amsterdã possui horário de verão, este ainda é o tz desejável para alcançar a "meia-noite UTC" às GMT +1?
FlavorScape 20/10
1
@FlavorScape que eu uso Etc/UTC Existem também compensações específicas disponíveis Etc, mas a compensação é inversa do que seria de esperar. Etc/GMT-1é UTC + 1 hora. Vejahttps://en.wikipedia.org/wiki/List_of_tz_database_time_zones
npskirk
9

Defina o fuso horário do servidor e use a sincronização NTP. Aqui está uma solução melhor para alterar a hora do servidor.

Para listar fusos horários

timedatectl list-timezones

Para definir o fuso horário

sudo timedatectl set-timezone America/New_York

Verificar fuso horário

timedatectl

Prefiro usar o fuso horário UTC para meus servidores e bancos de dados. Quaisquer conversões devem ser tratadas no cliente. Podemos nos acostumar com moment.js no lado do cliente.

Também será fácil manter muitas instâncias,

Prajyot Khandeparkar
fonte
2
Embora o moment.js tenha sido uma ótima biblioteca, existem alternativas muito menores atualmente (por exemplo, date-fns ). O momento é enorme ; não o recomende para aplicativos clientes.
Dan Dascalescu 20/03/19
5

Eu sei que esta discussão é muito antiga, mas acho que isso ajudaria qualquer um que chegou aqui do google como eu.

No GAE Flex (NodeJs), você pode definir a variável de ambiente TZ (aquela que gerencia todos os fusos horários de data no aplicativo) no arquivo app.yaml, deixo aqui um exemplo:

app.yaml

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

Aqui está uma resposta para aqueles que implantam um aplicativo Node.js. no Amazon AWS Elastic Beanstalk . Eu não vi isso documentado em nenhum outro lugar:

Abaixo Configuration -> Software -> Environment Properties, basta definir o par de valores-chave TZe seu fuso horário America/Los Angeles, por exemplo , e Aplicar a alteração.

Você pode verificar o efeito produzindo new Date().toString()no aplicativo Node e prestando atenção no sufixo do fuso horário.

pscl
fonte
3

A partir do Nó 13 , agora você pode definir repetidamente process.env.TZe isso será refletido no fuso horário dos novos objetos Data. Não sei se usaria isso no código de produção, mas seria definitivamente útil em testes de unidade.

> 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)'
usuario
fonte
1
Isso funciona muito bem no Linux / Mac, mas não funciona no Windows.
Nate
Não, ele funciona para Windows também, useset TZ='UTC' node index.js
user3896501 2/07
@ user3896501 não, essa sintaxe define o env var para todo o processo - não durante a execução, como no exemplo do OP.
Ian Grainger
2

Você pode tomar o fuso horário do momento . Permite definir sua localização e também cuida do horário de verão.

rainerhahnekamp
fonte
2
O momento é bastante pesado para uma tarefa como essa e eu não a recomendaria, a menos que o comportamento desejado não seja possível por meio de Dateoutros módulos internos.
Chris Williamson
2

Às vezes, você pode estar executando código em um servidor virtual em outro lugar - Isso pode ficar confuso ao executar o NODEJS ou outros tipos.

Aqui está uma correção que permitirá que você use qualquer fuso horário facilmente.

Verifique aqui a lista de fusos horários

Basta colocar sua frase de fuso horário entre colchetes da sua linha FORMAT.

Neste caso - estou convertendo EPOCH para 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');
BillyBob - Fire Fight'n PrgrmR
fonte
1

eu trabalho com este pacote npm unix-system-timezone

jeriveromartinez
fonte
1

Atualização para node.js v13

Como o @Tom apontou, o suporte completo ao icu está embutido na v13 agora. Portanto, as etapas de configuração podem ser omitidas. Você ainda pode personalizar como deseja criar ou usar o icu em tempo de execução: https://nodejs.org/api/intl.html

Para node.js no Windows , você pode fazer o seguinte:

  1. Instale o full-icu, se tiver sido instalado, que aplica localidades de data corretamente

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

  2. Use toLocaleString () no seu código, por exemplo:

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

    Isto irá produzir algo como: 25/02/2019, 3:19:22 pm. Se você preferir 24 horas, 'en-GB' produzirá:25/02/2019, 15:19:22

Para o node.js como aplicativo Web do Azure , além das configurações do aplicativo WEBSITE_TIME_ZONE, você também precisa definir NODE_ICU_DATA como <your project>\node_modules\full-icu, por exemplo , é claro, depois de fazer o npm i full-icu. A instalação do pacote globalmente no Azure não é sugerida, pois esse diretório é temporário e pode ser apagado.

Ref: 1. NodeJS não aplicando localidades de data corretamente

  1. Você também pode criar o node.js com opções intl, mais informações aqui
Marechal
fonte
1
O full-icu está incluído nas construções padrão / oficiais do Node a partir da v13, portanto, as etapas acima não serão mais necessárias.
Tom
1

Você pode configurar o fuso horário global com a biblioteca tzdata:

npm install tzdata -y

Depois de definir seu ambiente com a variável, por exemplo: TZ = America / Bogota

E testando em seu projeto:

new Date()

Espero te ajudar

Cristhian D
fonte
1

Você pode aplicar o fuso horário do processo Node.js. configurando a variável de ambiente TZcomoUTC

Então, todo o tempo será medido no UTC + 00: 00

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

Exemplo package.json:

{
  "scripts": {
    "start": "TZ='UTC' node index.js"
  }
}
user3896501
fonte
Isso não funciona no Windows. Você não pode definir o ambiente TZ var dessa maneira. E se você definir TZ, ele não será reconhecido como o fuso horário padrão do Node.
Nate
-1

basta definir a variável de ambiente em seu arquivo principal, como index.js ou app.js ou main.js ou qualquer que seja o seu nome de arquivo:

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

isso definirá o fuso horário que será usado em todo o aplicativo do nó

Alireza Mortezaei
fonte