为何我的Luxon代码出现“Invalid DateTime”?如何修复?
问题分析与修复方案
为啥会出现这个问题?
你踩了一个Luxon入门常见的小坑:DateTime.fromISO() 这个方法是专门用来解析ISO 8601格式的字符串的,但你却传了一个原生的JavaScript Date 对象进去。当你把Date对象传给fromISO时,Luxon会自动调用该对象的toString()方法,而Date.toString()返回的格式(比如"Wed Jan 24 2018 12:29:57 GMT+0800 (中国标准时间)")根本不是标准的ISO格式,Luxon解析失败后就生成了一个标记为invalid: "unparsable"的无效DateTime实例,这时候调用toFormat()自然就返回"Invalid DateTime"了。
怎么修复?
根据你的场景,有几种简单靠谱的解决方式:
用专门的
fromJSDate方法(最推荐)
Luxon早就想到了要和原生Date对象互转,专门提供了DateTime.fromJSDate()方法,直接把你的Date对象传进去就行:const dt = DateTime.fromJSDate(new Date(date)); dt.toFormat('yyyy/mm/dd'); // 这下就能正常返回格式化后的日期了如果
date本身是ISO字符串,直接传
要是你的date变量本来就是一个ISO格式的字符串(比如"2018-01-24T12:29:57.386Z"),那完全没必要多此一举转成Date对象,直接传给fromISO就行:const dt = DateTime.fromISO(date); dt.toFormat('yyyy/mm/dd');如果是时间戳,用
fromMillis
要是date是毫秒级的时间戳(数字类型),那就用DateTime.fromMillis()来创建实例:const dt = DateTime.fromMillis(date); dt.toFormat('yyyy/mm/dd');
调试小技巧
排查问题时可以用dt.isValid属性快速判断实例是否有效,能帮你快速定位问题:
console.log(dt.isValid); // 无效实例返回false,有效则返回true
内容的提问来源于stack exchange,提问作者alex
相关产品推荐
相关产品推荐

