MomentJS日期对象是错误的

时间:2013-11-21 08:13:43

标签: javascript date momentjs

我有一个脚本,可以从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);

我真的不知道如何解决这个问题,以及为什么会出错。有人有什么想法吗?

1 个答案:

答案 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"))
}

输出(设置resultsyear变量后)

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