Làm cách nào tôi có thể đặt múi giờ mặc định trong node.js?


153

Làm cách nào để đặt múi giờ mặc định trong node.js?


2
Khá chắc chắn rằng bạn không thể thực sự làm điều đó. Thay đổi cài đặt múi giờ của hệ thống.
thejh

1
thejh là đúng, bạn không thể thay đổi múi giờ. Sử dụng thư viện thời gian JS (như khoảnh khắc.js) và cộng / trừ giờ thay thế.
alessioalex

2
Cách dễ nhất và chính xác để làm điều này là chỉ cần thay đổi múi giờ của hệ thống.
Munim

1
Đây là những nhận xét hữu ích nhưng hầu hết thời gian bạn không phải là người quản lý hệ thống;)
Mário de Sá Vera

Câu trả lời:


135

Theo chủ đề nhóm google này , bạn có thể đặt biến môi trường TZ trước khi gọi bất kỳ hàm ngày nào. Chỉ cần thử nghiệm và nó hoạt động.

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

Tuy nhiên, bạn không thể thay đổi múi giờ sau đó, kể từ đó, Node đã đọc biến môi trường.


3
Nó thật thú vị. Các cuộc thảo luận lỗi cho thấy đó là một số vấn đề với luồng. Nhưng ví dụ đã thay đổi process.env.TZ nhiều lần. Có vẻ như thiết lập nó một lần khi bắt đầu và để nó hoạt động một mình. Tuy nhiên, cảm ơn lorancou đã tham chiếu đến nút thời gian để xử lý linh hoạt và mạnh mẽ hơn.
webjprgm

6
Đáng buồn thay, nó không hoạt động trong cửa sổ. Hoạt động tốt trong mac os-x và unix
Ritesh Kumar Gupta

14
Câu trả lời tốt đẹp. Thật không may, mỗi lần tôi nhìn thấy một cái gì đó như process.env.TZ = 'Europe/Amsterdam' tôi nghĩ "tốt đẹp, bây giờ tôi có thể tìm thấy danh sách tất cả các giá trị hợp lệ mà tôi có thể đặt ở đâu?" và tôi không tìm thấy nó, mỗi lần.
Rafael Eyng

5
@RafaelEyng IANA (Hiệp hội số được gán quốc tế) thường được sử dụng để cung cấp các cấu hình múi giờ cập nhật. Bạn có thể tìm thấy các cài đặt múi giờ mới nhất tại đây: ftp.iana.org/tz/tzdata-latest.tar.gz Để biết tổng quan về các chuỗi múi giờ có thể, hãy kiểm tra zone.tabtệp trong kho lưu trữ đó.
JohannesB

8
@RafaelEyng: như JohannesB đã đề cập iana.org/time-zones là nguồn chính thức, nhưng định dạng dữ liệu của họ rất khó để làm việc. Tôi thấy làm việc dễ dàng hơn nhiều từ en.wikipedia.org/wiki/List_of_tz_database_time_zones , được xây dựng từ bộ dữ liệu IANA (hiện tại là phiên bản 2017c).
Peter Rust

66

Một cách tiếp cận khác có vẻ hiệu quả với tôi ít nhất là trong môi trường Linux là chạy ứng dụng Node.js của bạn như thế này:

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

Điều này ít nhất phải đảm bảo rằng múi giờ đã được đặt chính xác ngay từ đầu.


Đẹp! Làm việc cho tôi
Rotem

Bạn có thể làm tương tự cho các nền văn hóa?
Jim Aho

Điều này làm cho nó đơn giản hơn để buộc một múi giờ, hơn là cố gắng làm như vậy trong mã .
Dan Dascalescu

33

Dưới đây là một ví dụ hoạt động 100% để nhận múi giờ tùy chỉnh Ngày giờ trong NodeJ mà không cần sử dụng bất kỳ mô-đun bên ngoài nào:

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

console.log(nDate);


Tôi bối rối - điều này rất được khuyến khích nhưng nó có một vấn đề nghiêm trọng IMO. Các phiên bản nút <13 chỉ có dữ liệu bản địa cho 'en-us', có nghĩa là nó ném (trong một số trường hợp) hoặc đưa ra định dạng ngày sai cho mọi quốc gia khác. Và trong nhiều trường hợp, ngày sẽ có vẻ chính xác nhưng ngày & tháng bị tráo đổi! Và Node 13 chỉ mới được phát hành vài tuần trước, vì vậy vấn đề này áp dụng cho khá nhiều người.
Tom

Tôi thấy rằng câu trả lời của @Marshall dưới đây gợi ý cách giải quyết vấn đề này trong một số tình huống (sẽ không hoạt động ở Lambda và các FaaS khác).
Tom

31

Thật không may, cài đặt process.env.TZkhông hoạt động thực sự tốt - về cơ bản là không xác định khi thay đổi sẽ có hiệu lực).

Vì vậy, thiết lập múi giờ của hệ thống trước khi bắt đầu nút là tùy chọn thích hợp duy nhất của bạn.

Tuy nhiên, nếu bạn không thể làm điều đó, có thể sử dụng thời gian nút như một cách giải quyết: lấy thời gian của bạn theo giờ địa phương hoặc UTC và chuyển đổi chúng thành múi giờ mong muốn. Xem Làm thế nào để sử dụng bù múi giờ trong Nodejs? để biết chi tiết.


1
thời gian mô-đun npm làm việc tuyệt vời cho tôi. Tôi đặt thành utc, sau đó đặt tất cả các lần bằng utc, vì vậy mã có thể di chuyển giữa các máy khác nhau với các múi giờ khác nhau.
Mark Shust tại M.academy

Không còn vấn đề với điều này nữa, phải không?
Bloke

16

Giải pháp env TZ='Europe/Amsterdam' node server.jstừ @uhef hoạt động trong trường hợp ứng dụng của bạn không hoạt động với quy trình rẽ nhánh, nhưng khi bạn đang làm việc với quy trình rẽ nhánh, đặc biệt khi bạn khởi chạy ứng dụng của mình bằng công cụ xây dựng như gulp , lệnh gulpsẽ lấy các giá trị env, nhưng quá trình được tạo bởi gulp không (ứng dụng của bạn).

Để giải quyết điều này, bạn phải làm:

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

Điều này sẽ đặt TZbiến môi trường cho tất cả quá trình bắt đầu trong bàn điều khiển bạn đang làm việc, bao gồm tất cả các quy trình tiếp theo được thực hiện sau lệnh gulp trong cùng bàn điều khiển mà không cần phải thực hiện lại chúng với tiền tố export TZ="Europe/Amsterdam";.


vì amsterdam có DST, đây có phải là tz mong muốn để đạt được "UTC nửa đêm" vào GMT +1 không?
FlavorScape

1
@FlavorScape Tôi sử dụng Etc/UTC Ngoài ra còn có các phần bù cụ thể có sẵn Etc, nhưng phần bù lại ngược với những gì người ta mong đợi. Etc/GMT-1là UTC + 1 giờ. Xemhttps://en.wikipedia.org/wiki/List_of_tz_database_time_zones
npskirk

9

Đặt múi giờ của máy chủ và sử dụng đồng bộ hóa NTP. Đây là một giải pháp tốt hơn để thay đổi thời gian máy chủ.

Để liệt kê các múi giờ

timedatectl list-timezones

Để đặt múi giờ

sudo timedatectl set-timezone America/New_York

Xác nhận múi giờ

timedatectl

Tôi thích sử dụng múi giờ UTC cho các máy chủ và cơ sở dữ liệu của tôi. Bất kỳ chuyển đổi phải được xử lý trên máy khách. Chúng tôi có thể sử dụng khoảnh khắc.js ở phía máy khách.

Nó sẽ dễ dàng để duy trì nhiều trường hợp là tốt,


2
Mặc dù Moment.js là một thư viện tuyệt vời vào thời đó, hiện tại có những lựa chọn thay thế nhỏ hơn nhiều (ví dụ: date-fns ). Khoảnh khắc thật lớn ; xin vui lòng không giới thiệu nó cho các ứng dụng khách.
Dan Dascalescu

5

Tôi biết chủ đề này rất cũ, nhưng tôi nghĩ rằng điều này sẽ giúp bất cứ ai đã đến đây từ google như tôi.

Trong GAE Flex (NodeJs), bạn có thể đặt biến môi trường TZ (biến quản lý tất cả các múi giờ ngày trong ứng dụng) trong tệp app.yaml, tôi để lại cho bạn một ví dụ:

ứng dụng

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

5

Đây là câu trả lời cho những người đang triển khai ứng dụng Node.js lên Beanstalk của Amazon AWS . Tôi chưa thấy tài liệu này ở bất cứ nơi nào khác:

Trong Configuration -> Software -> Environment Properties, chỉ cần đặt cặp giá trị khóa TZvà múi giờ của bạn America/Los Angeles, vd và Áp dụng thay đổi.

Bạn có thể xác minh hiệu ứng bằng cách xuất ra new Date().toString()trong ứng dụng Node của mình và chú ý đến hậu tố múi giờ.


3

Kể từ Nút 13 , bây giờ bạn có thể liên tục thiết lập process.env.TZvà nó sẽ được phản ánh trong múi giờ của các đối tượng Ngày mới. Tôi không biết nếu tôi sử dụng mã này trong mã sản xuất nhưng nó chắc chắn sẽ hữu ích trong các thử nghiệm đơn vị.

> 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
Điều này hoạt động tốt trên Linux / Mac, nhưng không hoạt động trên Windows.
Nate

Không, nó cũng hoạt động cho Windows, hãy sử dụngset TZ='UTC' node index.js
user3896501

@ user3896501 không, cú pháp đó đặt var env cho toàn bộ quá trình - không phải trong khi chạy như trong ví dụ của OP.
Ian Grainger

2

Bạn có thể mất múi giờ . Nó cho phép bạn đặt vị trí của mình và cũng chăm sóc thời gian tiết kiệm ánh sáng ban ngày.


2
Khoảnh khắc khá nặng nề cho một nhiệm vụ như thế này và tôi sẽ không đề xuất nó trừ khi hành vi bạn muốn không thể thực hiện được thông qua Datehoặc các mô đun dựng sẵn khác.
Chris Williamson

2

Đôi khi bạn có thể đang chạy mã trên máy chủ ảo ở nơi khác - Điều đó có thể trở nên lầy lội khi chạy NODEJS hoặc các hương vị khác.

Đây là một sửa chữa sẽ cho phép bạn sử dụng bất kỳ múi giờ dễ dàng.

Kiểm tra danh sách các múi giờ ở đây

Chỉ cần đặt cụm từ múi giờ của bạn trong dấu ngoặc của dòng FORMAT của bạn.

Trong trường hợp này - tôi đang chuyển đổi EPOCH sang phương Đông.

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

Cập nhật cho node.js v13

Như @Tom đã chỉ ra, hỗ trợ icu đầy đủ được xây dựng trong v13 ngay bây giờ. Vì vậy, các bước thiết lập có thể được bỏ qua. Bạn vẫn có thể tùy chỉnh cách bạn muốn xây dựng hoặc sử dụng icu trong thời gian chạy: https://nodejs.org/api/intl.html

Đối với node.js trên Windows , bạn có thể làm như sau:

  1. Cài đặt full-icu nếu nó đã được cài đặt, áp dụng đúng địa điểm ngày

    npm i full-icu hoặc trên toàn cầu: npm i -g full-icu

  2. Sử dụng toLocaleString () trong mã của bạn, ví dụ:

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

    Điều này sẽ tạo ra một cái gì đó như : 25/02/2019, 3:19:22 pm. Nếu bạn thích 24 giờ, 'en-GB' sẽ tạo ra:25/02/2019, 15:19:22

Đối với node.js dưới dạng ứng dụng web Azure , ngoài cài đặt ứng dụng của WEBSITE_TIME_ZONE, bạn cũng cần đặt NODE_ICU_DATA thành <your project>\node_modules\full-icu, ví dụ , sau khi bạn đã thực hiện npm i full-icu. Việc cài đặt gói trên toàn cầu trên Azure không được đề xuất vì thư mục đó là tạm thời và có thể bị xóa.

Tham chiếu: 1. NodeJS không áp dụng đúng địa điểm ngày

  1. Bạn cũng có thể xây dựng node.js với các tùy chọn intl, thêm thông tin tại đây

1
full-icu được bao gồm trong các bản dựng tiêu chuẩn / chính thức của Node kể từ v13, vì vậy các bước trên sẽ không còn cần thiết nữa.
Tom

1

Bạn có thể cấu hình múi giờ toàn cầu với thư viện tzdata:

npm install tzdata -y

Sau khi đặt môi trường của bạn với biến, ví dụ: TZ = America / Bogota

Và thử nghiệm trong dự án của bạn:

new Date()

Tôi hy vọng giúp bạn


1

Bạn có thể thực thi múi giờ xử lý Node.js bằng cách đặt biến môi trường TZthànhUTC

Vì vậy, tất cả thời gian sẽ được đo bằng UTC + 00: 00

Danh sách đầy đủ: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones

Ví dụ gói.json:

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

Điều này không hoạt động trên Windows. Bạn không thể đặt TZ env var theo cách này. Và nếu bạn đặt TZ, nó sẽ không được công nhận là múi giờ mặc định của Node.
Nate

-1

chỉ cần đặt biến môi trường trong tệp chính của bạn như index.js hoặc app.js hoặc main.js hoặc bất kỳ tên tệp nào của bạn là:

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

điều này sẽ đặt múi giờ sẽ được sử dụng trong toàn bộ ứng dụng nút của bạn

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.