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 =newDate()Sat,24Mar201205: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.
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.
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).
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.
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.
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.
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:
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.
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'>(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)'
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.
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:
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
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.
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ó
Respostas:
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.
Você não pode alterar o fuso horário mais tarde, pois o Node já leu a variável de ambiente.
fonte
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.zone.tab
arquivo nesse arquivo.Outra abordagem que parecia funcionar para mim, pelo menos no ambiente Linux, é executar o aplicativo Node.js. desta forma:
Isso deve pelo menos garantir que o fuso horário esteja definido corretamente desde o início.
fonte
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:
fonte
Infelizmente, a configuração
process.env.TZ
nã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.
fonte
A solução
env TZ='Europe/Amsterdam' node server.js
do @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 comandogulp
aceita os valores env, mas o processo criado pelo gulp not (seu aplicativo).Para resolver isso, você precisa:
Isso definirá a
TZ
variá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 prefixoexport TZ="Europe/Amsterdam";
novamente.fonte
Etc/UTC
Existem também compensações específicas disponíveisEtc
, 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
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
Para definir o fuso horário
Verificar fuso horário
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,
fonte
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
fonte
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-chaveTZ
e seu fuso horárioAmerica/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.fonte
A partir do Nó 13 , agora você pode definir repetidamente
process.env.TZ
e 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.fonte
set TZ='UTC' node index.js
Você pode tomar o fuso horário do momento . Permite definir sua localização e também cuida do horário de verão.
fonte
Date
outros módulos internos.À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.
fonte
eu trabalho com este pacote npm unix-system-timezone
fonte
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:
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
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
fonte
Você pode configurar o fuso horário global com a biblioteca tzdata:
Depois de definir seu ambiente com a variável, por exemplo: TZ = America / Bogota
E testando em seu projeto:
Espero te ajudar
fonte
Você pode aplicar o fuso horário do processo Node.js. configurando a variável de ambiente
TZ
comoUTC
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:
fonte
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:
isso definirá o fuso horário que será usado em todo o aplicativo do nó
fonte