Node.js'de varsayılan saat dilimini nasıl ayarlayabilirim?


162

Node.js'de varsayılan saat dilimini nasıl ayarlarım?


2
Bunu gerçekten yapamayacağına oldukça eminim. Sistemin saat dilimi ayarlarını değiştirin.
thejh

1
thejh haklı, saat dilimini değiştiremezsiniz. Bir JS zaman kitaplığı (moment.js gibi) kullanın ve bunun yerine saatleri ekleyin / çıkarın.
alessioalex

2
Bunu yapmanın en kolay ve doğru yolu, basitçe sisteminizin saat dilimini değiştirmektir.
Munim

1
Bunlar faydalı yorumlar ancak çoğu zaman sistem yöneticisi değilsiniz;)
Mário de Sá Vera

Yanıtlar:


142

Göre bu google grup iplik , herhangi tarih işlevleri çağrılmadan önce TZ ortam değişkeni ayarlayabilirsiniz. Sadece test ettim ve işe yarıyor.

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

Zaman dilimini daha sonra değiştiremezsiniz, çünkü o zamana kadar Node ortam değişkenini zaten okumuştur.


3
İlginç. Hata tartışması, iş parçacığı ile ilgili bazı sorunlar olduğunu gösteriyor. Ancak örnek, process.env.TZ'yi birçok kez değiştiriyordu. Başlangıçta bir kez ayarlayıp yalnız bırakmak işe yarıyor gibi görünüyor. Yine de, daha esnek ve sağlam kullanım için düğüm zamanı referansı için lorancou'ya teşekkür ederiz.
webjprgm

6
Ne yazık ki, pencerelerde çalışmıyor. Mac os-x ve unix'te iyi çalışıyor
Ritesh Kumar Gupta

23
Güzel cevap. Ne yazık ki, her seferinde process.env.TZ = 'Europe/Amsterdam' "güzel, ayarlayabileceğim tüm geçerli değerlerin bir listesini nerede bulabilirim?" ve her seferinde bulamıyorum.
Rafael Eyng

7
@RafaelEyng IANA (Uluslararası Atanmış Numaralar Birliği), genellikle güncel saat dilimi yapılandırmalarının sağlanması için kullanılır. En son saat dilimi ayarlarını burada bulabilirsiniz: ftp.iana.org/tz/tzdata-latest.tar.gz Olası saat dilimi dizelerine genel bir bakış için zone.tabo arşivdeki dosyayı kontrol edin .
JohannesB

10
@RafaelEyng: JohannesB'nin de belirttiği gibi iana.org/time-zones resmi kaynaktır, ancak veri formatlarıyla çalışmak zordur. IANA veri setinden (şu anda 2017c sürümü) oluşturulan en.wikipedia.org/wiki/List_of_tz_database_time_zones ile çalışmayı çok daha kolay buluyorum .
Peter Rust

68

Benim için en azından Linux ortamında işe yarayan bir başka yaklaşım da Node.js uygulamanızı şu şekilde çalıştırmaktır:

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

Bu, en azından saat diliminin baştan itibaren doğru bir şekilde ayarlandığından emin olmalıdır.


Güzel! Benim için çalışıyor
Rotem

Kültürler için aynısını yapabilir misin?
Jim Aho

Bu, bir saat dilimini zorlamayı kodda yapmaya çalışmaktan çok daha basit hale getirdi .
Dan Dascalescu

37

Herhangi bir harici modül kullanmadan NodeJ'lerde özel saat dilimi Tarih Saatini almak için% 100 çalışan bir örnek:

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

console.log(nDate);


Şaşkınım - buna çok olumlu oy verildi ama önemli bir IMO sorunu var. 13'ten küçük düğüm sürümleri yalnızca 'en-us' için yerel verilere sahiptir; bu, diğer tüm ülkeler için attığı (bazı durumlarda) veya yanlış tarih biçimi verdiği anlamına gelir. Ve çoğu durumda tarih doğru görünür, ancak gün ve ay değiştirilir! Ve Düğüm 13 sadece birkaç hafta önce yayınlandı, bu nedenle bu sorun hemen hemen herkes için geçerli.
Tom

Aşağıdaki @Marshall tarafından verilen cevabın bazı durumlarda bunu çözmenin bir yolunu önerdiğini görüyorum (Lambda ve diğer FaaS'ta işe yaramayacak).
Tom

33

Ne yazık ki, ayar process.env.TZgerçekten iyi çalışmıyor - temelde değişikliğin ne zaman etkili olacağı belirsizdir).

Dolayısıyla, sistemin saat dilimini düğümü başlatmadan önce ayarlamak tek uygun seçeneğinizdir.

Ancak, bunu yapamazsanız, geçici çözüm olarak düğüm saatini kullanmak mümkün olmalıdır : saatlerinizi yerel veya UTC saatinde alın ve bunları istenen saat dilimine dönüştürün. Bkz Nodejs içinde ofset dilimini nasıl kullanılır? detaylar için.


1
npm modül süresi benim için harika çalıştı. utc'yi ayarladım, sonra tüm zamanları utc kullanarak ayarladım, böylece kod farklı saat dilimlerine sahip farklı makineler arasında taşınabilir.
Mark Shust, M.academy'de

Artık bununla ilgili bir sorun yok, değil mi?
Bloke

16

env TZ='Europe/Amsterdam' node server.js@Uhef'in çözümü , uygulamanızın çatallı işlemle çalışmadığı durumlarda işe yarar, ancak çatallı işlemle çalışırken, özellikle uygulamanızı gulp gibi bir oluşturma aracıyla başlattığınızda , komut gulpenv değerlerini alır, ancak gulp not (uygulamanız) tarafından oluşturulan süreç .

Bunu çözmek için yapmanız gerekenler:

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

Bu, TZüzerinde çalıştığınız konsolda başlatılan tüm işlemler için ortam değişkenini ayarlayacak, aynı konsolda gulp komutundan sonra yürütülen tüm alt işlem süreçlerini önek ile export TZ="Europe/Amsterdam";tekrar çalıştırmaya gerek kalmadan ayarlayacaktır .


amsterdam'ın DST'si olduğundan, bu hala GMT +1'de "gece yarısı UTC" ye ulaşmak için istenen tz mi?
FlavourScape

1
@FlavorScape Etc/UTC Kullanıyorum Ayrıca belirli ofsetler de mevcut Etc, ancak ofset beklenenin tersi. Etc/GMT-1UTC + 1 saattir. Bakınhttps://en.wikipedia.org/wiki/List_of_tz_database_time_zones
npskirk

9

Sunucu saat dilimini ayarlayın ve NTP senkronizasyonunu kullanın. İşte sunucu saatini değiştirmek için daha iyi bir çözüm.

Saat dilimlerini listelemek için

timedatectl list-timezones

Saat dilimini ayarlamak için

sudo timedatectl set-timezone America/New_York

Saat dilimini doğrulayın

timedatectl

Sunucularım ve veritabanları için UTC saat dilimini kullanmayı tercih ediyorum. Herhangi bir dönüşüm müşteride ele alınmalıdır. Moment.js'yi istemci tarafında kullanabiliriz.

Pek çok örneği korumak da kolay olacak,


2
Moment.js, eskiden harika bir kitaplık olsa da, şu anda çok daha küçük alternatifler var (örneğin tarih-fns ). Moment çok büyük ; lütfen istemci uygulamaları için önermeyin.
Dan Dascalescu

5

Bu iş parçacığının çok eski olduğunu biliyorum, ancak bunun benim gibi google'dan buraya gelen herkese yardımcı olacağını düşünüyorum.

GAE Flex'te (NodeJs), app.yaml dosyasında TZ ortam değişkenini (uygulamadaki tüm tarih saat dilimlerini yöneten) ayarlayabilirsiniz, size burada bir örnek bırakıyorum:

app.yaml

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

5

Amazon AWS Elastic Beanstalk'a bir Node.js uygulaması dağıtanlar için bir cevap . Bunun başka hiçbir yerde belgelendiğini görmedim:

Altında Configuration -> Software -> Environment Properties, basitçe anahtar değer çiftini TZve saat diliminizi ayarlayın, ör America/Los Angeles. Ve Değişikliği uygulayın.

new Date().toString()Node uygulamanızda çıktı oluşturarak ve saat dilimi sonekine dikkat ederek etkiyi doğrulayabilirsiniz .


4

Düğüm 13'ten itibaren , artık tekrar tekrar ayarlayabilirsiniz process.env.TZve bu, yeni Date nesnelerinin saat diliminde yansıtılacaktır. Bunu üretim kodunda kullanır mıyım bilmiyorum ama kesinlikle birim testlerinde faydalı olacaktır.

> 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
Bu, Linux / Mac'te harika çalışıyor, ancak Windows'ta çalışmıyor.
Nate

Hayır, Windows için de çalışıyor, kullanınset TZ='UTC' node index.js
user3896501

@ user3896501 hayır, bu sözdizimi tüm süreç için env değişkenini ayarlar - OP'nin örneğindeki gibi çalışırken değil .
Ian Grainger

2

An saat dilimi alabilirsin . Konumunuzu ayarlamanıza izin verir ve ayrıca gün ışığından yararlanma saati ile ilgilenir.


2
an, böyle bir görev için oldukça ağırdır ve istediğiniz davranış Dateveya diğer yerleşik modüller aracılığıyla mümkün olmadığı sürece bunu tavsiye etmem .
Chris Williamson

2

Bazen başka bir yerde sanal bir sunucuda kod çalıştırıyor olabilirsiniz - Bu, NODEJS veya diğer tatları çalıştırırken çamurlu olabilir.

İşte herhangi bir saat dilimini kolayca kullanmanıza izin verecek bir düzeltme.

Saat dilimleri listesi için burayı kontrol edin

Saat dilimi ifadenizi FORMAT satırınızın parantezleri arasına koyun.

Bu durumda - EPOCH'u Doğu'ya dönüştürüyorum.

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

2

Ortam değişkenini şu TZşekilde ayarlayarak Node.js işlem zaman dilimini uygulayabilirsiniz:UTC

Yani tüm zamanlar UTC + 00: 00 olarak ölçülecek

Tam liste: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones

Örnek package.json:

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

2
Bu, Windows'ta çalışmaz. TZ env değişkenini bu şekilde ayarlayamazsınız. Ve TZ'yi ayarlarsanız, Düğümün varsayılan saat dilimi olarak tanınmaz.
Nate

2

ana dosyanızda index.js veya app.js veya main.js gibi ortam değişkenini veya dosya adınız ne olursa olsun ayarlayın:

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

bu, tüm düğüm uygulamanızda kullanılacak saat dilimini ayarlayacaktır



1

Node.js v13 güncellemesi

@ Tom'un belirttiği gibi, tam icu desteği artık v13'te oluşturulmuştur. Bu nedenle kurulum adımları atlanabilir. Hala çalışma zamanında icu'yu nasıl oluşturmak veya kullanmak istediğinizi özelleştirebilirsiniz: https://nodejs.org/api/intl.html

Windows'ta node.js için aşağıdakileri yapabilirsiniz:

  1. Tam icu yüklendiyse, tarih yerel ayarlarını doğru şekilde uygulayan

    npm i full-icu veya global olarak: npm i -g full-icu

  2. Kodunuzda toLocaleString () kullanın, örneğin:

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

    Bu gibi bir şey üretecektir: 25/02/2019, 3:19:22 pm. 24 saati tercih ederseniz, 'en-GB' şunları üretecektir:25/02/2019, 15:19:22

Azure web uygulaması olarak node.js için WEBSITE_TIME_ZONE uygulamasının uygulama ayarlarına ek olarak, NODE_ICU_DATA'yı da, örneğin <your project>\node_modules\full-icu, npm i full-icu yaptıktan sonra, örneğin , olarak ayarlamanız gerekir . Paketin genel olarak Azure'a yüklenmesi, bu dizin geçici olduğundan ve silinebileceğinden önerilmemektedir.

Referans: 1. NodeJS, tarih yerel ayarlarını düzgün uygulamıyor

  1. Ayrıca, intl seçenekleriyle node.js de oluşturabilirsiniz, daha fazla bilgiyi burada bulabilirsiniz

1
full-icu, v13'ten itibaren Node'un standart / resmi yapılarına dahil edildiğinden, yukarıdaki adımlar artık gerekli olmayacaktır.
Tom

1

Global saat dilimini tzdata kitaplığıyla yapılandırabilirsiniz:

npm install tzdata -y

Ortamınızı değişkenle ayarladıktan sonra, örneğin: TZ = America / Bogota

Ve projenizde test edin:

new Date()

Umarım sana yardım eder

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.