在Perl中,如何确保字符串对应于有效日期?

时间:2012-02-24 14:31:44

标签: perl time calendar

我想知道Perl中是否有一种简单的方法可以确保日期字符串对应于有效日期。

例如,2012 02 30不正确,因为它不存在。

6 个答案:

答案 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