Bagaimana cara mengatur zona waktu default di node.js?


154

Bagaimana cara mengatur zona waktu default di node.js?


2
Cukup yakin Anda tidak bisa melakukan itu. Ubah pengaturan zona waktu sistem.
thejh

1
Jika benar, Anda tidak dapat mengubah zona waktu. Gunakan perpustakaan waktu JS (seperti moment.js) dan tambahkan / kurangi jam sebagai gantinya.
alessioalex

2
Cara termudah dan tepat untuk melakukan ini adalah dengan mengubah zona waktu sistem Anda.
Munim

1
Ini adalah komentar yang berguna tetapi sebagian besar waktu Anda bukan manajer sistem;)
Mário de Sá Vera

Jawaban:


136

Menurut utas grup Google ini , Anda dapat mengatur variabel lingkungan TZ sebelum memanggil fungsi tanggal apa pun. Hanya mengujinya dan berfungsi.

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

Namun Anda tidak dapat mengubah zona waktu, karena saat itu Node sudah membaca variabel lingkungan.


3
Itu menarik. Diskusi bug menyarankan beberapa masalah dengan threading. Tetapi contohnya adalah mengubah process.env.TZ beberapa kali. Sepertinya mengaturnya sekali di awal dan membiarkannya bekerja. Terima kasih lorancou untuk referensi ke simpul-waktu, untuk penanganan yang lebih fleksibel dan kuat.
webjprgm

6
Sayangnya, itu tidak berfungsi di windows. Bekerja dengan baik di mac os-x dan unix
Ritesh Kumar Gupta

15
Jawaban bagus. Sayangnya, setiap kali saya melihat sesuatu seperti process.env.TZ = 'Europe/Amsterdam' saya pikir "bagus, sekarang di mana saya dapat menemukan daftar semua nilai yang valid yang dapat saya tetapkan?" dan saya tidak menemukannya, setiap saat.
Rafael Eyng

5
@RafaelEyng IANA (International Assigned Numbers Association) sering digunakan untuk penyediaan konfigurasi zona waktu terkini. Anda dapat menemukan pengaturan zona waktu terbaru di sini: ftp.iana.org/tz/tzdata-latest.tar.gz Untuk ikhtisar tentang string zona waktu yang mungkin, periksa zone.tabfile di arsip itu.
JohannesB

9
@RafaelEyng: seperti yang disebutkan JohannesB iana.org/time-zones adalah sumber resmi, tetapi format datanya sulit untuk diolah. Saya merasa jauh lebih mudah untuk bekerja dari en.wikipedia.org/wiki/List_of_tz_database_time_zones , yang dibangun dari dataset IANA (saat ini versi 2017c).
Peter Rust

66

Pendekatan lain yang sepertinya paling cocok untuk saya di lingkungan Linux adalah menjalankan aplikasi Node.js Anda seperti ini:

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

Ini setidaknya harus memastikan bahwa zona waktu sudah diatur dengan benar dari awal.


Bagus! Bekerja untuk saya
Rotem

Bisakah Anda melakukan hal yang sama untuk budaya?
Jim Aho

Ini membuatnya lebih mudah untuk memaksa zona waktu, daripada mencoba melakukannya dalam kode .
Dan Dascalescu

33

Berikut adalah contoh kerja 100% untuk mendapatkan zona waktu kustom Tanggal Waktu di NodeJs tanpa menggunakan modul eksternal:

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

console.log(nDate);


Saya bingung - ini sangat terbalik tetapi memiliki masalah kritis IMO. Versi Node <13 hanya memiliki data lokal untuk 'en-us', yang berarti data tersebut melempar (dalam beberapa kasus) atau memberikan format tanggal yang salah untuk setiap negara. Dan dalam banyak kasus tanggal akan terlihat benar tetapi hari & bulan ditukar! Dan Node 13 baru saja dirilis beberapa minggu yang lalu sehingga masalah ini berlaku untuk hampir semua orang.
Tom

Saya melihat bahwa jawaban oleh @ Marshall di bawah ini menyarankan cara untuk menyelesaikan ini dalam beberapa situasi (tidak akan bekerja di Lambda dan FaaS lainnya).
Tom

31

Sayangnya, pengaturan process.env.TZtidak berfungsi dengan baik - pada dasarnya pengaturan tidak pasti saat perubahan akan efektif).

Jadi pengaturan zona waktu sistem sebelum memulai node adalah satu-satunya pilihan yang tepat.

Namun, jika Anda tidak bisa melakukan itu, Anda harus menggunakan simpul-waktu sebagai solusi: dapatkan waktu Anda dalam waktu lokal atau UTC, dan ubah ke zona waktu yang diinginkan. Lihat Bagaimana menggunakan offset zona waktu di Nodejs? untuk detail.


1
waktu modul npm bekerja bagus untuk saya. saya atur ke utc, lalu atur setiap saat menggunakan utc, jadi kode ini portabel antara mesin yang berbeda dengan zona waktu yang berbeda.
Mark Shust di M.academy

Tidak ada masalah dengan ini lagi, kan?
Bloke

16

Solusi env TZ='Europe/Amsterdam' node server.jsdari @uhef bekerja dalam kasus di mana aplikasi Anda tidak bekerja dengan proses bercabang, tetapi ketika Anda bekerja dengan proses bercabang, khususnya ketika Anda meluncurkan aplikasi Anda dengan alat bangunan seperti tegukan , perintah gulpakan mengambil nilai env, tetapi proses yang dibuat oleh tegukan bukan (aplikasi Anda).

Untuk mengatasi ini, Anda harus melakukan:

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

Ini akan mengatur TZvariabel lingkungan untuk semua proses yang dimulai di konsol yang sedang Anda kerjakan, termasuk semua proses selanjutnya yang dijalankan setelah perintah tegukan dalam konsol yang sama tanpa perlu menjalankannya dengan awalan export TZ="Europe/Amsterdam";lagi.


karena amsterdam memiliki DST, apakah ini yang masih diinginkan untuk mencapai "tengah malam UTC" pada GMT +1?
FlavourScape

1
@FlavorScape Saya menggunakan Etc/UTC Ada juga offset khusus yang tersedia di Etc, tetapi offset adalah kebalikan dari apa yang diharapkan. Etc/GMT-1adalah UTC + 1 jam. Lihathttps://en.wikipedia.org/wiki/List_of_tz_database_time_zones
npskirk

9

Tetapkan zona waktu server dan gunakan sinkronisasi NTP. Berikut adalah satu solusi yang lebih baik untuk mengubah waktu server.

Untuk membuat daftar zona waktu

timedatectl list-timezones

Untuk mengatur zona waktu

sudo timedatectl set-timezone America/New_York

Verifikasi zona waktu

timedatectl

Saya lebih suka menggunakan zona waktu UTC untuk server dan database saya. Setiap konversi harus ditangani pada klien. Kita dapat memanfaatkan moment.js di sisi klien.

Akan mudah untuk memelihara banyak contoh juga,


2
Sementara moment.js adalah perpustakaan yang hebat pada masa itu, ada alternatif yang jauh lebih kecil saat ini (misalnya date-fns ). Momen sangat besar ; tolong jangan rekomendasikan untuk aplikasi klien.
Dan Dascalescu

5

Saya tahu utas ini sangat lama, tetapi saya pikir ini akan membantu siapa pun yang mendarat di sini dari google seperti saya.

Dalam GAE Flex (NodeJs), Anda dapat mengatur variabel lingkungan TZ (yang mengatur semua zona waktu tanggal dalam aplikasi) dalam file app.yaml, saya memberikan contoh di sini:

app.yaml

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

5

Berikut jawaban bagi mereka yang menggunakan aplikasi Node.js ke Amazon AWS Elastic Beanstalk . Saya belum melihat ini didokumentasikan di tempat lain:

Di bawah Configuration -> Software -> Environment Properties, cukup atur pasangan nilai kunci TZdan zona waktu Anda mis. America/Los Angeles, Dan Terapkan perubahan.

Anda dapat memverifikasi efeknya dengan mengeluarkan new Date().toString()di aplikasi Node Anda dan memperhatikan akhiran zona waktu.


3

Pada Node 13 , Anda sekarang dapat berulang kali mengatur process.env.TZdan itu akan tercermin dalam zona waktu objek Tanggal baru. Saya tidak tahu apakah saya akan menggunakan ini dalam kode produksi tetapi pasti akan berguna dalam unit test.

> 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
Ini berfungsi baik di Linux / Mac, tetapi tidak berfungsi di Windows.
Nate

Tidak itu berfungsi untuk Windows juga, gunakanset TZ='UTC' node index.js
user3896501

@ user3896501 tidak, sintaks itu menetapkan env var untuk seluruh proses - tidak saat berjalan seperti pada contoh OP.
Ian Grainger

2

Anda dapat mengambil zona waktu sesaat . Ini memungkinkan Anda mengatur lokasi Anda dan juga mengurus waktu musim panas.


2
saat ini cukup berat untuk tugas seperti ini dan saya tidak akan merekomendasikan itu kecuali perilaku yang Anda inginkan tidak mungkin melalui Dateatau modul builtin lainnya.
Chris Williamson

2

Kadang-kadang Anda mungkin menjalankan kode pada server virtual di tempat lain - Itu bisa menjadi becek saat menjalankan NODEJS atau rasa lainnya.

Ini adalah perbaikan yang memungkinkan Anda menggunakan zona waktu dengan mudah.

Periksa di sini untuk daftar zona waktu

Cukup masukkan frasa zona waktu Anda di dalam kurung baris FORMAT Anda.

Dalam hal ini - saya mengonversi EPOCH ke 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');


1

Perbarui untuk node.js v13

Seperti yang ditunjukkan @Tom, dukungan icu penuh dibangun di v13 sekarang. Jadi langkah-langkah pengaturan bisa dihilangkan. Anda masih dapat menyesuaikan bagaimana Anda ingin membangun atau menggunakan icu di runtime: https://nodejs.org/api/intl.html

Untuk node.js di Windows , Anda dapat melakukan hal berikut:

  1. Instal full-icu jika telah diinstal, yang berlaku tanggal lokal dengan benar

    npm i full-icu atau secara global: npm i -g full-icu

  2. Gunakan toLocaleString () dalam kode Anda, misalnya:

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

    Ini akan menghasilkan sesuatu seperti: 25/02/2019, 3:19:22 pm. Jika Anda lebih suka 24 jam, 'en-GB' akan menghasilkan:25/02/2019, 15:19:22

Untuk node.js sebagai aplikasi web Azure , selain pengaturan aplikasi WEBSITE_TIME_ZONE, Anda juga perlu mengatur NODE_ICU_DATA ke eg<your project>\node_modules\full-icu , tentu saja setelah Anda melakukan npm i full-icu. Menginstal paket secara global di Azure tidak disarankan karena direktori itu bersifat sementara dan dapat dihapus.

Ref: 1. NodeJS tidak menerapkan tanggal lokal dengan benar

  1. Anda juga dapat membangun node.js dengan opsi intl, informasi lebih lanjut di sini

1
full-icu sudah termasuk dalam build standar / resmi Node pada v13 sehingga langkah-langkah di atas tidak lagi diperlukan.
Tom

1

Anda dapat mengkonfigurasi zona waktu global dengan tzdata perpustakaan:

npm install tzdata -y

Setelah mengatur lingkungan Anda dengan variabel misalnya: TZ = America / Bogota

Dan pengujian dalam proyek Anda:

new Date()

Saya harap membantu kamu


1

Anda bisa menerapkan zona waktu proses Node.js dengan mengatur variabel lingkungan TZkeUTC

Jadi semua waktu akan diukur dalam UTC + 00: 00

Daftar lengkap: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones

Contoh package.json:

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

Ini tidak berfungsi di Windows. Anda tidak dapat mengatur TZ env var dengan cara ini. Dan jika Anda menetapkan TZ, itu tidak akan dikenali sebagai zona waktu default Node.
Nate

-1

cukup setel variabel lingkungan di file utama Anda seperti index.js atau app.js atau main.js atau apa pun nama file Anda:

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

ini akan mengatur zona waktu yang akan digunakan di seluruh aplikasi simpul Anda

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.