簡體   English   中英

如何從客戶端獲取的日期獲取時區偏移量?

[英]How to get timezone offset from the date getting from client side?

我正在使用nodejs。 我將startDate作為

startDate: '2020-06-14T18:30:00.000Z'

從客戶端。 我需要從上述日期獲取時區偏移量。 應該是 +05:30。 我怎么能得到那個?

編輯:

服務器始終在 UTC 上工作。 那么我可以通過 UTC 減去來自客戶端的日期來獲得時區偏移量嗎?

IE

'2020-06-14T18:30:00.000Z' - moment.utc().startOf("day") = +05:30

如果 node.js 語法和普通 JS 一樣; 聲明一個日期 object :

var date = new Date();

然后使用getTimezonOffset方法獲取與 GMT 的分鍾差。:

var difInMinutesToGMT = date.getTimezoneOffset();

從那里開始,將正/負分鍾轉換為您想要的格式。

您擁有的日期位於通用中央時區 UTC 假設您的客戶端上有該datestring ,您可以從moment.js使用moment.utc(datestring).utcOffset()

要從該字符串中獲取偏移量,我認為返回值以分鍾為單位。

編輯:感謝您的澄清,日期字符串末尾的 Z 表示日期已經在 UTC 時區。 如果你想有一個時區偏移,你總是會得到 0。你也可以使用 moment.tz.guess() 從客戶端發送區域設置並將時區發送到服務器。 或者就像其他人所說的那樣,在客戶端使用 Date.prototype.getTimezoneOffset 方法:

getTimezoneOffset() 方法返回從當前區域設置(主機系統設置)到 UTC 的時區差異(以分鍾為單位)。

您可以使用以下方法來獲取所需格式的偏移量。

 let d = '2020-06-14T18:30:00.000Z' let date = new Date(d); let offsetInMinutes = date.getTimezoneOffset() let formattedOffset = `${parseInt(offsetInMinutes/60)}:${Math.abs(parseInt(offsetInMinutes%60))}` console.log(formattedOffset)

您無法獲取用戶的時區。

用戶/客戶以 ISO8601 格式向您發送日期時間,或者更准確地說是祖魯時間 (UTC)。

您可以考慮 2 個選項:

  1. 強制客戶以包含他們的時區的格式向您發送時間並從那里獲取時間 ( '2020-06-14T19:30:00.000+01:00' ) - 更像是一種解決方法
  2. 或者在您的數據庫中擁有用戶偏好,您將在其中擁有他們的區域(以某種方式存儲在那里,通過專用端點等......) - 更清潔的解決方案

回復編輯:

moment(''2020-06-14T18:30:00.000Z').substract(moment.utc().startOf("day")).toHours() == 18.5



moment('2020-06-14T19:30:00.000+01:00').substract(moment.utc().startOf("day")).toHours() == 18.5

因此,時區標志 (Z, 01:00...) 只會提供有關給定日期時間的時區的信息。 客戶端可以發送任何變化並且它是有效的。 最后,您仍然不知道客戶時區。

我的第一個只是一種解決方法,但我不建議你這樣做,這可能是一個修補程序,但第二個是一個更合適的解決方案。

反正:

有時,server/API/be 根本不需要知道用戶的時區,如果那只是用於讀/寫(因為客戶端應用程序,會將 ZULU 時間調整為 UI 中的客戶端區域,反之亦然),但是當你有一些邏輯,例如google calendar features ,你肯定需要用戶時區。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM