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
有人对此有任何想法吗? (不测试计算周数是否包含覆盖我通过的日期值的最小/最大日期)
答案 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日(共同年份)或任何一年(闰年)是星期四
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
发现
ww
和gggg
WW
和GGGG
w/W
和Y
的混合使用不正确
答案 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
答案 5 :(得分:0)
我在计算周数时遇到了同样的问题,从星期日开始计算。 最后,我不是从周日而是从周一开始计算周数,从而解决了这个问题。
moment(date).isoWeekday(1).week()
答案 6 :(得分:-1)
使用 :
亲自解决了我的订购问题 if(d.month()==0) {
week = d.week();
}else{
week=d.isoWeek();
}