我有一个脚本,可以从API检索周数和年份,并将它们转换为MomentJS日期对象。这些条目中的大多数都有正确的日期,只有最后一个对象出错,我看不出原因。
这是json结构:
{
results: {
years: {
2013: {
weeks: [
40, 41, 42, 43
]
}
}
}
}
在Javascript中,我执行以下循环:
for(var i in results.years[year].weeks) {
var week = parseInt(results.years[year].weeks[i]);
var startDate = '' + year + '-' + ( (week.toString().length == 1) ? '' + '0' + week : week ) + '-1';
var eindDate = '' + year + '-' + ( (week.toString().length == 1) ? '0' + week : week ) + '-7';
console.log(moment(startDate, 'GGGG-WW-E', true)); // returns the right date object
var startPeriode = moment(startDate, 'GGGG-WW-E');
console.log(startPeriode); //If week = 43, this returns a date object with date (01 october 2013), rest is all good
var eindPeriode = moment(eindDate, 'GGGG-W-E', true); //Object is always correct
}
错误当前仅在周为43(从API检索的最后一周数)和计算startDate(当前eindDate完美无缺)时发生。时刻对象还包含一些其他变量,这些变量看起来很完美,P.E。:
startDate._a = [
'2013',
9,
21,
0,
0,
0,
0
]
我也尝试了以下内容:
moment('2013-W43-1');
moment('2013-43-1', 'GGGG-W-E');
利用当下对象中的一些元素:
var startPeriode = moment('2013-W43-1');
var startDay = new Date(startPeriode._a[0] + '-' + startPeriode._a[1] + '-' + startPeriode._a[2]);
var startPeriode = moment(startDay);
我真的不知道如何解决这个问题,以及为什么会出错。有人有什么想法吗?
答案 0 :(得分:0)
我无法重现你在10月1日回来的第43周的报告。它总是在10月21日回来给我。我尝试了最新的2.4.0版本的moment.js和旧版本,所以我不确定为什么会这样。
但是,您可能希望进行一些更改:
您应该从字符串创建片刻的唯一原因是您是从字符串输入开始的。由于您是从数字输入开始的,因此构建字符串只是为了再次解析它是没有意义的。
你不应该过分关注片刻的内部结构。 _a
属性(和其他)不适合直接使用。而是使用其中一种输出方法,例如format
(和其他)。如果你想要JS Date
,那么只需使用.toDate()
而不是尝试从部分组装日期。
这是代码的清洁版本。我相信你可以为你的目的调整它。
var weeks = results.years[year].weeks;
for(var i=0; i < weeks.length; i++) {
var startPeriod = moment().year(year).isoWeek(weeks[i]).isoWeekday(1).startOf('day');
var endPeriod = startPeriod.clone().isoWeekday(7).endOf('day');
console.log(startPeriod.format("YYYY-MM-DD HH:mm:ss") + " - " + endPeriod.format("YYYY-MM-DD HH:mm:ss"))
}
输出(设置results
和year
变量后)
2013-09-30 00:00:00 - 2013-10-06 23:59:59
2013-10-07 00:00:00 - 2013-10-13 23:59:59
2013-10-14 00:00:00 - 2013-10-20 23:59:59
2013-10-21 00:00:00 - 2013-10-27 23:59:59