【问题标题】:How do I convert this date from momentjs to plain JavaScript如何将此日期从 momentjs 转换为纯 JavaScript
【发布时间】:2019-05-26 03:45:28
【问题描述】:

我有一个时间戳,我试图将其四舍五入到最近的 UTC 星期一 00:00:00:00:000Z

我现在的代码是这样的

let now = Date.now()
moment.unix(now / 1000).utc().startOf("isoWeek").valueOf()

我正在尝试用普通的 JS 立即执行此操作,但我没有得到相同的答案

const nearestMonday = date => {
    const monday     = 1;
    const currentDay = date.getDay();
    const distance   = (monday + 7 - currentDay) % 7;
    const newDate    = new Date(date.getTime());
    newDate.setDate(date.getDate() + distance);
    newDate.setHours(0, 0, 0, 0);
    return newDate;
}

> d = Date.now()
1545989455067
> nearestMonday(new Date(d)).getTime()
1546194600000
> m.unix(Date.now() / 1000).utc().startOf("isoWeek").valueOf()
1545609600000

我在格林威治标准时间 + 530 区,我要改变什么才能得到与时刻相同的答案

【问题讨论】:

    标签: javascript date timestamp momentjs


    【解决方案1】:

    好的,所以我们这里有一些问题:

    第一:时区

    日期适用于您的本地时区,因此当您执行 newDate.setHours(0, 0, 0, 0); 之类的操作时,它会将对象设置为 您的 时区中的那个小时。但是,当您执行 .getTime() 时,它确实会从 UTC 纪元返回毫秒。

    这样做的结果是:如果你在 gmt+530(我相信是印度)当你执行 .getTime() 时,那么从 epoch 开始的毫秒将因该差异而偏离(5h 30m)。

    为了弥补这一点,您可以使用getTimezoneOffset()

    const nearestMonday = date => {
        const monday     = 1;
        const currentDay = date.getDay();
        const distance   = (monday + 7 - currentDay) % 7;
        const newDate    = new Date(date.getTime());
        newDate.setDate(date.getDate() + distance);
        newDate.setHours(0, 0, 0, 0);
        newDate.setTime(newDate.getTime()-1000*60*newDate.getTimezoneOffset());
        return newDate;
    }
    

    另一方面,您使用 moment 的代码将在时区中正常工作,因此无需更改它。


    第二:星期一是几号?

    您的函数nearestMonday 计算下一个星期一。

    函数startOf('isoWeek') 将日期设置为当前周的星期一。

    如果你想同时计算电流,你应该修改你的nearestMonday,比如:

    const nearestMonday = date => {
        const monday     = 1;
        const currentDay = date.getDay();
        const distance   = monday - currentDay;
        console.log('dist', distance);
        const newDate    = new Date(date.getTime());
        newDate.setDate(date.getDate() + distance);
        newDate.setHours(0, 0, 0, 0);
        newDate.setTime(newDate.getTime()-1000*60*newDate.getTimezoneOffset());
        return newDate;
    }
    

    最后:星期日?

    getDay() 在星期日将返回 0。因此,“最近的星期一”将是之后的一天。我没有更正它,因为我不知道这是否是所需的行为,但只是为了完成而注意到它

    【讨论】:

    • 太棒了!非常感谢您的详细解释,我假设了很多关于 js 日期方法的事情,但不知道一个返回 UTC 而另一个不返回,我的错,我会试一试
    【解决方案2】:

    我认为这可能会满足您的需求:

    const nearestMonday = date => {
        const day = 1000*60*60*24;
        const week = day*7;
        return new Date(Math.floor(date.getTime()/week)*week-3*day);
    }
    

    【讨论】:

      猜你喜欢
      • 2020-07-24
      • 2015-01-08
      • 2020-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-15
      • 2023-01-29
      • 1970-01-01
      相关资源
      最近更新 更多