【问题标题】:Validate if string is a date [duplicate]验证字符串是否为日期 [重复]
【发布时间】:2020-09-15 22:39:22
【问题描述】:

我看过很多关于这个的文章,但还没有找到我想要的。

我试图简单地检查一个字符串是否是一个日期。该字符串可能包含诸如 2012 之类的数字。

var timestamp = Date.parse('foo 2012');

if (isNaN(timestamp) == false) {
  var d = new Date(timestamp);
  console.log('DATE', d)
}else{
   console.log('TEXT');
}

//输出:DATE Sun Jan 01 2012 00:00:00 GMT+1100(澳大利亚东部夏令时间)

  • 为什么 javascript 将 foo 2012 转换为显然不是日期的日期?
  • 如何验证我的字符串是实际日期?

【问题讨论】:

  • 定义“是一个日期”
  • 每个 JavaScript 环境都有自己的规则来解析非 ISO 标准格式的日期字符串。你不能指望它是一致的。这就是 Moment 这样的库存在的原因:您决定您认为日期字符串是什么(或可能性列表),然后明确告诉它要解析什么。
  • 每个帖子只问一个问题。对于第一个问题,解析是否不受支持的格式取决于实现。 Date.parse('foo 2012') 在不同的实现中产生不同的结果。对于第二个问题,请参阅第二个副本。

标签: javascript date date-conversion date-parsing


【解决方案1】:

字符串永远不是日期。

字符串可以表示日期。通过不同的字符串格式来表示同一个日期的方式有很多种。

这意味着“验证字符串是否为日期”是一项不可能完成的任务。你可以做的是:

  1. 验证字符串的格式是否符合某些众所周知的格式并且其内容有效。
  2. 尝试将给定字符串解析为预期格式,然后抛出错误或返回“guard”值以指示解析不成功。

JavaScript 采用了第三个选项,类似于选项 2,只是它返回一个值,表明它在处理垃圾输入时“尽最大努力”。这显然是为什么它在你的字符串中看到了一年并决定“好吧,我想我可以和这个约会?”正如@Pointy 指出的那样,实际上在规范中,如果 JavaScript 字符串与两种支持的格式之一不匹配,实现者可以决定结果应该是什么。

我强烈建议您在处理日期字符串时,应坚持使用一致的格式。我是 ISO 8601 日期/时间字符串的忠实粉丝,因为它们可以识别时区、易于排序并且得到广泛支持(包括易于被 JavaScript 解析)。如果您要求字符串采用标准格式,则更容易执行查找A RegExp that can validate the input 等操作。

【讨论】:

  • 给我任何字符串和任何日期,我可以定义一个到另一个的映射。
  • @JeffDege 如果字符串用中文写怎么办?此外,OP 是关于验证字符串“是日期”。 “15/08/2019”是日期吗?它在欧洲,但不在美国。
  • 没关系。如果我可以定义映射,我可以随意制作。
  • 我很惊讶 javascript 仍然将 foo 转换为日期,而它显然不是。
猜你喜欢
  • 2015-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-19
  • 1970-01-01
  • 1970-01-01
  • 2021-07-11
  • 1970-01-01
相关资源
最近更新 更多