Node.js'de varsayılan saat dilimini nasıl ayarlarım?
Node.js'de varsayılan saat dilimini nasıl ayarlarım?
Yanıtlar:
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.
process.env.TZ = 'Europe/Amsterdam'
"güzel, ayarlayabileceğim tüm geçerli değerlerin bir listesini nerede bulabilirim?" ve her seferinde bulamıyorum.
zone.tab
o arşivdeki dosyayı kontrol edin .
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.
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);
Ne yazık ki, ayar process.env.TZ
gerç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.
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 gulp
env 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 .
Etc/UTC
Kullanıyorum Ayrıca belirli ofsetler de mevcut Etc
, ancak ofset beklenenin tersi. Etc/GMT-1
UTC + 1 saattir. Bakınhttps://en.wikipedia.org/wiki/List_of_tz_database_time_zones
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,
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
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 TZ
ve 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 .
Düğüm 13'ten itibaren , artık tekrar tekrar ayarlayabilirsiniz process.env.TZ
ve 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)'
set TZ='UTC' node index.js
An saat dilimi alabilirsin . Konumunuzu ayarlamanıza izin verir ve ayrıca gün ışığından yararlanma saati ile ilgilenir.
Date
veya diğer yerleşik modüller aracılığıyla mümkün olmadığı sürece bunu tavsiye etmem .
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');
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"
}
}
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
bu npm paketi ile çalışıyorum unix-system-timezone
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:
Tam icu yüklendiyse, tarih yerel ayarlarını doğru şekilde uygulayan
npm i full-icu
veya global olarak: npm i -g full-icu
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
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