mongodb 如何在GET请求中将服务器端的UTC时间转换为用户的本地时间?

wbgh16ku  于 2023-02-11  发布在  Go
关注(0)|答案(3)|浏览(144)

我试图检查最后一次点击某个元素的日期是否等于当前日期。当前日期是由服务器创建的,比我的本地时间早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。
我想知道是否可以告诉服务器以用户的本地时间创建一个日期,或者我可以解决这个问题的任何方法,以便两个日期相同。我不希望包括特定的时间戳,只希望包括日、月和年。

sy5wg1nm

sy5wg1nm1#

你试过像Moment.js这样的东西吗?它让处理这样的事情变得容易多了。查看他们的文档或教程,比如this

pdtvr36n

pdtvr36n2#

一般来说,服务器上的时间是以UTC表示的,只有在客户端才能将其转换为客户端的时区,这样服务器就不需要知道客户端时区的任何信息。
客户端需要发送他们的时区沿着lastClicked时间。然后你的服务器可以读取这个时间并自动调整时区。一个例子是发送ISO 8601的时间2023-02-07T18:25:19-05:00,其中-05:00表示这个时间比UTC晚5小时。
或者,客户端可以将发送的时间戳预先转换为UTC。JavaScript提供了实现这一点的方法,Luxon等库也提供了这种方法。

0vvn1miw

0vvn1miw3#

MongoDB中的Date值存储为UTC时间-始终且仅。您不应该将日期/时间值存储为字符串,这是一个设计缺陷。
对于您的情况,我建议使用第三方库,如moment.js、Luxon或Day.js
它们提供类似DateTime.now().setZone('America/New_York').startOf('day').toJSDate();的函数
有了这些函数,解决您的需求应该是相当容易的。

相关问题