Javascript 获取正确的日期,但当我推到我的月数组时,我会得到奇数日期输出

Javascript 获取正确的日期,但当我推到我的月数组时,我会得到奇数日期输出,javascript,typescript,Javascript,Typescript,所以我想做的是创建一个月数组。但是,当我将月份添加到我的月份数组中时,我得到 [“一月”、“二月”、“三月”、“三月”、“四月”、“五月”、“六月”、“七月”、“八月”、“九月”、“十月”、“十二月”] 结果,。但在我添加到数组之前,月份打印出来的很好 1917年1月1日星期一00:00:00 GMT-0500(美国东部时间) 1917年2月1日星期四00:00:00 格林尼治标准时间-0500(美国东部时间) 1917年3月1日星期四00:00:00 GMT-0500(美国东部时间) 四月一

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

[“一月”、“二月”、“三月”、“三月”、“四月”、“五月”、“六月”、“七月”、“八月”、“九月”、“十月”、“十二月”]

结果,。但在我添加到数组之前,月份打印出来的很好

  • 1917年1月1日星期一00:00:00 GMT-0500(美国东部时间)
  • 1917年2月1日星期四00:00:00 格林尼治标准时间-0500(美国东部时间)
  • 1917年3月1日星期四00:00:00 GMT-0500(美国东部时间)
  • 四月一日星期日 1917 00:00:00 GMT-0400(美国东部时间)
  • 。1917年11月1日星期四00:00:00 GMT-0400 (美国东部时间)
  • 星期六1917年12月1日00:00:00 GMT-0500(美国东部时间)
请注意,四月和十一月是“原始”输出。 我已经检查了和其他人,但他们不像我想的那样相似。除了3月2日的那期

如果重要的话,我使用的是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循环的末尾对有问题的输出进行了注释(作为指示)

编辑:刚刚更新到Chrome 60.0.3112.78

编辑:删除了toLocalLowerCase->toLowercase()的打字错误

编辑:所以问题与夏令时有关。由于James的建议,我在month=新日期(this.yearSelected,I)中添加了15,因此现在是month=新日期(this.yearSelected,I,15)。我将研究使用

  • 1917年3月1日星期四00:00:00GMT-0500(美国东部时间)
  • 1917年4月1日星期日00:00:00GMT-0400(美国东部时间)
你在不同的时区,日期将它们转换为当地时间,这是正确的,1917年4月1日太阳的东部夏令时,转换为东部夏令时,是3月31日23:00:00,因此你得到了3月,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;
}
getMonths(形式:string='long'):string[]{
if(form.toLowerCase()!='long'| | form.toLowerCase()!='short'){
形式='长';
}
如果(!this.yearSelected){//将默认年份设置为今天
this.yearSelected=this.today.getFullYear();
}
let months:string[]=[];
让locale:string=“en-US”;
月份:日期;
//console.log(此.selectedYear);
for(设i=0;i<12;i++){
月份=新日期(选择this.year,i);
控制台日志(月);
month.push(month.toutString(locale,{month:form}));

console.log(months[i]);//正如Brian和James提到的,这是一个夏令时问题

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

这解决了问题。我还发现我可以在js中使用UTC日期,我将对此进行研究。谢谢。

this.yearSelected==Number(“”)| |!this.yearSelected
可以缩短为
!this.yearSelected
form.toLowerCase()!='long'| form.tolocallowercase()!=='short'
始终是
真的
这对我来说很有效。也在typescript操场上测试和工作。编辑:实际日期正确(1917年)它显示了所描述的行为。令人怀疑的是,混乱的月份是DST开始和结束的月份。@0mpurdy我将您的日期更改为:this.yearSelected=this.today.getFullYear()-100;这应该会复制错误(当我选择1917年作为年份时)。除非有更好的方法,否则我会研究使用UTC。输入时间的来源是哪里?如果您更改的时间不正确,则日期应尽可能以一致的方式出现。我正在制作一个下拉日期选择器。选择年份,然后选择月份,日期。年份在一个范围内(18岁-100岁)-因此1917年。另外,从客户端角度来看。如果你是这么问的。没关系,我看到了,奇怪的是,你的代码在我的机器上本地运行得很好,但实际上,纯javascript正在工作,这是一个typescript问题,typescript正在失败,但是你的原始代码可以通过将toLocaleString更改为ToutString()编辑我的答案,如果你用纯javascript做这件事,它会很好,这是一个从TypeScript到javascript的转换错误,你不必将所有内容都更改为UTC日期,只需调用toLocaleString()到toutString();这根本不会影响基础日期,并且您的代码的其余部分都不需要更改,也不需要添加额外的天数或时间来影响可读性。请列出您的建议。我喜欢它,但我必须执行month.toutString().substr(7,4));提取月份。否则,我会收到一个错误,指出提供的参数与调用目标的任何签名都不匹配
month = new Date(this.yearSelected, i, 15); // 15 to avoid daylight savings time issues