我想知道Perl中是否有一种简单的方法可以确保日期字符串对应于有效日期。
例如,2012 02 30
不正确,因为它不存在。
答案 0 :(得分:7)
DateTime模块将在创建新对象时验证日期。
$ perl -we 'use DateTime; my $dt;
eval { $dt = DateTime->new(
year => 2012,
month => 2,
day => 30);
}; print "Error: $@" if $@;'
Error: Invalid day of month (day = 30 - month = 2 - year = 2012) at -e line 1
它也可以在给定的DateTime
对象上动态工作:
$dt->set(day => 30);
答案 1 :(得分:3)
使用Class :: Date的这样的东西应该可以工作
perl testit.pl 日期或时间范围检查失败
use Class::Date;
my $d=Class::Date->new('2021-02-30');
unless ( $d->error ) {
print "good date\n";
} else {
print $d->errstr(). "\n";
}
exit;
答案 2 :(得分:1)
点击此处: http://www.perlmonks.org/?node_id=564594
我相信你会从明智的僧侣那里得到答案。
答案 3 :(得分:1)
您可以通过POSIX mktime
使用此功能,但显然只有在mktime
具有足够灵活性的实现时才会这样做。
我所做的是插入数字,然后使用当地时间让他们回来,如果我得到同一天的价值,这是一个有效的数字。所以,给你的字符串:
my ( $y, $m, $d ) = split ' ', $date_string;
die "$date_string is not a valid date!"
unless ( $d == ( localtime mktime( 0, 0, 0, $d, $m - 1, $y - 1900 ))[3] )
;
请参阅mktime
我曾经使用过的mktime( 0, 0, 0, 30, 1, 112 )
版本'2012-03-01'
30 != 1
和{{1}}
答案 4 :(得分:1)
您还可以使用Time::Local:
#!/usr/bin/env perl
use strict; use warnings;
use Carp qw( croak );
use Time::Local qw( timegm );
my @to_check = ('1927 06 18', '2012 02 30');
for my $date ( @to_check ) {
printf "'%s' is %s\n", $date, check_date($date) ? 'valid' : 'invalid';
}
sub check_date {
my ($date) = @_;
my ($year, $month, $mday) = split ' ', $date;
my $ret;
eval {
$ret = timegm(0, 0, 0, $mday, $month - 1, $year - 1900);
};
return $ret && $ret;
}
答案 5 :(得分:0)
也许这会有所帮助:
use Time::Piece; #in perl CORE distro since 5.10
use 5.010;
say Time::Piece->strptime("2011-02-29","%Y-%m-%d")->strftime("%Y-%m-%d");
#2011-03-01
say Time::Piece->strptime("2012-02-29","%Y-%m-%d")->strftime("%Y-%m-%d");
#2012-02-29