Comment puis-je définir le fuseau horaire par défaut dans node.js?

154

Comment définir le fuseau horaire par défaut dans node.js?

Olu
la source
2
Je suis sûr que vous ne pouvez pas vraiment faire ça. Modifiez les paramètres de fuseau horaire du système.
thejh
1
thejh a raison, vous ne pouvez pas changer le fuseau horaire. Utilisez une bibliothèque de temps JS (comme moment.js) et ajoutez / soustrayez des heures à la place.
alessioalex
2
Le moyen le plus simple et le plus correct de le faire est de simplement changer le fuseau horaire de votre système.
Munim
1
Ce sont des commentaires utiles mais la plupart du temps vous n'êtes pas le gestionnaire du système;)
Mário de Sá Vera

Réponses:

136

Selon ce fil de discussion du groupe Google , vous pouvez définir la variable d'environnement TZ avant d'appeler des fonctions de date. Je viens de le tester et cela fonctionne.

> 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)'

Cependant, vous ne pouvez pas changer le fuseau horaire plus tard, car à ce moment-là, Node a déjà lu la variable d'environnement.

webjprgm
la source
3
C'est intéressant. La discussion sur le bogue suggère que c'est un problème avec le filetage. Mais l'exemple changeait plusieurs fois de process.env.TZ. Il semble que le réglage une fois au début et le laisser seul fonctionne. Merci à Lorancou pour la référence au temps de nœud, cependant, pour une manipulation plus flexible et plus robuste.
webjprgm
6
Malheureusement, cela ne fonctionne pas sous Windows. Fonctionne bien sous mac os-x et unix
Ritesh Kumar Gupta
15
Bonne réponse. Malheureusement, à chaque fois que je vois quelque chose comme process.env.TZ = 'Europe/Amsterdam' "bien, maintenant où puis-je trouver une liste de toutes les valeurs valides que je peux définir?" et je ne le trouve pas, à chaque fois.
Rafael Eyng
5
@RafaelEyng, l'IANA (International Assigned Numbers Association) est souvent utilisée pour fournir des configurations de fuseau horaire à jour. Vous pouvez trouver les derniers paramètres de fuseau horaire ici: ftp.iana.org/tz/tzdata-latest.tar.gz Pour un aperçu des chaînes de fuseau horaire possibles, vérifiez le zone.tabfichier dans cette archive.
JohannesB
9
@RafaelEyng: comme JohannesB l'a mentionné, iana.org/time-zones est la source officielle, mais leur format de données est difficile à travailler. Je trouve beaucoup plus facile de travailler à partir de en.wikipedia.org/wiki/List_of_tz_database_time_zones , qui est construit à partir de l'ensemble de données IANA (actuellement la version 2017c).
Peter Rust
66

Une autre approche qui semblait fonctionner pour moi au moins dans un environnement Linux consiste à exécuter votre application Node.js comme ceci:

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

Cela devrait au moins garantir que le fuseau horaire est correctement défini dès le début.

uhef
la source
Agréable! Works for me
Rotem
Pouvez-vous faire de même pour les cultures?
Jim Aho
Cela rendait beaucoup plus simple de forcer un fuseau horaire que d' essayer de le faire dans le code .
Dan Dascalescu
33

Voici un exemple fonctionnel à 100% pour obtenir un fuseau horaire personnalisé Date et heure dans NodeJs sans utiliser de modules externes:

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

console.log(nDate);

Vikas Kandari
la source
Je suis perplexe - c'est très voté mais il a un problème critique IMO. Les versions de nœuds <13 n'ont que des données locales pour «en-us», ce qui signifie qu'il renvoie (dans certains cas) ou donne le mauvais format de date pour tous les autres pays. Et dans de nombreux cas, la date semblera correcte, mais le jour et le mois sont échangés! Et Node 13 est sorti il ​​y a seulement quelques semaines, donc ce problème s'applique à presque tout le monde.
Tom
Je vois que la réponse de @Marshall ci-dessous suggère un moyen de résoudre ce problème dans certaines situations (ne fonctionnera pas dans Lambda et d'autres FaaS).
Tom
31

Malheureusement, le réglage process.env.TZne fonctionne pas très bien - en gros, il est indéterminé quand le changement sera effectif).

Donc, définir le fuseau horaire du système avant de démarrer le nœud est votre seule option appropriée.

Cependant, si vous ne pouvez pas faire cela, il devrait être possible d'utiliser l' heure des nœuds comme solution de contournement: obtenez vos heures en heure locale ou UTC et convertissez-les dans le fuseau horaire souhaité. Consultez Comment utiliser le décalage du fuseau horaire dans Nodejs? pour plus de détails.

Laurent Couvidou
la source
1
Le temps du module npm a très bien fonctionné pour moi. J'ai mis à utc, puis défini toutes les heures en utilisant utc, le code est donc portable entre différentes machines avec différents fuseaux horaires.
Mark Shust à M.academy le
Il n'y a plus de problèmes avec ça, n'est-ce pas?
Bloke
16

La solution env TZ='Europe/Amsterdam' node server.jsde @uhef fonctionne dans les cas où votre application ne fonctionne pas avec un processus forké, mais lorsque vous travaillez avec un processus forké, en particulier lorsque vous lancez votre application avec un outil de construction comme gulp , la commande gulpprendra les valeurs env, mais le processus créé par gulp not (votre application).

Pour résoudre ce problème, vous devez faire:

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

Cela définira la TZvariable d'environnement pour tous les processus démarrés dans la console sur laquelle vous travaillez, y compris tous les processus ultérieurs exécutés après la commande gulp dans la même console sans qu'il soit nécessaire de les exécuter à nouveau avec le préfixe export TZ="Europe/Amsterdam";.

Mariano Ruiz
la source
puisque amsterdam a l'heure d'été, est-ce toujours le tz souhaitable pour atteindre "minuit UTC" à GMT +1?
FlavorScape
1
@FlavorScape que j'utilise Etc/UTC Il existe également des décalages spécifiques disponibles dans Etc, mais le décalage est inverse de ce à quoi on pourrait s'attendre. Etc/GMT-1est UTC + 1 heure. Voirhttps://en.wikipedia.org/wiki/List_of_tz_database_time_zones
npskirk
9

Définissez le fuseau horaire du serveur et utilisez la synchronisation NTP. Voici une meilleure solution pour changer l'heure du serveur.

Pour lister les fuseaux horaires

timedatectl list-timezones

Pour définir le fuseau horaire

sudo timedatectl set-timezone America/New_York

Vérifier le fuseau horaire

timedatectl

Je préfère utiliser le fuseau horaire UTC pour mes serveurs et bases de données. Toutes les conversions doivent être gérées sur le client. Nous pouvons utiliser moment.js côté client.

Il sera également facile de maintenir de nombreuses instances,

Prajyot Khandeparkar
la source
2
Alors que moment.js était une excellente bibliothèque à l'époque, il existe actuellement des alternatives beaucoup plus petites (par exemple date-fns ). Le moment est énorme ; veuillez ne pas le recommander pour les applications clientes.
Dan Dascalescu
5

Je sais que ce fil est très ancien, mais je pense que cela aiderait tous ceux qui ont atterri ici depuis Google comme moi.

Dans GAE Flex (NodeJs), vous pouvez définir la variable d'environnement TZ (celle qui gère tous les fuseaux horaires de date dans l'application) dans le fichier app.yaml, je vous laisse ici un exemple:

app.yaml

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

Voici une réponse pour ceux qui déploient une application Node.js sur Amazon AWS Elastic Beanstalk . Je n'ai vu cela documenté nulle part ailleurs:

Sous Configuration -> Software -> Environment Properties, définissez simplement la paire valeur / clé TZet votre fuseau horaire, par exemple America/Los Angeles, et appliquez la modification.

Vous pouvez vérifier l'effet en sortant new Date().toString()dans votre application Node et en faisant attention au suffixe de fuseau horaire.

pscl
la source
3

À partir du nœud 13 , vous pouvez maintenant définir à plusieurs reprises process.env.TZet il sera reflété dans le fuseau horaire des nouveaux objets Date. Je ne sais pas si j'utiliserais cela dans le code de production, mais cela serait certainement utile dans les tests unitaires.

> 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)'
pseudo
la source
1
Cela fonctionne très bien sous Linux / Mac, mais ne fonctionne pas sous Windows.
Nate le
Non, cela fonctionne aussi pour Windows, utilisezset TZ='UTC' node index.js
user3896501
@ user3896501 non, cette syntaxe définit la variable d'environnement pour l'ensemble du processus - pas lors de l'exécution comme dans l'exemple de l'OP.
Ian Grainger le
2

Vous pouvez prendre le fuseau horaire du moment . Il vous permet de définir votre emplacement et prend également en charge l'heure d'été.

rainerhahnekamp
la source
2
moment est assez lourd pour une tâche comme celle-ci et je ne le recommanderais pas à moins que le comportement souhaité ne soit pas possible via Dateou d'autres modules intégrés.
Chris Williamson
2

Parfois, vous pouvez exécuter du code sur un serveur virtuel ailleurs - Cela peut devenir trouble lors de l'exécution de NODEJS ou d'autres versions.

Voici un correctif qui vous permettra d'utiliser facilement n'importe quel fuseau horaire.

Vérifiez ici la liste des fuseaux horaires

Mettez simplement votre phrase de fuseau horaire entre crochets de votre ligne FORMAT.

Dans ce cas, je convertis EPOCH en 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
la source
1

je travaille avec ce paquet npm unix-system-timezone

Jeriveromartinez
la source
1

Mise à jour pour node.js v13

Comme @Tom l'a souligné, la prise en charge complète d'icu est désormais intégrée à la v13. Ainsi, les étapes de configuration peuvent être omises. Vous pouvez toujours personnaliser la façon dont vous souhaitez créer ou utiliser icu au runtime: https://nodejs.org/api/intl.html

Pour node.js sous Windows , vous pouvez effectuer les opérations suivantes:

  1. Installez full-icu s'il a été installé, qui applique correctement les paramètres régionaux de date

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

  2. Utilisez toLocaleString () dans votre code, par exemple:

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

    Cela produira quelque chose comme: 25/02/2019, 3:19:22 pm. Si vous préférez 24 heures, 'en-GB' produira:25/02/2019, 15:19:22

Pour node.js en tant qu'application Web Azure , en plus des paramètres d'application de WEBSITE_TIME_ZONE, vous devez également définir NODE_ICU_DATA sur, par exemple <your project>\node_modules\full-icu, après avoir effectué le npm i full-icu. L'installation globale du package sur Azure n'est pas suggérée car ce répertoire est temporaire et peut être effacé.

Réf: 1. NodeJS n'applique pas correctement les paramètres régionaux de date

  1. Vous pouvez également créer node.js avec des options intl, plus d'informations ici
Maréchal
la source
1
full-icu est inclus dans les versions standard / officielles de Node à partir de la v13, donc les étapes ci-dessus ne seront plus nécessaires.
Tom
1

Vous pouvez configurer le fuseau horaire global avec la bibliothèque tzdata:

npm install tzdata -y

Après avoir défini votre environnement avec la variable par exemple: TZ = America / Bogota

Et des tests dans votre projet:

new Date()

J'espère vous aider

Cristhian D
la source
1

Vous pouvez appliquer le fuseau horaire du processus Node.js en définissant la variable d'environnement TZsurUTC

Donc, tout le temps sera mesuré en UTC + 00: 00

Liste complète: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones

Exemple package.json:

{
  "scripts": {
    "start": "TZ='UTC' node index.js"
  }
}
user3896501
la source
Cela ne fonctionne pas sous Windows. Vous ne pouvez pas définir la variable d'environnement TZ de cette façon. Et si vous définissez TZ, il ne sera pas reconnu comme le fuseau horaire par défaut de Node.
Nate le
-1

il suffit de définir une variable d'environnement dans votre fichier principal comme index.js ou app.js ou main.js ou quel que soit le nom de votre fichier:

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

cela définira le fuseau horaire qui sera utilisé dans l'ensemble de votre application de nœud

Alireza Mortezaei
la source