JavaScript使用ISO格式日期初始化Date对象报错的处理与格式化方法
问题原因
你现在碰到的语法报错和这个ISO格式日期的兼容性完全无关,本质是代码写法漏了给日期字符串加引号。
JS引擎解析你写的new Date(2021-01-27T14:29:22.723782Z)时,会把括号里不带引号的内容当成算术表达式和非法字符,在语法解析阶段就直接抛出「Invalid or unexpected token」的错误,根本走不到Date对象解析日期的环节。
后端返回的带Z后缀的ISO 8601格式字符串,本身就是JS Date构造函数原生支持的合法入参,只要作为普通字符串传入,就能正常解析。
正确处理流程
修正Date初始化写法
把日期值用引号包裹,作为字符串传入构造函数即可:
// 正确写法:字符串带引号 const date = new Date('2021-01-27T14:29:22.723782Z')
如果这个日期值是从接口返回的变量拿到的,比如const backendTime = response.data.createTime,直接把变量传给Date即可,不需要额外加引号:
const date = new Date(backendTime)
按DD/MM/YYYY:MM:SS格式提取结果
需要注意几个容易踩的细节:
- Date对象的月份是从0开始计数的,取出的月份值要+1才是实际的自然月数
- 个位数的日、月、时、分要补前导零,保证输出格式统一为两位数字
- 原日期字符串带Z标记,代表是UTC时区的时间,如果要严格对应后端返回的UTC时间数值,用
getUTC*系列方法取值;如果要展示用户本地时区转换后的时间,换成普通的get*系列方法即可
可直接运行的示例代码:
const rawBackendTime = '2021-01-27T14:29:22.723782Z' const dateInstance = new Date(rawBackendTime) // 个位数补零工具 const padZero = (num) => String(num).padStart(2, '0') // 拼接目标格式 DD/MM/YYYY:MM:SS const formattedResult = [ padZero(dateInstance.getUTCDate()), padZero(dateInstance.getUTCMonth() + 1), dateInstance.getUTCFullYear() ].join('/') + ':' + [ padZero(dateInstance.getUTCHours()), padZero(dateInstance.getUTCMinutes()) ].join(':') // 最终输出:27/01/2021:14:29 console.log(formattedResult)
内容的提问来源于stack exchange,提问作者c137
相关产品推荐
相关产品推荐

