我的一个组件中有一个带有日期选择器的表单。该组件的构造函数如下所示。
input{
# something here to get a value of variable stored in a different file
elasticsearch{
hosts=>"abc.de.fg.hi:jklm"
query=>'{--some query---}'
}
}
output{
elasticsearch{
hosts=>"xxx.xx.xx.xx:yyyy"
}
由于我用来设置日期选择器的默认值的dob.toString(),我收到以下错误消息。
constructor(public navCtrl: NavController, private formBuilder: FormBuilder,
private profileService: ProfileService) {
this.formIsValid = true;
let dobObj = JSON.parse(localStorage.getItem('current_profile')).stripeAccount.legal_entity.dob;
let dob = (dobObj.year && dobObj.month && dobObj.day) ? dobObj.year + "-" + dobObj.month + "-" + dobObj.day : '';
console.log(dob); // This prints "1999-12-31"
this.dobForm = formBuilder.group({
dob: [dob.toString(), Validators.required]
});
}
我控制台在formBuilder之前记录了值,并按预期打印出日期。在用于在formBuilder中设置默认值之前,似乎字符串以某种方式被更改。如果我硬编码字符串" 1999-12-31"在formBuilder而不是使用变量,它的工作原理。我甚至检查确保" dob ===' 1999-12-31'"是真的。
为什么硬编码字符串在设置默认值时起作用,但具有完全相同值的变量不起作用?
编辑:
这必须是日期选择器的错误。如果我输入" 1999-12-31"作为硬编码字符串,它按预期工作。如果我进入" 1997-1-1"或" 1997-12-3"它失败。它接受一些有效的日期,而不接受其他日期。
编辑2:
检查出来:
WARN: Error parsing date: "null". Please provide a valid ISO 8601 datetime format: https://www.w3.org/TR/NOTE-datetime
为什么在地球上这么多字符串无法解析为日期? " 1999-12-31"之间的区别是什么?和其他人?
答案 0 :(得分:0)
此问题的原因是您的日期选择器将null
作为值。在datepicker的代码中,他们没有null
值的验证。
参考:https://github.com/driftyco/ionic/blob/master/src/util/datetime-util.ts
的源代码export function updateDate(existingData: DateTimeData, newData: any) {
if (isPresent(newData) && newData !== '') {
if (isString(newData)) {
// new date is a string, and hopefully in the ISO format
// convert it to our DateTimeData if a valid ISO
newData = parseDate(newData);
if (newData) {
// successfully parsed the ISO string to our DateTimeData
Object.assign(existingData, newData);
return;
}
} else if ((isPresent(newData.year) || isPresent(newData.hour) || isPresent(newData.month) || isPresent(newData.day) || isPresent(newData.minute) || isPresent(newData.second))) {
// newData is from of a datetime picker's selected values
// update the existing DateTimeData data with the new values
// do some magic for 12-hour values
if (isPresent(newData.ampm) && isPresent(newData.hour)) {
if (newData.ampm.value === 'pm') {
newData.hour.value = (newData.hour.value === 12 ? 12 : newData.hour.value + 12);
} else {
newData.hour.value = (newData.hour.value === 12 ? 0 : newData.hour.value);
}
}
// merge new values from the picker's selection
// to the existing DateTimeData values
for (var k in newData) {
(<any>existingData)[k] = newData[k].value;
}
return;
}
// eww, invalid data
console.warn(`Error parsing date: "${newData}". Please provide a valid ISO 8601 datetime format: https://www.w3.org/TR/NOTE-datetime`);
} else {
// blank data, clear everything out
for (var k in existingData) {
delete (<any>existingData)[k];
}
}
}
答案 1 :(得分:0)
如果在单个数字日期前添加“0”,则可以创建日期,如下所示:
console.log(new Date("2000-8-20")); // null
console.log(new Date("2000-08-20")); // Sun Aug 20 2000 10:00:00 GMT+1000 (AEST)
要设置日期选择器的默认值,(正如@briosheje指出的那样)这对我有用:
this.fromDate = new Date().toISOString();
没有它,我得到了与问题中描述的相同的解析错误。