如何将此日期从momentjs转换为纯JavaScript

时间:2018-12-28 09:43:08

标签: javascript date timestamp momentjs

我有一个时间戳,试图将其四舍五入到最近的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

我处于GMT + 530区域,我该如何更改才能获得与时刻相同的答案

2 个答案:

答案 0 :(得分:1)

我认为这可以满足您的要求

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

答案 1 :(得分:1)

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

第一时间:时区

Date与您的本地时区一起使用,因此当您执行newDate.setHours(0, 0, 0, 0);之类的操作时,它将对象设置为您在您的时区中的小时数。但是,当您执行.getTime()时,它确实会从UTC的纪元返回毫秒。

其结果是:如果您使用的是gmt + 530(我相信是印度),那么当您执行.getTime()时,纪元的毫秒数将相差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。因此,“ nearestMonday”将是其后的一天。我没有更正它,因为我不知道这是否是理想的行为,但请注意只是出于完成的目的