Ionic 请提供有效的 ISO 8601 日期时间格式日期时间问题
Ionic Please provide a valid ISO 8601 datetime format datetime issue
我正在尝试通过 ngModel 绑定我的 Ionic DateTime 组件。我从后端得到一个看起来像这样的值
"30-07-2021 12:00:00 AM"
然后我处理成-
var date = "30-07-2021 12:00:00 AM"
var finalDate = date.split(" ")[0].split("-");
var fdate =
finalDate[2] +
"-" +
finalDate[1] +
"-" +
finalDate[0];
var ISOdate = new Date(fdate).toISOString()
console.log(ISOdate);
我得到一个错误
“错误解析日期:“2021-07-30T00:00:00.000Z”。请提供有效的 ISO 8601 日期时间格式”
我做错了什么?
这是我的日期时间组件-
<ion-datetime
(ionChange)="onChange(filters.DTO_Property_Name,$event,filters.Data_Type_Enum)"
cancelText="Clear"
(ionCancel)="clear(filters.Filter_Name)"
[(ngModel)]="myDateValues[filters.Filter_Name]"
displayFormat="DD/MM/YYYY"
>
</ion-datetime>
评论多于回答。
您正在解析像“30-07-2021 12:00:00 AM”这样的字符串,方法是首先将其解析并重新格式化为“2021-07-30 12:00:00 AM”,然后使用内置的-在解析器中。这不是一个好主意,因为字符串不是 ECMA-262 支持的格式,因此解析取决于实现。
该字符串应被视为本地字符串,因此:
new Date(fdate).toISOString();
不应生成像“2021-07-30T00:00:00.000Z”这样的时间戳,除非您的偏移量为 +0 或者它被解析为 UTC(它也可能 return“无效日期”或抛出范围错误)。我猜你希望它被视为 UTC。
可能离子解析器对 toISOString 产生的小数秒感到不安,所以要么删除它们,要么不使用 toISOString .
例如只需重新格式化字符串,避免 Date 和 toISOString:
// Reformat "30-07-2021 12:00:00 AM" to "2021-07-30T00:00:00Z"
function formatTimestamp(ts) {
let [D,M,Y,h,m,s,ap] = ts.toLowerCase().split(/\W/);
h = String(h%12 + (ap == 'am'? 0 : 12)).padStart(2, '0');
return `${Y}-${M}-${D}T${h}:${m}:${s}Z`;
}
console.log(formatTimestamp("30-07-2021 12:00:00 AM"));
我正在尝试通过 ngModel 绑定我的 Ionic DateTime 组件。我从后端得到一个看起来像这样的值
"30-07-2021 12:00:00 AM"
然后我处理成-
var date = "30-07-2021 12:00:00 AM"
var finalDate = date.split(" ")[0].split("-");
var fdate =
finalDate[2] +
"-" +
finalDate[1] +
"-" +
finalDate[0];
var ISOdate = new Date(fdate).toISOString()
console.log(ISOdate);
我得到一个错误 “错误解析日期:“2021-07-30T00:00:00.000Z”。请提供有效的 ISO 8601 日期时间格式”
我做错了什么?
这是我的日期时间组件-
<ion-datetime
(ionChange)="onChange(filters.DTO_Property_Name,$event,filters.Data_Type_Enum)"
cancelText="Clear"
(ionCancel)="clear(filters.Filter_Name)"
[(ngModel)]="myDateValues[filters.Filter_Name]"
displayFormat="DD/MM/YYYY"
>
</ion-datetime>
评论多于回答。
您正在解析像“30-07-2021 12:00:00 AM”这样的字符串,方法是首先将其解析并重新格式化为“2021-07-30 12:00:00 AM”,然后使用内置的-在解析器中。这不是一个好主意,因为字符串不是 ECMA-262 支持的格式,因此解析取决于实现。
该字符串应被视为本地字符串,因此:
new Date(fdate).toISOString();
不应生成像“2021-07-30T00:00:00.000Z”这样的时间戳,除非您的偏移量为 +0 或者它被解析为 UTC(它也可能 return“无效日期”或抛出范围错误)。我猜你希望它被视为 UTC。
可能离子解析器对 toISOString 产生的小数秒感到不安,所以要么删除它们,要么不使用 toISOString .
例如只需重新格式化字符串,避免 Date 和 toISOString:
// Reformat "30-07-2021 12:00:00 AM" to "2021-07-30T00:00:00Z"
function formatTimestamp(ts) {
let [D,M,Y,h,m,s,ap] = ts.toLowerCase().split(/\W/);
h = String(h%12 + (ap == 'am'? 0 : 12)).padStart(2, '0');
return `${Y}-${M}-${D}T${h}:${m}:${s}Z`;
}
console.log(formatTimestamp("30-07-2021 12:00:00 AM"));