簡體   English   中英

如何將此日期從momentjs轉換為純JavaScript

[英]How do I convert this date from momentjs to plain JavaScript

我有一個時間戳,試圖將其舍入到最近的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區域中,該如何更改以得到與瞬間相同的答案

我認為這可能會滿足您的要求:

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

好的,所以這里有一些問題:

第一:時區

日期與您的本地時區一起使用,因此當您執行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;
}

另一方面,您使用代碼的代碼將在時區正常工作,因此無需更改它。


第二:什么星期一?

您的函數nearestMonday計算下一個星期一。

函數startOf('isoWeek')將日期設置為當前星期的星期一。

如果您想兩者都計算current ,則應修改您的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”將是其后的一天。 我沒有更正它,因為我不知道這是否是理想的行為,但請注意只是為了完成

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM