ฉันจะตั้งค่าเขตเวลาเริ่มต้นใน node.js ได้อย่างไร


154

ฉันจะตั้งค่าเขตเวลาเริ่มต้นใน node.js ได้อย่างไร


2
ค่อนข้างแน่ใจว่าคุณไม่สามารถทำเช่นนั้นได้ เปลี่ยนการตั้งค่าเขตเวลาของระบบ
thejh

1
thejh ถูกต้องคุณไม่สามารถเปลี่ยนเขตเวลาได้ ใช้ไลบรารีเวลา JS (เช่น moment.js) และเพิ่ม / ลบชั่วโมงแทน
alessioalex

2
วิธีที่ง่ายที่สุดและถูกต้องคือการเปลี่ยนเขตเวลาของระบบของคุณ
Munim

1
สิ่งเหล่านี้เป็นความคิดเห็นที่มีประโยชน์ แต่ส่วนใหญ่คุณไม่ใช่ผู้จัดการระบบ)
Mário de Sá Vera

คำตอบ:


135

ตามกลุ่มด้าย google นี้คุณสามารถตั้งค่าตัวแปรสภาพแวดล้อม TZ ก่อนที่จะเรียกฟังก์ชั่นวันที่ใด ๆ เพิ่งทดสอบและใช้งานได้

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

คุณไม่สามารถเปลี่ยนเขตเวลาได้ในภายหลังเนื่องจากตั้งแต่นั้นโหนดได้อ่านตัวแปรสภาพแวดล้อมแล้ว


3
นั่นดูน่าสนใจ. การอภิปรายข้อผิดพลาดแสดงให้เห็นว่ามันเป็นปัญหาของเธรด แต่ตัวอย่างก็เปลี่ยน process.env.TZ หลายครั้ง ดูเหมือนว่าการตั้งค่าเพียงครั้งเดียวในตอนเริ่มต้นและปล่อยให้มันทำงานตามลำพัง ขอบคุณ lorancou สำหรับการอ้างอิงถึง node-time แต่สำหรับการจัดการที่ยืดหยุ่นและมีประสิทธิภาพมากขึ้น
webjprgm

6
น่าเศร้าที่มันไม่ทำงานใน windows ทำงานได้ดีใน mac os-x และ unix
Ritesh Kumar Gupta

15
คำตอบที่ดี น่าเสียดายที่ทุกครั้งที่ฉันเห็นสิ่งที่process.env.TZ = 'Europe/Amsterdam' ฉันคิดว่า "ดีตอนนี้ฉันสามารถหารายการค่าที่ใช้ได้ทั้งหมดที่ฉันสามารถตั้งค่าได้" และฉันไม่พบมันทุกครั้ง
Rafael Eyng

5
@RafaelEyng IANA (International Assigned Numbers Association) มักใช้สำหรับการกำหนดค่าเขตเวลาที่ทันสมัย คุณสามารถค้นหาการตั้งค่าเขตเวลาล่าสุดได้ที่นี่: ftp.iana.org/tz/tzdata-latest.tar.gzสำหรับภาพรวมของสตริงเขตเวลาที่เป็นไปได้ให้ตรวจสอบzone.tabไฟล์ในไฟล์เก็บถาวรนั้น
JohannesB

8
@RafaelEyng: ตามที่ JohannesB กล่าวถึง iana.org/time-zones เป็นแหล่งข้อมูลอย่างเป็นทางการ แต่รูปแบบข้อมูลของพวกเขานั้นยากที่จะทำงาน ฉันพบว่าทำงานได้ง่ายกว่าจากen.wikipedia.org/wiki/List_of_tz_database_time_zonesซึ่งสร้างจากชุดข้อมูล IANA (ปัจจุบันเป็นรุ่น 2017c)
Peter Rust

66

อีกวิธีหนึ่งที่ดูเหมือนจะทำงานกับฉันอย่างน้อยในสภาพแวดล้อม Linux คือการเรียกใช้แอปพลิเคชัน Node.js ของคุณเช่นนี้

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

อย่างน้อยที่สุดควรตรวจสอบให้แน่ใจว่ามีการตั้งค่าเขตเวลาอย่างถูกต้องตั้งแต่ต้น


ดี! ใช้งานได้สำหรับฉัน
Rotem

คุณสามารถทำเช่นเดียวกันกับวัฒนธรรมได้หรือไม่?
Jim Aho

นี่เองที่ทำให้มันวิธีที่ง่ายที่จะบังคับให้เขตเวลากว่าพยายามที่จะทำเช่นนั้นในรหัส
Dan Dascalescu

33

นี่คือตัวอย่างการทำงาน 100% สำหรับการรับค่า Time Date Date Time ใน NodeJs โดยไม่ต้องใช้โมดูลภายนอก:

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

console.log(nDate);


ฉันงงงวย - นี่เป็น upvoted มาก แต่มีปัญหาที่สำคัญ IMO โหนดเวอร์ชัน <13 มีข้อมูลตำแหน่งที่ตั้งสำหรับ 'en-us' เท่านั้นซึ่งหมายความว่ามีการโยน (ในบางกรณี) หรือให้รูปแบบวันที่ผิดสำหรับประเทศอื่น ๆ และในหลายกรณีวันที่จะดูถูกต้อง แต่วันและเดือนเปลี่ยน! และโหนด 13 เพิ่งเปิดตัวเมื่อไม่กี่สัปดาห์ที่ผ่านมาดังนั้นปัญหานี้จึงเกิดขึ้นกับทุกคน
ทอม

ฉันเห็นว่าคำตอบโดย @Marshall ด้านล่างแนะนำวิธีการแก้ปัญหานี้ในบางสถานการณ์ (จะไม่ทำงานใน Lambda และ FaaS อื่น ๆ )
Tom

31

น่าเสียดายที่การตั้งค่าprocess.env.TZทำงานได้ไม่ดีนัก - โดยทั่วไปแน่นอน)

ดังนั้นการตั้งค่าเขตเวลาของระบบก่อนเริ่มต้นโหนดเป็นตัวเลือกที่เหมาะสมเท่านั้น

อย่างไรก็ตามหากคุณไม่สามารถทำได้คุณควรใช้โหนดเวลาเป็นวิธีแก้ไขปัญหา: รับเวลาของคุณในเวลาท้องถิ่นหรือเวลา UTC และแปลงให้เป็นเขตเวลาที่ต้องการ ดูวิธีใช้เขตเวลาชดเชยใน Nodejs? สำหรับรายละเอียด


1
เวลาของโมดูล npm ใช้งานได้ดีสำหรับฉัน ฉันตั้งค่าเป็น utc จากนั้นตั้งค่าทุกครั้งโดยใช้ utc ดังนั้นโค้ดจึงสามารถพกพาได้ระหว่างเครื่องต่าง ๆ ที่มีเขตเวลาที่แตกต่างกัน
Mark Shust ที่ M.academy

ไม่มีปัญหาอีกต่อไปแล้วใช่ไหม?
Bloke

16

โซลูชันenv TZ='Europe/Amsterdam' node server.jsจาก @uhef ทำงานในกรณีที่แอปของคุณไม่ทำงานกับกระบวนการแยก แต่เมื่อคุณทำงานด้วยกระบวนการแยกโดยเฉพาะเมื่อคุณเปิดแอปด้วยเครื่องมือสร้างเช่นอึกคำสั่งgulpจะใช้ค่า env แต่ กระบวนการที่สร้างโดยอึกไม่ได้ (แอพของคุณ)

เพื่อแก้ปัญหานี้คุณต้องทำ:

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

นี้จะตั้งค่าTZตัวแปรสภาพแวดล้อมสำหรับกระบวนการทั้งหมดที่เริ่มต้นในคอนโซลที่คุณกำลังทำงานอยู่รวมถึงกระบวนการลำดับทั้งหมดที่ดำเนินการหลังจากคำสั่ง gulp ในคอนโซลเดียวกันโดยไม่จำเป็นต้องดำเนินการด้วยคำนำหน้าexport TZ="Europe/Amsterdam";อีกครั้ง


เนื่องจากอัมสเตอร์ดัมมี DST นี่เป็น tz ที่ต้องการเพื่อให้ได้ "เที่ยงคืน UTC" ที่ GMT +1 หรือไม่
FlavourScape

1
@ FlavourScape ฉันใช้Etc/UTC นอกจากนี้ยังมีการชดเชยเฉพาะที่มีอยู่ในEtcแต่ชดเชยตรงข้ามกับสิ่งที่เราคาดหวัง Etc/GMT-1คือ UTC + 1 ชั่วโมง ดูhttps://en.wikipedia.org/wiki/List_of_tz_database_time_zones
npskirk

9

ตั้งค่าเขตเวลาของเซิร์ฟเวอร์และใช้การซิงค์ NTP นี่คือทางออกที่ดีกว่าในการเปลี่ยนเวลาของเซิร์ฟเวอร์

ในการแสดงรายการเขตเวลา

timedatectl list-timezones

เพื่อกำหนดเขตเวลา

sudo timedatectl set-timezone America/New_York

ยืนยันเขตเวลา

timedatectl

ฉันชอบใช้เขตเวลา UTC สำหรับเซิร์ฟเวอร์และฐานข้อมูลของฉัน การแปลงใด ๆ จะต้องจัดการกับลูกค้า เราสามารถใช้ประโยชน์จาก moment.js ในฝั่งไคลเอ็นต์

มันจะง่ายต่อการรักษาหลาย ๆ ครั้งเช่นกัน


2
ในขณะที่ moment.js เป็นห้องสมุดที่ยอดเยี่ยมในสมัยนั้นมีทางเลือกน้อยกว่าในปัจจุบัน (เช่นdate-fns ) ช่วงเวลาที่มีขนาดใหญ่มาก ; โปรดอย่าแนะนำสำหรับแอปพลิเคชันไคลเอนต์
Dan Dascalescu

5

ฉันรู้ว่ากระทู้นี้เก่ามาก แต่ฉันคิดว่านี่จะช่วยให้ทุกคนที่ลงจอดที่นี่จาก google เช่นฉัน

ใน GAE Flex (NodeJs) คุณสามารถตั้งค่าตัวแปรสภาพแวดล้อม TZ (อันที่จัดการเขตเวลาวันที่ทั้งหมดในแอพ) ในไฟล์ app.yaml ผมฝากตัวอย่างไว้ที่นี่:

app.yaml

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

5

นี่คือคำตอบสำหรับผู้ที่ปรับใช้แอพลิเคชัน Node.js ที่ Amazon AWS ยืดหยุ่นฝักถั่ว ฉันไม่ได้เห็นเอกสารนี้ที่อื่น:

ภายใต้Configuration -> Software -> Environment Propertiesเพียงตั้งค่าคู่คีย์TZและเขตเวลาของคุณเช่นAmerica/Los Angelesและใช้การเปลี่ยนแปลง

คุณสามารถตรวจสอบผลกระทบได้ด้วยการแสดงผลnew Date().toString()ในแอพ Node ของคุณและให้ความสนใจกับคำต่อท้ายโซนเวลา


3

ณ โหนด 13ตอนนี้คุณสามารถตั้งค่าซ้ำ ๆprocess.env.TZและมันจะปรากฏในเขตเวลาของวัตถุวันที่ใหม่ ฉันไม่รู้ว่าฉันจะใช้สิ่งนี้ในรหัสการผลิตหรือไม่ แต่มันจะมีประโยชน์ในการทดสอบหน่วย

> 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
มันใช้งานได้ดีบน Linux / Mac แต่ไม่สามารถใช้งานบน Windows
เนท

ไม่ทำงานสำหรับ Windows เช่นกันใช้set TZ='UTC' node index.js
user3896501

@ user3896501 ไม่ไวยากรณ์นั้นตั้ง env var สำหรับกระบวนการทั้งหมด - ไม่ใช่ในขณะที่ทำงานในตัวอย่างของ OP
Ian Grainger

2

คุณสามารถใช้เขตเวลาสักครู่ มันช่วยให้คุณตั้งค่าตำแหน่งของคุณและยังช่วยประหยัดเวลาตามฤดูกาล


2
ช่วงเวลานั้นค่อนข้างหนาสำหรับงานแบบนี้และฉันจะไม่แนะนำเว้นแต่พฤติกรรมที่คุณต้องการไม่สามารถทำได้ผ่านDateหรือโมดูลในตัวอื่น ๆ
Chris Williamson

2

บางครั้งคุณอาจกำลังเรียกใช้รหัสบนเซิร์ฟเวอร์เสมือนที่อื่น - ซึ่งอาจเป็นโคลนเมื่อใช้ NODEJS หรือรสชาติอื่น ๆ

นี่คือการแก้ไขที่จะช่วยให้คุณใช้เขตเวลาใดก็ได้อย่างง่ายดาย

ตรวจสอบที่นี่เพื่อดูรายการเขตเวลา

เพียงใส่วลีเขตเวลาของคุณในวงเล็บของบรรทัด FORMAT ของคุณ

ในกรณีนี้ - ฉันกำลังเปลี่ยนยุคเป็นตะวันออก

//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

อัพเดตสำหรับ node.js v13

ตามที่ @Tom ชี้ให้เห็นว่าการสนับสนุน icu เต็มรูปแบบถูกสร้างขึ้นใน v13 ในขณะนี้ ดังนั้นสามารถข้ามขั้นตอนการตั้งค่าได้ คุณยังสามารถปรับแต่งวิธีที่คุณต้องการสร้างหรือใช้ icu ในขณะใช้งานจริง: https://nodejs.org/api/intl.html

สำหรับ node.js บน Windowsคุณสามารถทำสิ่งต่อไปนี้:

  1. ติดตั้ง ICU แบบเต็มหากมีการติดตั้งซึ่งใช้ตำแหน่งวันที่อย่างถูกต้อง

    npm i full-icu หรือทั่วโลก: npm i -g full-icu

  2. ใช้ toLocaleString () ในรหัสของคุณเช่น:

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

    สิ่งนี้จะสร้างสิ่งที่ต้องการ: 25/02/2019, 3:19:22 pm. หากคุณต้องการ 24 ชั่วโมง 'en-GB' จะผลิต:25/02/2019, 15:19:22

สำหรับ node.js เป็น Azure web appนอกเหนือจากการตั้งค่าแอปพลิเคชันของ WEBSITE_TIME_ZONE คุณต้องตั้งค่า NODE_ICU_DATA เช่น<your project>\node_modules\full-icuแน่นอนหลังจากคุณทำ npm i เต็มแล้ว ไม่แนะนำให้ติดตั้งแพ็กเกจแบบโกลบอลบน Azure เนื่องจากไดเร็กทอรีนั้นเป็นแบบชั่วคราวและสามารถลบออกได้

Ref: 1. NodeJS ใช้ภาษาไม่ตรงกับวันที่

  1. คุณยังสามารถสร้าง node.js พร้อมตัวเลือก intl ข้อมูลเพิ่มเติมที่นี่

1
full-icu ถูกรวมอยู่ในการสร้างมาตรฐาน / เป็นทางการของ Node ณ v13 ดังนั้นขั้นตอนข้างต้นจะไม่จำเป็นอีกต่อไป
Tom

1

คุณสามารถกำหนดค่าเขตเวลาทั่วโลกด้วยไลบรารี tzdata:

npm install tzdata -y

หลังจากตั้งค่าสภาพแวดล้อมของคุณด้วยตัวแปรเช่น: TZ = America / Bogota

และการทดสอบในโครงการของคุณ:

new Date()

ฉันหวังว่าจะเป็นประโยชน์


1

คุณสามารถบังคับใช้เขตเวลากระบวนการ Node.js โดยการตั้งค่าตัวแปรสภาพแวดล้อมTZเป็นUTC

ดังนั้นเวลาทั้งหมดจะถูกวัดใน UTC + 00: 00

รายการทั้งหมด: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones

ตัวอย่าง package.json:

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

สิ่งนี้ไม่ทำงานบน Windows คุณไม่สามารถตั้งค่า TZ env var ด้วยวิธีนี้ และถ้าคุณตั้งค่า TZ มันจะไม่ถูกจดจำเป็นเขตเวลาเริ่มต้นของโหนด
เนท

-1

เพียงแค่ตั้งค่าตัวแปรสภาพแวดล้อมในไฟล์หลักของคุณเช่น index.js หรือ app.js หรือ main.js หรือชื่อไฟล์ของคุณคือ:

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

สิ่งนี้จะตั้งค่าเขตเวลาที่จะใช้ในแอปพลิเคชันโหนดทั้งหมดของคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.