如何让moment.format()支持解析YYYY-MM-DDTh:mm:ss.sssz+ZZ:ZZ格式日期?
解决Moment.js解析
YYYY-MM-DDTh:mm:ss.sssz+ZZ:ZZ格式日期的问题 你的日期字符串2022-10-21T12:25:00.016Z+03:00触发"invalid date"错误,是因为它不符合标准ISO 8601规范:Z代表UTC时区,不能和后面的+03:00时区偏移同时存在,Moment的默认解析器无法识别这种冲突格式。
下面两种方法可以解决这个问题:
方法1:自定义解析格式
直接告诉Moment你的日期字符串的具体结构,用方括号[]转义字面量的Z,让它正确识别后面的时区偏移:
const dateStr = '2022-10-21T12:25:00.016Z+03:00'; // [Z]表示字面量Z,ZZ匹配±HH:mm格式的时区偏移 const formattedDate = moment(dateStr, 'YYYY-MM-DDTHH:mm:ss.SSS[Z]ZZ'); console.log(formattedDate.format('DD.MM.YYYY')); // 输出 21.10.2022 console.log(formattedDate.format('hh:mm')); // 输出对应时区转换后的时间
方法2:预处理字符串
如果日期字符串属于输入错误(Z和时区偏移二选一即可),可以先预处理字符串再解析:
- 保留时区偏移,去掉多余的
Z:
const dateStr = '2022-10-21T12:25:00.016Z+03:00'; const processedStr = dateStr.replace('Z', ''); console.log(moment(processedStr).format('DD.MM.YYYY')); // 21.10.2022 console.log(moment(processedStr).format('hh:mm')); // 03:25(基于UTC+3时区转换)
- 保留UTC的
Z,去掉后面的时区偏移:
const dateStr = '2022-10-21T12:25:00.016Z+03:00'; const processedStr = dateStr.split('Z')[0] + 'Z'; console.log(moment(processedStr).format('DD.MM.YYYY')); // 21.10.2022 console.log(moment(processedStr).format('hh:mm')); // 根据本地时区转换,如UTC+8时区输出08:25
注意:选择哪种方法取决于你实际需要的时间逻辑——是基于UTC时间,还是基于+03:00时区的时间。
内容的提问来源于stack exchange,提问作者Patrice
相关产品推荐
相关产品推荐

