我将来自不同运动项目的事件存储到数据库中。
示例:
{
"sport": "NBA",
"name": "Warrios v Wizards",
"date": "2022-10-01 02:00:00"
}
所有日期/时间都存储在UTC中。通过API(Node.js-Express(,客户端将请求当天的事件。我很难理解如何根据客户端时区从服务器/数据库请求/查询事件。
示例:
以下API路由返回特定日期的事件CCD_ 1。具有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')
);
在呈现值时,始终包括假定的时区名称或偏移量,或两者兼有,以便客户端可以确认其位置是否正确。