【问题标题】:Detect if string is a Date with an exact given format检测字符串是否是具有精确给定格式的日期
【发布时间】:2017-10-05 12:01:00
【问题描述】:

我想检查一个字符串是否代表具有给定格式的日期。 我尝试了Date.parse(string, format),但它会将字符串解析为日期,即使它的格式完全不同。例如:

Date.parse("2015-07-04T23:10:00.000+02:00", "yyyy-MM-ddTHH:mm:ss.SSSZ") // Parsed as a date
Date.parse("2000", "yyyy-MM-ddTHH:mm:ss.SSSZ") // Parsed as a date also`

我不想将第二行解析为日期,因为它不是所需的格式。 我还尝试了Date.jsDate.parseExact() 方法,但如果我提供了上面的时区和格式,它不会解析日期。

正确的解决方案基于 RobG 的评论:(但感谢大家帮助我)

moment("2015-07-04T23:10:00.000+02:00", "yyyy-MM-ddTHH:mm:ss.SSSZ", true).isValid()

即使输入只是我试图避免的一年,其他所有解决方案都会成功解析。最后一个参数“true”代表“严格”解析,它提供了我正在寻找的输出。

【问题讨论】:

  • 你可以试试ECMA-262,Date.parse 只接受一个参数,任何额外的参数都会被忽略。如果您只想检查一种格式,则只需 3 或 4 行代码。但是,如果您的要求超出此范围,请使用库。有很多好的解析器和格式化程序,例如Fecha.js, moment.js.
  • 使用自定义正则表达式可能不是一个坏主意
  • 但是 Date.parse 将解析所有可能是我不想要的日期的内容,我只想在字符串与给定格式匹配的情况下解析,否则失败。

标签: javascript date parsing format


【解决方案1】:

您可以利用 MomentJS 及其函数.format()

它是如何工作的?这是文档,它相当简单,您想将字符串与格式字符串结合使用。

MomentJS .format()

这里是 Fiddle 的快速演示:

var myString = "2015-07-04T23:10:00.000+02:00";
var formatString = "yyyy-MM-ddTHH:mm:ss.SSSZ";
if (moment(myString, formatString)._i == myString) console.log("GOOD");

1-liner with momentJS

我基本上将您的字符串格式化为目标格式,然后检查结果是否与您的字符串匹配。

值得注意的是,MomentJS 是(恕我直言)JS 的最佳日期和时间库。自从我发现它以来,在过去使用了一些功能较弱的库之后,我再也没有找到超越它的理由。

如果你不想使用 lib,制作一个适合你需要的正则表达式是一个类似长度的可行替代方案。

尽管如此,如果您打算处理很多日期/时间,MomentJS 仍然是一种可行的方法,因为它提供了很多有用的东西,而单靠正则表达式是无法完成的。

【讨论】:

  • moment("2015-07-04T23:10:00.000+02:00", "yyyy-MM-ddTHH:mm:ss.SSSZ", true) 合而为一。但使用 OP 中未提及或未标记的库来回答并不是一个好主意。
  • @RobG - 非常流畅!我认为这是一个很好的建议,因为他已经尝试过使用 DateJS 并且 MomentJS 远远优于他,而且他从未提到他需要一个普通的解决方案。
【解决方案2】:

为什么不使用正则表达式来检查输入是否与格式匹配,如果匹配则解析它?

reg=new RegExp(/[0-9]{4}\-[0-9]{2}\-[0-9]{2}T[0-9]{2}\:[0-9]{2}\:[0-9]{2}\.[0-9]{3}\+[0-9]{2}\:[0-9]{2}/);
str="2015-07-04T23:10:00.000+02:00";
date=new Date(str);
if(str.match(reg) && date.toString()!='Invalid Date')
  {
    Date.parse(str);
  }

编辑添加日期检查。

【讨论】:

  • 那不检查它是否是一个有效的日期。
  • 这太简单的正则表达式无法匹配日期。它将匹配 str="2015-99-99T23:10:00.000+02:00" 和许多其他非日期值。只有当我 100% 确定这是我得到的有效日期时,我才会使用它。好吧,我什至不会,因为我相信我得到的数据是卫生的,所以我会零售正则表​​达式;)
  • 这一添加使一切变得不同;)
  • 谢谢大家,验证 FTW。
猜你喜欢
  • 1970-01-01
  • 2013-10-16
  • 2013-01-01
  • 2012-02-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多