繁体   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