我正在尝试将字符串日期格式(yyyyMMddThhmmssZ)解析为Date。
const date = Date.parse("20171201T120000Z");
console.log(date );
结果是......
NaN
你能用最聪明的方式教我吗?
答案 0 :(得分:3)
理想情况下,您应该尝试以最适合您需求的方式标准化日期字符串。作为MDN states,从字符串解析日期通常是有问题的。
Date.parse()
注意:由于浏览器差异和不一致,强烈建议不要使用Date.parse解析字符串。
虽然您的日期格式为valid ISO 8601,如@duskwuff的评论所示,Date.parse
不支持。
似乎the version specified here by ECMAScript is supported,YYYY-MM-DDTHH:mm:ss.sssZ
,但不是像您使用的20180131T011614Z
这样的格式。似乎Date.parse仅支持ISO 8601格式的简化。
像moment.js这样的库非常有用,因为它可以自动解析各种日期格式(包括您的有效ISO 8601日期),或者您甚至可以根据需要明确指定日期格式。
moment('20171201T120000Z', 'YYYYMMDDTHHmmssZ').toString()
"Fri Dec 01 2017 06:00:00 GMT-0600"
moment('20171201T120000Z').toString()
"Fri Dec 01 2017 06:00:00 GMT-0600"
但是,对于您的示例,您可以在没有moment.js的情况下解析日期
let dateString = '20171201T120000Z'
let [_, year, month, day, hour, min, sec] = dateString.match(/(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2})/)
// month is 0-based so subtract 1
new Date(year, month - 1, day, hour, min, sec)
你能用最聪明的方式教我吗?
我会说"最聪明的方式"根据你的具体情况而变化很大。
只要你使用某些标准(即使Date.parse
不直接支持它),我会说解析可以用任何最好的方法完成为了你。像moment
这样的库,手动解析日期元素,将日期翻译成纪元或Date.parse
识别的格式,或者您喜欢的任何格式。