获得正确的约会,但是当我推送到我的月份数组时,我得到奇怪的日期输出

时间:2017-08-01 18:56:56

标签: javascript typescript

所以我想做的是创建一个月的数组。但是当我在我的月份数组中添加几个月时,我得到了

[" 1月"," 2月"," 3月"," 3月"," 4月",& #34; May"," June"," July"," August"," September"," October&# 34;," 12月"]

结果是

。但是在我添加到我的阵列之前,几个月打印得很好。

  • Mon Jan 01 1917 00:00:00 GMT-0500(EST)
  • Thu Feb 01 1917 00:00:00 GMT-0500(EST)
  • Thu Mar 01 1917 00:00:00 GMT-0500(EST)
  • Sun Apr 01 1917 00:00:00 GMT-0400(EDT)
  • 。 。 。 1917年11月1日星期四00T 00:00:00 GMT-0400 (EDT)
  • 1912年12月1日星期六19:30 00:00:00 GMT-0500(EST)

通知4月和11月属于' raw'输出。 我检查了this similar question和其他人,但他们并没有像我想象的那样相似。除了2月3日'问题。

如果重要,我使用的是Chrome版本59.0.3071.115(官方版本)(64位)

这是我的代码:

getMonths(form: string = 'long'): string[] {
  if (form.toLowerCase() !== 'long' || form.toLowerCase() !== 'short') {
    form = 'long';
  }
  if (!this.yearSelected) { // sets default year to today
    this.yearSelected = this.today.getFullYear();
  }
  let months: string[] = [];
  let locale: string = "en-US";
  let month: Date;
  // console.log(this.selectedYear);
  for (let i = 0; i < 12; i++) {
    month = new Date(this.yearSelected, i, 1);
    console.log(month);
    months.push(month.toLocaleString(locale, { month: form }));
    console.log(months[i]); // <-getting odd output from here
  }

  return months;
}

在for循环中,我将1添加到了&#39; day&#39;根据我提供的链接参数。但我原来的代码是

month = new Date(this.yearSelected, i);

如果重要的话。我还在for循环结束时评论(用于指示)有问题的输出。

修改:刚刚更新为Chrome 60.0.3112.78

编辑:删除错字toLocalLowerCase - &gt; toLowercase()

编辑:所以这个问题与夏令时有关。感谢James&#39;建议,我添加15到月=新日期(this.yearSelected,i)因此它现在是月=新日期(this.yearSelected,i,15)。我将研究使用UTC dates - Mozilla link

2 个答案:

答案 0 :(得分:1)

  • Thu Mar 01 1917 00:00:00 GMT-0500(EST)
  • Sun Apr 01 1917 00:00:00 GMT-0400(EDT)

你在不同的时区,日期将它们转换为当地时间,它正确地执行,1917年4月1日的EDT,转换为美国东部时间,3月31日23:00:00,这就是为什么你得到3月,三月。

这是纯TypeScript问题以及TypeScript如何转换回JavaScript,TypeScript与UTCString而不是LocaleTimeString没有相同的问题。

getMonths(form: string = 'long'): string[] {
  if (form.toLowerCase() !== 'long' || form.toLowerCase() !== 'short') {
    form = 'long';
  }
  if (!this.yearSelected) { // sets default year to today
    this.yearSelected = this.today.getFullYear();
  }
  let months: string[] = [];
  let locale: string = "en-US";
  let month: Date;
  // console.log(this.selectedYear);
  for (let i = 0; i < 12; i++) {
    month = new Date(this.yearSelected, i);
    console.log(month);
    months.push(month.toUTCString(locale, { month: form }));
    console.log(months[i]); // <-getting odd output from here
  }

  return months;
}

按预期返回["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]

答案 1 :(得分:0)

布莱恩和詹姆斯提到这是一个夏令时问题。我使用了James的建议并添加了

month = new Date(this.yearSelected, i, 15); // 15 to avoid daylight savings time issues

解决了这个问题。我还看到我可以在js中使用UTC日期,我会调查。感谢。