簡體   English   中英

如何處理客戶端時區以檢索數據?

[英]How to handle client timezone for retrieving data?

我將來自不同運動的事件存儲到我的數據庫中。

例子:

{
  "sport": "NBA",
  "name": "Warrios v Wizards",
  "date": "2022-10-01 02:00:00"
}

所有日期/時間都存儲在 UTC 中。 通過 API(Node.js - Express),客戶端將請求當天的事件。 我很難理解如何根據客戶端時區從服務器/數據庫請求/查詢事件。

例子:

以下 API 路由返回特定日期的api/events/?date=2022-10-01 具有 UTC 偏移量(−10:00)的用戶應該從具有 UTC 偏移量(+12:00)的用戶那里獲得不同的數據,尤其是對於每個用戶午夜時間之后或之前的事件。

我認為的一種選擇是在客戶端級別找出時區,然后將數據傳遞給服務器並使用該數據根據該時區轉換和查詢數據庫。

還有其他更好的方法嗎?

如果所有數據都存儲為 UTC,那么您應該將 UTC 發送到客戶端並在那里轉換為本地。

要獲取特定日期的所有事件,請使用客戶端計算 UTC 當天的開始和結束時間並獲取該范圍內的事件。

例如,以下根據主機設置以 ISO 8601 格式返回和開始和結束一天的 UTC。 然后可以在服務器上使用它來獲取范圍內的事件。 在客戶端,UTC 值可以轉換為本地。

 /* Return UTC values for start and end of local day * * @param {string} date - format yyyy-mm-dd * @returns {Array<string>} start and end of day as UTC in * ISO 8601 format * endOfDay is 1ms before midnight */ function getLocalDayRange(date) { let [Y, M, D] = date.split(/\D/); let startOfDay = new Date(Y, M-1, D); let endOfDay = new Date(Y, M-1, Number(D)+1, 0, 0, 0, -1); return [startOfDay.toISOString(), endOfDay.toISOString()]; } // Start and end of 30 Sep 2022 based on client settings console.log('Start and end for 30 Sep 2022:\n' + getLocalDayRange('2022-09-30').join('\n') ); // Current date in YYYY-MM-DD format let d = new Date().toLocaleDateString('en-ca'); console.log('Start and end for today (' + d + '):\n' + getLocalDayRange(d).join('\n') );

在顯示值時始終包括假定的時區名稱或偏移量,或兩者,以便客戶可以確認它們對於他們的位置是正確的。

暫無
暫無

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

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