2012-02-24 10 views

Odpowiedz

1

Sprawdź tutaj: http://www.perlmonks.org/?node_id=564594

wierzę, otrzymasz odpowiedź, której szukasz od mądrych mnichów.

+0

Do zauważ, że te stanowiska mają 6 lat. – TLP

+6

Czy kalendarze zmieniły się w ciągu 6 lat? – Benoit

+0

@Benoit Możesz o tym powiedzieć. Czy lata zmieniły się tak bardzo w latach 1999-2000? Prawdopodobnie nie jest to wielka sprawa (nie jest to moja uwaga) i większość kodu prawdopodobnie nadal będzie działać, ale warto to zauważyć. – TLP

3

Coś w tym przy użyciu Class :: data powinna pracować

Perl testit.pl czek Gama daty lub czasu udało

use Class::Date; 


my $d=Class::Date->new('2021-02-30'); 
unless ($d->error) { 
    print "good date\n"; 
} else { 
    print $d->errstr(). "\n"; 
} 
exit; 
7

Moduł DateTime potwierdzi datę podczas tworzenia nowego obiektu.

$ perl -we 'use DateTime; my $dt; 
    eval { $dt = DateTime->new( 
     year => 2012, 
     month => 2, 
     day => 30); 
    }; print "Error: [email protected]" if [email protected];' 

Error: Invalid day of month (day = 30 - month = 2 - year = 2012) at -e line 1

Działa również dynamicznie na danym DateTime obiektu:

$dt->set(day => 30); 
0

Może być to pomoże też:

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 
1

Można to zrobić poprzez zastosowanie z POSIX mktime, ale najwyraźniej tylko jeśli masz flexi niewystarczająca implementacja mktime.

Co mam zrobić, to podłączyć numery, a następnie użyć czasu lokalnego, aby je odzyskać, a jeśli otrzymam tę samą wartość z powrotem, jest to prawidłowy numer. Tak więc, biorąc pod uwagę kryteria:

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]) 
    ; 

See, w wersjach mktime że jestem przyzwyczajony do, mktime(0, 0, 0, 30, 1, 112) stałaby '2012-03-01' i 30 != 1

1

Można również użyć 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; 
} 
Powiązane problemy