2010-01-18 5 views
3

Le code serait bien mais un point dans la bonne direction est bon aussi.Comment puis-je valider une date/horodatage "aaaa-MM-jj'T'HH: mm: ssZ" en UTC avec Perl?

CPAN? RegEx?

j'ai vu les deux sens

"yyyy-MM-jj'T'HH: mm: ssZ";

"aaaa-MM-ddTHH: mm: ssZ";

+1

Vous pouvez également voir "Comment puis-je valider des dates en Perl?" http://stackoverflow.com/questions/297398/how-can-i-validate-dates-in-perl –

+0

Est-ce que "yyyy" est conforme à Y10K? : D Sérieusement, je voudrais juste utiliser '\ d {4,} -' pour la première section. – Axeman

Répondre

11

Ether est définitivement sur la bonne voie avec DateTime. En utilisant DateTime, vous pouvez être sûr que vous avez un temps qui existe réellement, où quelque chose sur Février 29, 2000 pourrait se passer si vous avez écrit les contrôles vous-même.

Votre format ressemble à une chaîne ISO8601. Donc, utilisez DateTime::Format::ISO8601 pour faire votre analyse.

use DateTime; 
use DateTime::Format::ISO8601; 

my $string = '2010-02-28T15:21:33Z'; 

my $dt = DateTime::Format::ISO8601->parse_datetime($string); 
die "Impossible time" unless $dt; 

Vous pouvez utiliser d'autres modules de format, tels que D::F::Strptime, mais vous aurez le vent recréer ce que fait déjà formatter ISO8601.

+3

DateTime doit être l'un des modules les plus utiles et bien conçus jamais écrit dans n'importe quelle langue, à mon humble avis. –

4

En fonction de ce que vous faites, vous pouvez forcer votre chaîne dans un objet DateTime, par exemple:

use DateTime::Format::MySQL; 
my $dt = DateTime::Format::MySQL->parse_datetime('2003-01-16 23:12:01'); 

Ensuite, vous pouvez facilement la sortie de votre chaîne de temps dans un format différent, effectuer des calculs avec elle

Vous n'avez pas spécifié ce qui génère la chaîne dans ce format particulier, mais il existe des modules DateTime :: Format :: pour un grand nombre de sources d'entrée.

+0

si je fournis le datetime puis-je l'utiliser pour le convertir en UTC? –

+0

@Phil: vous voulez dire qu'une fois que vous avez construit l'objet DateTime, pouvez-vous convertir entre les fuseaux horaires? Absolument: voir les documents DateTime: http://search.cpan.org/perldoc/DateTime; La méthode strftime() renvoie une chaîne dans le format spécifié. – Ether

Questions connexes