我需要一个正则表达式来验证格式的时间戳,使用Javascript :
YYYY / MM / DD HH:MI:SS
我尝试烹饪一些,但似乎我的正则表达式技能无法覆盖某些东西。
请给我一个参考或方法来做。
P.S。 :我提到正则表达式,仅作为建议。我使用Javascript并欢迎任何替代方案。
答案 0 :(得分:16)
我建议您使用Datejs。不需要自己解析日期,并且正则表达式不足以验证时间戳。使用datejs,您可以在日期中解析字符串,如果无效,您将获得null:
Date.parse("2009/06/29 13:30:10", "yyyy/MM/dd HH:mm:ss");
答案 1 :(得分:6)
如果您只想验证语法,这里是POSIX正则表达式:
[0-9]{1,4}/[0-9]{1,2}/[0-9]{1,2} [0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}
但是如果你想检查语义,我会用您选择的语言处理字符串,有太多的情况你无法用正则表达式覆盖(如闰年/秒,夏令时等)
答案 2 :(得分:6)
您应该考虑不使用正则表达式执行此操作,而是使用正确的格式字符串通过DateTime运行字符串。这样你就可以确保它确实是一个有效的时间戳,而不仅仅是看起来像它的东西。
答案 3 :(得分:4)
这是我今天早些时候写的一个正则表达式,用于验证类似于你提到的格式的字符串:YYYY-MM-DD hh:mm:ss
。它不会识别一些不良日期(例如,2月30日),但可能比在每个位置使用简单\d
略好一些。注意事项:
上午/下午是可选的
const std::string dateAndTimeRegex =
"^\\s*" // ignore whitespace
"(" // start of date
"201[0-9]" // year: 2010, 2011, ..., through 2019
"\\W" // delimiter between year and month; typically will be "-"
"([0]?[0-9]|1[012])" // month: 0 through 9, or 00 through 09, or 10 through 12
"\\W" // delimiter between month and day; typically will be "-"
"([012]?[0-9]|3[01])" // day: 0 through 9, or 00 through 29, or 30, or 31
")?" // end of optional date
"\\s?" // optional whitespace
"(" // start of time
"([01]?[0-9]|2[0-3])" // hour: 0 through 9, or 00 through 19, or 20 through 23
"\\W" // delimiter between hours and minutes; typically will be ":"
"([0-5][0-9])" // minute: 00 through 59
"(" // start of seconds (optional)
"\\W" // delimiter between minutes and seconds; typically will be ":"
"([0-5][0-9])" // seconds: 00 through 59
")?" // end of optional seconds
"(\\s*[AaPp][Mm])?" // optional AM, am, PM, pm
")?" // end of optional time
"\\s*$"; // trailing whitespace
答案 4 :(得分:4)
我刚刚编写了一个Regex来控制MySQL的日期时间(我认为对于Oracle或其他数据库服务器来说并没有那么不同。)
此ReGex非常安全,可以控制日期的有效期(28,30和31天,甚至29/02年)。然后,它控制时间。 时间戳格式是这一个:
YYYY-MM-DD HH:MM:SS
这是正则表达式(很长):
((((19|20)([2468][048]|[13579][26]|0[48])|2000)-02-29|((19|20)[0-9]{2}-(0[4678]|1[02])-(0[1-9]|[12][0-9]|30)|(19|20)[0-9]{2}-(0[1359]|11)-(0[1-9]|[12][0-9]|3[01])|(19|20)[0-9]{2}-02-(0[1-9]|1[0-9]|2[0-8])))\s([01][0-9]|2[0-3]):([012345][0-9]):([012345][0-9]))
匹配
2013-04-05 17:59:59 | 2013-07-30 01:22:42 | 2099-12-30 23:59:59 | 2016-02-28 00:00:00
非匹配
2016-02-29 -01:01:02 | 3000-04-24 17:42:21 | 2012-03-03 24:24:02 | 2012-03-03 21:60:45
我认为我不能做一个更安全的人。非常功能和测试。 如果你使用它,请不要犹豫,给我反馈;)
仅供参考:如果您只是在没有时间的情况下查找正则表达式控制日期,请到那里查找:Regular Expression to match valid dates (查看我的帖子)。
干杯
答案 5 :(得分:2)
function validateTimestamp(timestamp) {
if (!/\d{4}\/\d{2}\/\d{2} \d{2}:\d{2}:\d{2}/.test(timestamp)) {
return false;
}
var split = timestamp.split(/[^\d]+/);
var year = parseFloat(split[0]);
var month = parseFloat(split[1]);
var day = parseFloat(split[2]);
var hour = parseFloat(split[3]);
var minute = parseFloat(split[4]);
var second = parseFloat(split[5]);
return hour < 25 && minute < 61 && second < 61 && month < 13 && day < 32;
}
答案 6 :(得分:2)
对于1000年和2999年之间的有效日期,请使用:
String pattern = "((1\\d{3})|(20\\d{2}))-((0\\d)|(1[0-2]))-(([1-2]\\d)|(3[0-1])) (([0-1]\\d)|(2[0-3])):([0-5]\\d):([0-5]\\d)";
月份可以在01到12之间变化,01到31之间的天数和00:00:00到23:59:59之间的时间。
答案 7 :(得分:1)
perl风格:[12] \ d {3} / [01] \ d / [0-3] \ d [0-2] \ d(?:: [0-5] \ d){2}
答案 8 :(得分:1)
Regular-Expressions.info是关于RegEx的一个很好的信息来源,它也有一个很好的tutorial。
答案 9 :(得分:1)
使用
(\d\d)?\d\d\/\d\d?/\d\d? \d\d?:\d\d:\d\d
可以验证语法,但正如balpha指出的那样,这并不能使它成为有效的日期。
答案 10 :(得分:1)
function isTimestamp($input){
var $regex = /^\d\d\d\d-(0?[1-9]|1[0-2])-(0?[1-9]|[12][0-9]|3[01]) (00|[0-9]|1[0-9]|2[0-3]):([0-9]|[0-5][0-9]):([0-9]|[0-5][0-9])$/;
return $regex.test($input);
}
请检查
答案 11 :(得分:1)
这是我如何建立与范围内的SQL时间戳yyyy-mm-dd hh:mm:ss
完全匹配的正则表达式
[1970-01-01 00:00:00
,2037-12-31 23:59:59
]
$leapYear = "(19[79][26]|198[048]|20[02][048]|20[13][26])";
$leapDate = "$leapYear-02-29";
$regularYear = "(19[789][0-9]|20[012][0-9]|203[0-7])";
$regularFebruaryDate = "02-([01][1-9]|2[0-8])";
$month31Date = "(0[13578]|10|12)-([012][1-9]|3[01])";
$month30Date = "(0[469]|11)-([012][1-9]|30)";
$regularDate = "$regularYear-($regularFebruaryDate|$month30Date|$month31Date)";
$hours = "(2[0-3]|[01][0-9])";
$minutes = "[0-5][0-9]";
$seconds = "[0-5][0-9]";
$sqlTimestamp = "($leapDate|$regularDate) $hours:$minutes:$seconds";
注意:我避免在2038年减少边缘情况。最大时间戳为2038-01-19 03:14:07
答案 12 :(得分:0)
这是您要查找的正则表达式:
Column = CALCULATE(DIVIDE([No of Occurence];[Num_of_all_loans]))