如何测试字符串是有效日期还是不使用时刻?

Posted

技术标签:

【中文标题】如何测试字符串是有效日期还是不使用时刻?【英文标题】:How to test a string is valid date or not using moment? 【发布时间】:2015-03-29 10:55:04 【问题描述】:

我想测试输入的日期和/或时间是否有效。

这可以通过时刻来完成,因为使用 javascript 进行日期和时间测试似乎是一场噩梦。 (为此花费了数小时)。

测试数据如下所示。

无效

invalid = ""
invalid = " "
invalid = "x"
invalid = "1/1"
invalid = "30/2/2015"
invalid = "2/30/2015"

有效

isvalid = "1/12/2015"
isvalid = "1/12/2015 1:00 PM";

尝试了各种 javascript 方法,但数小时的试验都失败了。

我认为 moment 会有一些东西。所以尝试了以下方法,所有这些都不起作用,因为我不认为 moment 像这样工作。

var valid = moment(input).isDate()
var valid = moment().isDate(input)

我的时间格式是“dd/mm/yyyy”

【问题讨论】:

***.com/questions/1353684/… 再次,这是检查对象是否为日期对象 我认为反对者没有很好地阅读我的问题;如果他们有时间正确阅读我的问题并查看接受的答案.... moment 中还内置了一个.isValid() 函数,但它的验证非常松散。你在做任何形式的验证吗?如果是这样,我会使用正则表达式来验证您的日期。编辑:moment 也进行严格解析:***.com/a/24392357/831803 欣赏这是一个老问题,但您会考虑将接受的答案更改为引用 isValid() 的答案。我想在这里欺骗其他东西,但接受的答案不再是最好的。 【参考方案1】:

Moment 有一个名为 isValid 的函数。

您希望使用此函数连同目标日期格式将解析参数严格设为 true(否则您的验证可能不一致)委托给库所有需要的检查(如闰年):

var dateFormat = "DD/MM/YYYY";
moment("28/02/2011", dateFormat, true).isValid(); // return true
moment("29/02/2011", dateFormat, true).isValid(); // return false: February 29th of 2011 does not exist, because 2011 is not a leap year

【讨论】:

我认为这个答案应该是公认的答案。 isValid() 函数能够处理诸如闰年之类的事情,并且您不会像当前接受的答案那样进行所有字符串比较。 您可能还需要使用第三个参数:从版本 2.3.0 开始,您可以为最后一个参数指定一个布尔值,以使 Moment 使用严格解析。 ***.com/questions/19978953/… 上面的评论很重要,见例子:var dateFormat = 'DD.MM.YYYY'; var givendate = '12'; alert(moment(givendate, dateFormat).isValid()); // true! alert(moment(givendate, dateFormat, true).isValid()); // false 这是只检查格式。 2016 年 2 月 30 日不是一个有效的日期。但是时刻 isValid() 函数返回 true @Nikhil "01/02/0000" 是有效日期。【参考方案2】:

是的,你可以使用 momentjs 来解析它并与字符串进行比较

function isValidDate(str) 
  var d = moment(str,'D/M/YYYY');
  if(d == null || !d.isValid()) return false;

  return str.indexOf(d.format('D/M/YYYY')) >= 0 
      || str.indexOf(d.format('DD/MM/YYYY')) >= 0
      || str.indexOf(d.format('D/M/YY')) >= 0 
      || str.indexOf(d.format('DD/MM/YY')) >= 0;

测试代码

tests = ['',' ','x','1/1','1/12/2015','1/12/2015 1:00 PM']
for(var z in tests) 
  var test = tests[z];
  console.log('"' + test + '" ' + isValidDate(test));

输出

 "" false
 " " false
 "x" false
 "1/1" false
 "1/12/2015" true
 "1/12/2015 1:00 PM" true

【讨论】:

【参考方案3】:

您可以使用 Date.parse() 函数。

Here是详细使用方法。

【讨论】:

Date.parse('2/30/2011') 返回有效。 2 月 30 日或第 30 个月的 2 日应无效。 在包含链接时,还可以包含相关的 sn-p,以防将来链接损坏等 Date.parse('foo-bar 2014'); 返回 NaN,我发现它比返回 "Invalid Date"new Date('foo-bar 2014').toString(); 更好

以上是关于如何测试字符串是有效日期还是不使用时刻?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用时刻 2.0.0 设置时区

如何在java中验证日期字符串

如何在 Swiftyjson 中检查值是日期字符串还是双精度值?

如何将欧洲格式的字符串日期转换为有效的 mysql 日期格式?

如何在 .Net / C# 中将日期转换为 HTTP 格式的日期

在 C 中使用 Window XP 时如何解决日期格式问题?