首页 > 解决方案 > 使用 moment.js 进行时间转换

问题描述

我正在尝试向服务器发送日期和时间,并检查发送的时间是否在发送日期的某个范围之间。例如,我正在尝试将日期和时间 3 月 15 日下午 4 点 PST (2021-03-15T23:00:33.000Z) 发送到服务器(设置为 UTC),看看它是否在上午 12 点到下午 3:30 的范围内为那个日期。我正在使用 moment.js 使用下面的代码进行转换

// This creates the moment object of the date sent from the client in PST which has an offset of 480
const clientSelectedDate = moment("2021-03-15T23:00:33.000Z").utcOffset(480);
// Getting start of the day sent by client
const currentDay = clientSelectedDate.clone().set({ hours: 0, minutes: 0, seconds: 0 });
// Setting start of the range
const startTime = currentDay.clone().set({ hours: 0, minutes: 0, seconds: 0 });
// Setting end of the range
const endTime = currentDay.clone().set({ hours: 15, minutes: 30, seconds: 0 });

const checkInBetween = startTime.isBefore(clientSelectedDate) && clientSelectedDate.isSameOrBefore(endTime);

变量 checkInBetween 似乎返回 true。当我使用clientSelectedDate.format("DD-MM-YYYY hh:mm a")检查 clientSelectedDate 的值时,我得到的时间是 15-03-2021 3:00 pm 而不是预期的 15-03-2021 4:00下午。我尝试获取时间的毫秒数 1615849200301 并在 PST 和服务器的浏览器中检查它们,但它们之间仍然显示出 1 小时的差异。我正在使用 new Date().getTimezoneOffset() 来获取我发送到服务器的 480 值。任何解决此问题的帮助都会受到重视。

标签: javascriptdatetimetimezonemomentjsmoment-timezone

解决方案


一些东西:

  • PST 可能是 480 (UTC-8),但太平洋时间在 PST (UTC-8) 和 PDT (UTC-7) 之间切换以实现夏令时。设置utcOffset(480)会忽略这一点,并将所有值放在没有 DST的 UTC-8 中。

  • 您给出的示例2021-03-15T23:00:33.000Z是从下午 4 点开始的 7 小时,而不是 8 小时。(23 - 16 = 7)。这对于太平洋时间是正确的,因为夏令时从 2021 年 3 月 15 日凌晨 2 点(太平洋)开始,但在设置固定偏移量时不正确480。这就是差异的根源。

  • 你说:

    ...当我使用 currentDay.format("DD-MM-YYYY hh:mm a") 检查 currentDay 的值时,我得到的时间是 15-03-2021 3:00 pm ...

    那不可能发生。您的代码明确地将currentDay' 时间设置为00:00:00.


推荐阅读