2012-02-24 18 views

Respuesta

1

Marque aquí: http://www.perlmonks.org/?node_id=564594

creo que obtendrá las respuestas que buscas de los monjes sabios.

+0

Do tenga en cuenta que esos mensajes tienen 6 años. – TLP

+6

¿Los calendarios cambiaron tanto en 6 años? – Benoit

+0

@Benoit Puedes decir eso de cualquier cosa. ¿Cambiaron los años mucho de 1999 a 2000? Probablemente no sea un gran problema (no es mi voto negativo) y la mayoría del código probablemente todavía funcione, pero vale la pena señalarlo. – TLP

3

Algo como esto utilizando Clase :: Fecha debe trabajar

Perl testit.pl cheque rango en la fecha o la hora fallidos

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

El módulo DateTime validará fechas cuando se crea un nuevo objeto.

$ 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

También funciona de forma dinámica en un DateTime objeto dado:

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

Puede ser que esto ayudará también:

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

Usted puede hacer esto mediante el uso de POSIX mktime, pero aparentemente solo si tiene una flexi implementación bastante suficiente de mktime.

Lo que hago es conectar los números y luego usar la hora local para recuperarlos y si recupero el valor del mismo día, es un número válido. Por lo tanto, dada su cadena:

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

Sede, en las versiones de mktime que estoy acostumbrado, mktime(0, 0, 0, 30, 1, 112) haría '2012-03-01' y 30 != 1

1

Puede también utilizar 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; 
} 
Cuestiones relacionadas