代码之家  ›  专栏  ›  技术社区  ›  PirateApp

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

  •  0
  • PirateApp  · 技术社区  · 7 年前

    我有一个时间戳,我正试图转到最近的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
    

    我在格林尼治标准时间+530区,我该怎么改变才能得到和现在一样的答案呢?

    2 回复  |  直到 7 年前
        1
  •  1
  •   dquijada    7 年前

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

    第一:时区

    日期和你当地的时区是一致的,所以当你这样做的时候 newDate.setHours(0, 0, 0, 0); 像这样的东西,它把目标设定为 你的 时区。当你这样做的时候 .getTime() 但是,它确实从UTC的epoch返回millis。

    结果是:如果你在格林尼治标准时间+530(印度,我相信),当你做一个.gettime()的时候,来自epoch的millis会被这个差(5小时30米)所抵消。

    为了弥补这一点,您可以使用 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') 将日期设置为 现在的 星期。

    如果你们都想计算 现在的 ,您应该修改 新世纪 像:

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

        2
  •  1
  •   Lucero    7 年前

    我想这可以做你想做的:

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