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 .

例如只需重新格式化字符串,避免 DatetoISOString:

// 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"));