如何从字符串值解析日期,如' 20180131T120000Z'?

时间:2018-01-31 00:35:15

标签: javascript node.js

我正在尝试将字符串日期格式(yyyyMMddThhmmssZ)解析为Date。

const date = Date.parse("20171201T120000Z");
console.log(date );

结果是......

NaN

你能用最聪明的方式教我吗?

1 个答案:

答案 0 :(得分:3)

理想情况下,您应该尝试以最适合您需求的方式标准化日期字符串。作为MDN states,从字符串解析日期通常是有问题的。

  

Date.parse()

     

注意:由于浏览器差异和不一致,强烈建议不要使用Date.parse解析字符串。

虽然您的日期格式为valid ISO 8601,如@duskwuff的评论所示,Date.parse不支持。

似乎the version specified here by ECMAScript is supportedYYYY-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识别的格式,或者您喜欢的任何格式。