我试图检查最后一次点击某个元素的日期是否等于当前日期。当前日期是由服务器创建的,比我的本地时间早5个小时,所以在一天中的某个时间,代码停止正常工作,因为程序认为现在是第二天。
下面是在我的服务器端引起问题的代码:
let todaysDate = new Date().toString().split(' ').splice(0, 4).join(' ')
let todaysDateMs = new Date(todaysDate + ', 00:00:00').getTime()
Promise.all([
Habits.updateMany({}, {
$set: {
todaysDate,
todaysDateMs
}
}),
Habits.updateMany({ lastClicked: { $ne: todaysDate } }, {
$set: {
clicked: 'false'
}
}),
存储在todaysDate中的日期是UTC时间,提前5小时。当它将lastClicked(与PUT请求沿着从客户端以本地时间发送)与todaysDate进行比较时,由于时区之间的差异,它错误地将clicked设置为false。
我想知道是否可以告诉服务器以用户的本地时间创建一个日期,或者我可以解决这个问题的任何方法,以便两个日期相同。我不希望包括特定的时间戳,只希望包括日、月和年。
3条答案
按热度按时间sy5wg1nm1#
你试过像Moment.js这样的东西吗?它让处理这样的事情变得容易多了。查看他们的文档或教程,比如this。
pdtvr36n2#
一般来说,服务器上的时间是以UTC表示的,只有在客户端才能将其转换为客户端的时区,这样服务器就不需要知道客户端时区的任何信息。
客户端需要发送他们的时区沿着
lastClicked
时间。然后你的服务器可以读取这个时间并自动调整时区。一个例子是发送ISO 8601的时间2023-02-07T18:25:19-05:00
,其中-05:00
表示这个时间比UTC晚5小时。或者,客户端可以将发送的时间戳预先转换为UTC。JavaScript提供了实现这一点的方法,Luxon等库也提供了这种方法。
0vvn1miw3#
MongoDB中的
Date
值存储为UTC时间-始终且仅。您不应该将日期/时间值存储为字符串,这是一个设计缺陷。对于您的情况,我建议使用第三方库,如moment.js、Luxon或Day.js
它们提供类似
DateTime.now().setZone('America/New_York').startOf('day').toJSDate();
的函数有了这些函数,解决您的需求应该是相当容易的。