moment.js认为2013-12-31是第1周,而不是第53周

时间:2014-09-02 20:17:48

标签: javascript momentjs

moment.js库真棒,我几乎一直都在使用它,但最近我碰到了一些有趣的东西。我试图在一年中的每周绘制数据,其中一个数据点是2013-12-31,moment.js告诉我这是第1周?有没有更好的方法来处理这个?是53,null,-1还是其他什么?

moment('2013-12-31').week()
(returns) 1

我想也许使用isoWeek或者格式可以解决这个问题,但它们都会返回相同的值1,尽管文档说它已经达到53.

moment('2013-12-31').isoWeek()
(returns) 1
+moment('2013-12-31').format('w')
(returns) 1   

有人对此有任何想法吗? (不测试计算周数是否包含覆盖我通过的日期值的最小/最大日期)

7 个答案:

答案 0 :(得分:2)

这是因为2013年12月30日的一周被认为是2014年的第1周,您可能会在此页面上看到epoch converter

根据momentjs documentation

  

1月1日这一周是一年中的第一周。

答案 1 :(得分:1)

这是预期的行为。根据ISO 8601标准,2013年不是53周的一年。

  

长年,其中包含53周,可以通过以下任何等效定义来描述:

     
      
  • 从星期四开始的任何一年(dominical letter D或DC)以及从星期三(ED)开始的任何闰年
  •   
  • 任何一年以星期四(D,ED)结束,任何闰年结束于星期五(DC)
  •   
  • 年1月1日和12月31日(共同年份)或任何一年(闰年)是星期四
  •   

(source)

2013年开始并于周二结束,因此它不是一个长年" 2013-12-31被视为2014年第一周的一部分。

如果您希望该周成为第53周,那么您必须为其编写自定义代码,因为ISO标准不会与您达成一致意见!

答案 2 :(得分:1)

Moment.js文档并不是那么简单,我不得不从WW-YYYY转到WW-GGGG

moment(2019-12-30T00:20:53.380Z).format(WW-YYYY) // Gave me 01-2019 incorrectly
moment(2019-12-30T00:20:53.380Z).format(WW-GGGG) // Gave me 01-2020 correctly

发现

  • 如果您在进行本地化周,请使用wwgggg
  • 如果您在进行ISO周,请使用WWGGGG

w/WY的混合使用不正确

答案 3 :(得分:0)

更好的自定义方法,可以将日期转换为星期,并且可以轻松自定义。

//value  : (MMM DD YYYY format)
function getEpiWeek(value) {
    Date.prototype.getWeek = function () {
        var target = new Date(this.valueOf());
        // ISO week date weeks start on monday, so correct the day number
        var dayNr = (this.getDay() + 7) % 7;
        // Set the target to the thursday of this week so the
        // target date is in the right year
        target.setDate(target.getDate() - dayNr + 3);
        // ISO 8601 states that week 1 is the week with january 4th in it
        var jan4 = new Date(target.getFullYear(), 0, 4);
        // Number of days between target date and january 4th
        var dayDiff = (target - jan4) / 86400000;

        if (new Date(target.getFullYear(), 0, 1).getDay() < 4) {
            return 1 + Math.ceil(dayDiff / 7);
        }
        else {  // jan 4th is on the next week (so next week is week 1)
            return Math.ceil(dayDiff / 7);
        }
    };
    var weekNumber = new Date(value).getWeek()
    var year = getYear(value, weekNumber);
    return weekNumber + ' ' + year;
}   

function getYear(value, weekNumber) {
    var year = parseInt(value.split(' ')[2]);
    if (value.split(' ')[0] == 'Jan') {
        if (weekNumber > 40) {
            year = year - 1;
        }
    }
    if (value.split(' ')[0] == 'Dec') {
        if (weekNumber < 2) {
            year = year + 1;
        }
    }
    return year.toString();
}  

答案 4 :(得分:0)

我在使用.format('YYYY WW')进行比较逻辑时遇到问题。

那真的没有意义,因为在这种情况下您可能应该使用.format('gggg WW')

moment('2013-12-31').format('YYYY w'); // Returns 2013 1
moment('2013-12-31').format('gggg w'); // Returns 2014 1

https://momentjs.com/docs/#/displaying/format/

答案 5 :(得分:0)

我在计算周数时遇到了同样的问题,从星期日开始计算。 最后,我不是从周日而是从周一开始计算周数,从而解决了这个问题。

moment(date).isoWeekday(1).week()

答案 6 :(得分:-1)

使用 :

亲自解决了我的订购问题
 if(d.month()==0) {
                    week = d.week();
                }else{
                    week=d.isoWeek();
                }