Angular 4日期选择器保存时始终取当前日期问题求助
解决Angular 4日期选择器保存当前日期而非选择日期的问题
嘿,我来帮你搞定这个恼人的日期保存问题!咱们先理清楚问题出在哪,再一步步解决:
问题根源
你的type="date"输入框要求绑定的ngModel值必须是**YYYY-MM-DD格式的纯日期字符串**,但你现在初始化newCreate和newEnd时用了substring(0, 19),得到的是带时间部分的字符串(比如2018-03-23T12:00:00),这和日期输入框的预期格式不匹配,导致输入框和变量的绑定出现异常——你选择的日期根本没正确同步到newCreate/newEnd里,最后转成Date对象自然就变成当前日期了。
修复步骤
1. 修正初始值格式
把初始化代码改成只截取YYYY-MM-DD部分:
newCreate: string = new Date().toISOString().substring(0, 10); // 得到 "2018-03-23" 这样的格式 newEnd: string = new Date().toISOString().substring(0, 10);
2. 正确转换日期(避免时区偏移)
直接用new Date(YYYY-MM-DD)会让浏览器把日期解析为UTC时区的当天0点,如果你的本地时区不是UTC,可能导致日期偏移(比如东八区的用户会看到前一天的16点)。我们可以手动构建本地时间的日期对象:
修改你的save方法里的日期转换逻辑:
save() { this.newProject.name = this.newProjectName; this.newProject.state = this.newState; this.newProject.type = this.newType; // 处理开始日期:拆分年/月/日,注意月份是0-based的 const createParts = this.newCreate.split('-'); this.newProject.created = new Date( parseInt(createParts[0]), parseInt(createParts[1]) - 1, parseInt(createParts[2]) ); // 处理结束日期同理 const endParts = this.newEnd.split('-'); this.newProject.ending = new Date( parseInt(endParts[0]), parseInt(endParts[1]) - 1, parseInt(endParts[2]) ); this.newProject.category = this.category; this.newProject.subProjectIds = this.subProjectIds; this.store.dispatch(new UpsertProjectAction(this.newProject)); this.dialogRef.close(this.newProject); }
如果你的后端要求UTC时间,也可以用Date.UTC来构建:
this.newProject.created = new Date(Date.UTC( parseInt(createParts[0]), parseInt(createParts[1]) - 1, parseInt(createParts[2]) ));
为什么之前的ngModelChange没用?
因为初始的格式不匹配,输入框和ngModel的绑定本身就失效了——你修改的值根本没正确同步到变量里。先把初始格式改对,绑定正常后,选择的日期才会正确存入newCreate/newEnd,后续的转换自然就生效了。
内容的提问来源于stack exchange,提问作者user9049996
相关产品推荐
相关产品推荐

