如何测试字符串是有效日期还是不使用时刻?
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();
更好以上是关于如何测试字符串是有效日期还是不使用时刻?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Swiftyjson 中检查值是日期字符串还是双精度值?
如何将欧洲格式的字符串日期转换为有效的 mysql 日期格式?