我有一个变量$ data,可能包含也可能不包含mysql时间戳。我想检查它是否实际包含时间戳。
$data = '2015-11-21 13:45:20';
我可以使用像
这样的大型正则表来检查它/2[0-9][0-9][0-9]-(0[1-9]|1[0-2])-(0[1-9]|2[0-9]|3[0-1]) ([01][0-9]|2[0-4]):[0-5][0-9]:[0-5][0-9]/
但有更简单的方法吗?
答案 0 :(得分:2)
您可以使用Perl模块DateTime :: Format :: MySQL。如果输入格式不可接受,则其parse_datetime
方法将抛出异常,如果可以将其解析为MySQL日期时间,则返回DateTime对象。它看起来非常严格,可能就是你想要的。
use strict;
use warnings;
use DateTime::Format::MySQL;
while(<DATA>){
chomp;
print "$_: ";
my $result = validate_date($_);
print defined $result
? "Recognized format. ($result)\n"
: "Unrecognized format.\n";
}
sub validate_date {
return eval {DateTime::Format::MySQL->parse_datetime(shift)};
}
__DATA__
2015-11-21 13:45:20
2015-11-21 13 : 45 : 20
使用DateTime对象,特别是使用DateTime :: Format :: MySQL模块,它很容易转向并输出MySQL-ready datetime字符串。
另一方面,如果目标是接受输入,验证它,然后将其发送到MySQL,您可以考虑使用DateTime :: Format :: DateParse中的parse_datetime
方法接受宽各种日期字符串尽可能实用。该模块返回DateTime对象。然后,您可以使用DateTime :: Format :: MySQL方法format_datetime
将该DT对象转换为有用的MySQL格式。这样你就可以接受自由,但是你输出的内容是严格的,这通常是一种合理的设计模式。