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(美国东部时间)
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(美国东部时间)
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