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.
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).
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.
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.
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:
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.
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'>(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)'
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.
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:
Instal full-icu jika telah diinstal, yang berlaku tanggal lokal dengan benar
npm i full-icu
atau secara global: npm i -g full-icu
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.
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
Jawaban:
Menurut utas grup Google ini , Anda dapat mengatur variabel lingkungan TZ sebelum memanggil fungsi tanggal apa pun. Hanya mengujinya dan berfungsi.
Namun Anda tidak dapat mengubah zona waktu, karena saat itu Node sudah membaca variabel lingkungan.
sumber
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.zone.tab
file di arsip itu.Pendekatan lain yang sepertinya paling cocok untuk saya di lingkungan Linux adalah menjalankan aplikasi Node.js Anda seperti ini:
Ini setidaknya harus memastikan bahwa zona waktu sudah diatur dengan benar dari awal.
sumber
Berikut adalah contoh kerja 100% untuk mendapatkan zona waktu kustom Tanggal Waktu di NodeJs tanpa menggunakan modul eksternal:
sumber
Sayangnya, pengaturan
process.env.TZ
tidak 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.
sumber
Solusi
env TZ='Europe/Amsterdam' node server.js
dari @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 , perintahgulp
akan mengambil nilai env, tetapi proses yang dibuat oleh tegukan bukan (aplikasi Anda).Untuk mengatasi ini, Anda harus melakukan:
Ini akan mengatur
TZ
variabel 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 awalanexport TZ="Europe/Amsterdam";
lagi.sumber
Etc/UTC
Ada juga offset khusus yang tersedia diEtc
, tetapi offset adalah kebalikan dari apa yang diharapkan.Etc/GMT-1
adalah UTC + 1 jam. Lihathttps://en.wikipedia.org/wiki/List_of_tz_database_time_zones
Tetapkan zona waktu server dan gunakan sinkronisasi NTP. Berikut adalah satu solusi yang lebih baik untuk mengubah waktu server.
Untuk membuat daftar zona waktu
Untuk mengatur zona waktu
Verifikasi zona waktu
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,
sumber
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
sumber
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 kunciTZ
dan 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.sumber
Pada Node 13 , Anda sekarang dapat berulang kali mengatur
process.env.TZ
dan 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.sumber
set TZ='UTC' node index.js
Anda dapat mengambil zona waktu sesaat . Ini memungkinkan Anda mengatur lokasi Anda dan juga mengurus waktu musim panas.
sumber
Date
atau modul builtin lainnya.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.
sumber
saya bekerja dengan paket npm ini unix-system-timezone
sumber
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:
Instal full-icu jika telah diinstal, yang berlaku tanggal lokal dengan benar
npm i full-icu
atau secara global:npm i -g full-icu
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
sumber
Anda dapat mengkonfigurasi zona waktu global dengan tzdata perpustakaan:
Setelah mengatur lingkungan Anda dengan variabel misalnya: TZ = America / Bogota
Dan pengujian dalam proyek Anda:
Saya harap membantu kamu
sumber
Anda bisa menerapkan zona waktu proses Node.js dengan mengatur variabel lingkungan
TZ
keUTC
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:
sumber
cukup setel variabel lingkungan di file utama Anda seperti index.js atau app.js atau main.js atau apa pun nama file Anda:
ini akan mengatur zona waktu yang akan digunakan di seluruh aplikasi simpul Anda
sumber