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

如何将此日期从momentjs转换为纯JavaScript,javascript,date,timestamp,momentjs,Javascript,Date,Timestamp,Momentjs,我有一个时间戳,我正试图舍入到最近的UTC星期一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 =

我有一个时间戳,我正试图舍入到最近的UTC星期一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区域,我要做什么改变才能得到与当前相同的答案?我想这可能会满足您的要求:

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

我想这可以满足你的要求:

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

好的,我们这里有几个问题:

第一:时区

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

这样做的结果是:如果你在gmt+530(我相信是印度),当你做一个.getTime()时,epoch的毫秒数将被这个差值(5小时30米)抵消

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

另一方面,使用矩的代码可以在时区中正常工作,因此无需更改它


第二:什么星期一?

函数
nearest Monday
计算下一个星期一

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

如果您想同时计算电流,则应修改最接近周一的
,如:

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。因此,“最近的星期一”将是第二天。我没有纠正它,因为我不知道这是否是期望的行为,但注意到它只是为了完成

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

第一:时区

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

这样做的结果是:如果你在gmt+530(我相信是印度),当你做一个.getTime()时,epoch的毫秒数将被这个差值(5小时30米)抵消

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

另一方面,使用矩的代码可以在时区中正常工作,因此无需更改它


第二:什么星期一?

函数
nearest Monday
计算下一个星期一

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

如果您想同时计算电流,则应修改最接近周一的
,如:

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 date方法的事情,不知道其中一个返回UTC,而另一个不返回UTC,我的错,这会让我感到惊讶!非常感谢您的详细解释,我假设了很多关于js date方法的事情,不知道其中一个返回UTC,而另一个不返回UTC,我的错,将尝试一下