Hướng dẫn get client machine timezone javascript - lấy javascript múi giờ của máy khách

Câu hỏi này đã có hơn 30 câu trả lời, nhưng tôi chắc chắn có những người sẽ đến đây và thực sự không biết họ đang tìm kiếm điều gì.

Bất ngờ! Bạn sắp mở một lon giun!

Tôi thực sự khuyên bạn nên đọc bài viết này mà tôi đã viết gần đây về những cơn đau đầu khi đối phó với Timezones trong JS! https://medium.com/@iedin/time-and-time-ure-metaches-in-javascript-AE4D873A665D

Bạn đang tìm kiếm chính xác điều gì?

Tùy thuộc vào trường hợp sử dụng thực sự của bạn, bạn thực sự cần những thứ khác nhau.


1) Một cách để chuyển đổi một thời điểm cố định (như ngày 13 tháng 11 năm 2021 lúc 11:35:21 tối tại San Francisco) sang thời gian đồng hồ treo tường của người dùng, người có thể ở bất cứ đâu trên thế giới.

Sử dụng .Tolocalestring ().

Nó có nhiều tham số tùy chỉnh để định dạng hơn bạn có thể nghĩ đến, thông qua hai tham số của nó là localeoptions được liệt kê tại DateTimeFormat. Nó thậm chí còn hỗ trợ các lịch, ngôn ngữ, cách định dạng năm, tháng, ngày, v.v. (không có tham số được truyền sẽ sử dụng cài đặt mặc định của người dùng, có thể là lý tưởng.)

Là nhà phát triển, chỉ cần vượt qua giá trị thời gian đó (ví dụ: thời gian mở cửa của một sự kiện bán hàng hoặc một cuộc thi) dưới dạng số dấu thời gian UNIX (đó là số giây từ 1/1/1970 ở UTC, Timezone-Agnostic và DST0AgNostic ) cho khách hàng, và sau đó làm new Date(timestamp).toLocaleString(). ví dụ. Đối với thời gian đó ở trên, giá trị là 1636875321000 (tính bằng mili giây), thông qua +dateWithTimeZone("America/Los_Angeles",2021,10,13,23,35,21) bằng cách sử dụng hàm từ câu trả lời này.UNIX timestamp number (that's the number of seconds from 1/1/1970 in UTC, timezone-agnostic and DST0agnostic) to the client, and then do new Date(timestamp).toLocaleString(). e.g. for that point-of-time above, the value is 1636875321000 (in milliseconds), via +dateWithTimeZone("America/Los_Angeles",2021,10,13,23,35,21) using the function from this answer.


2) Có thể gửi cho người dùng một thông báo/email vào lúc 9 giờ sáng giờ địa phương của họ, 3 tháng kể từ bây giờ

Đây là một yêu cầu hoàn toàn khác nhau! Giống như, rất khác nhau!

GMT-8: 00 không đủ sao?

No!

Đó chỉ là múi giờ mà người dùng đang ở, tại một thời điểm, như "ngay bây giờ, ngày nay"."right now, today".

  • Làm thế nào bạn sẽ biết người dùng có tiết kiệm ánh sáng ban ngày hay không? (Arizona ở Mỹ không, và rất nhiều quốc gia và tiểu bang khác, và thậm chí các quận!)
  • Làm thế nào bạn có thể biết người dùng ở DST hoặc ra khỏi nó? Đó là mùa đông ở San Francisco (GMT-8) hoặc mùa hè ở Alaska (một lần nữa, GMT-8). Xem danh sách khổng lồ này để phát ra: https://en.wikipedia.org/wiki/list_of_tz_database_time_zones

"PDT" không đủ cho điều đó?

No!

Trước hết, PDT thậm chí không phải là một điều quanh năm. Bây giờ là tháng 11 và Timeanddate.com nói rằng "Hiện tại không có địa điểm nào trên Pdt. Bạn có muốn xem PST không?" (Đọc bài viết trung bình của tôi ở trên để biết thêm chi tiết.)No locations currently on PDT. Would you like to see PST?" (read my Medium article above for more details.)

Trừ khi bạn đang đi cho chuỗi UI từ máy khách đến khách hàng, pdt/cest/vv này. Không có giá trị gì cả!

Tại sao? Bởi vì Tijuana ở Mexico và San Francisco ở Mỹ đều ở PDT trong tháng 6, nhưng họ có những ngày DST (tiết kiệm ánh sáng ban ngày) khác nhau mà họ chuyển sang PST. Và bạn cần phải biết điều đó!

Ngày DST của Hoa Kỳ vào năm 2022 là ngày 13 tháng 3 năm 2022 đến ngày 6 tháng 11 năm 2022. Ngày DST của Mexico vào năm 2022 là ngày 3 tháng 4 năm 2022 đến ngày 30 tháng 10 năm 2022. 93% ngày, trong 7% số ngày (ví dụ: ngày 14 tháng 3 đến ngày 3 tháng 4 và ngày 31 tháng 10 đến ngày 6 tháng 11 năm 2022) họ không khớp.

Vì vậy, ngay cả khi bạn biết đó là tháng 11 và bạn biết người dùng đang ở PDT, bạn không thể biết khi nào (số dấu thời gian nào) sẽ là 9 giờ sáng ngày 1 tháng 4 năm 2022 trong thiết bị của người dùng.

PS. Tồi tệ hơn nếu bạn đang cố gắng để có được điều đó PDT từ

const timeZoneIANA = Intl.DateTimeFormat().resolvedOptions().timeZone;
0. FYI, nếu bạn thay đổi địa phương của máy của bạn thành
const timeZoneIANA = Intl.DateTimeFormat().resolvedOptions().timeZone;
1 (tiếng Tây Ban Nha, đó là ngôn ngữ của 13% dân số Hoa Kỳ), đây là những gì bạn nhận được:

> new Date().toString()
'Sun Nov 14 2021 00:47:25 GMT-0800 (hora estándar del Pacífico)'

Chúc may mắn với

const timeZoneIANA = Intl.DateTimeFormat().resolvedOptions().timeZone;
2!

Sau đó, tôi nên làm gì?

Cách chính xác duy nhất là sử dụng các giá trị múi giờ IANA (đọc "Tiêu chuẩn"). Đó là cột thứ hai của trang wikipedia này. Nó đến từ:

const timeZoneIANA = Intl.DateTimeFormat().resolvedOptions().timeZone;

Nó trả về giá trị IANA, đó là

const timeZoneIANA = Intl.DateTimeFormat().resolvedOptions().timeZone;
3 cho San Francisco. Đây là giá trị bạn nên lưu trữ trong DB của mình cho người dùng, nếu có. Bạn có thể nhận được tất cả các loại thông tin về nó từ gói múi giờ.json và chuyển đổi thời gian từ/đến múi giờ đó, cộng với ngày (vấn đề) như câu trả lời này.

Còn IE11 thì sao?

IE11 không hỗ trợ điều đó

const timeZoneIANA = Intl.DateTimeFormat().resolvedOptions().timeZone;
4. Hầu hết các polyfills chỉ là đoán nó và không chính xác. Vì vậy, hãy cố gắng bỏ hỗ trợ cho IE11 hoặc sử dụng thư viện và chuẩn bị cho một số không chính xác.


3) Tôi chỉ muốn tìm ra phần bù múi giờ của họ vào lúc này (ví dụ: -8: 00)

Bạn có lẽ không nên. Tôi không thể nghĩ về bất kỳ lý do thực sự mà bạn cần điều này. Một lần nữa, biết giá trị này cho ngày hôm nay, không cho bạn biết giá trị này sẽ là gì vào ngày mai.

Nhưng dù sao, bạn luôn có thể nhận được giá trị đó bằng cách

new Date().getTimezoneOffset() / 60

Ở phía khách hàng.

Lưu ý: .getTimeZoneOffset () không phải là phần bù múi giờ của đối tượng ngày, bạn đang gọi nó. Vui lòng đọc tài liệu.NOT the timezone offset of the date object, you are calling it on. Please read the documentation.

Để chính xác, nó cần đối tượng ngày qua (có dấu thời gian, đề cập đến một điểm duy nhất trong lịch sử), và sau đó cho biết sự khác biệt giữa thời gian UTC và thời gian địa phương tại điểm- thời gian.

Một lần nữa, nó phụ thuộc vào ngày. Nhìn thấy:

console.log(new Date("6/13/2021").getTimezoneOffset() / 60); // It's 7 on a machine that runs in San Francisco
console.log(new Date("11/13/2021").getTimezoneOffset() / 60); // It's 8 on a machine that runs in in San Francisco

Bất kỳ thư viện?

Dưới đây là danh sách các thư viện hỗ trợ trao đổi múi giờ.

Nhưng, hãy nhớ rằng, bạn phải giải quyết vấn đề thiết kế trước, và sau đó tìm kiếm mã. Mọi thứ xung quanh múi giờ có thể dễ dàng trở nên phức tạp và bạn phải biết "PDT" và "GMT-8" không phải là giá trị múi giờ thông tin/có giá trị quanh năm để lưu trữ trong DB cho người dùng. :)

Làm thế nào để tôi tìm thấy múi giờ của tôi trong JavaScript?

JavaScript Ngày GetTimeZoneOffset () getTimeZoneOfset () trả về sự khác biệt giữa thời gian UTC và thời gian địa phương. GetTimeZoneOffset () trả về sự khác biệt trong vài phút. Ví dụ: nếu múi giờ của bạn là GMT+2, -120 sẽ được trả về.getTimezoneOffset() getTimezoneOffset() returns the difference between UTC time and local time. getTimezoneOffset() returns the difference in minutes. For example, if your time zone is GMT+2, -120 will be returned.

Làm cách nào để sử dụng gettimezoneoffset?

Phương thức GetTimeZoneOffset () được sử dụng để trả về chênh lệch thời gian giữa thời gian phối hợp phổ quát (UTC) và thời gian địa phương, trong vài phút.Nếu múi giờ của bạn là GMT+5, -300 (60*5) phút sẽ được trả lại.Tiết kiệm ánh sáng ban ngày ngăn chặn giá trị này không đổi.Tham số: Phương thức này không chấp nhận bất kỳ tham số nào.to return the time difference between Universal Coordinated Time (UTC) and local time, in minutes. If your time zone is GMT+5, -300 (60*5) minutes will be returned. Daylight savings prevent this value from being constant. Parameter: This method does not accept any parameter.

Làm cách nào để có được múi giờ hệ thống trong React JS?

Làm thế nào để tôi có được múi giờ hiện tại trong React JS ?..
const datetotime = date => ngày.tolocalestring ('en-us', {.
Giờ: 'Số',.
phút: 'Số'.
const datestring = "2019-05-05T10: 30: 00z" ;.
const useroffset = ngày mới ().getTimeZoneOffset ()*60*1000 ;.
const localDate = ngày mới (datestring) ;.

Ngày JavaScript có timezone không?

Đối tượng ngày trong JavaScript không lưu trữ múi giờ.Nó lưu trữ một dấu thời gian đại diện cho số mili giây đã trôi qua kể từ nửa đêm ngày 1 tháng 1 năm 1970. Tuy nhiên, chúng ta có thể sử dụng phương pháp Tolocalestring để có được chuỗi cụ thể địa phương được điều chỉnh theo múi giờ.. It stores a timestamp that represents the number of milliseconds that have passed since midnight on January 1st, 1970. However, we can use the toLocaleString method to get a locale-specific string that is adjusted to a time zone.