2011-05-04 3 views
2

En perl, comment puis-je convertir ce jour commedate de conversion

Thu Mar 06 02:59:39 +0000 2008 

à

2008-03-06T02:59:39Z 

Essayé HTTP :: Date, il fonctionne si la question n'a pas +0000 dans la chaîne :(

Répondre

6

DateTime::Format::Strptime fera cette conversion.

#!/usr/bin/perl 
use strict; 
use warnings; 
use 5.012; 
use DateTime::Format::Strptime; 

my $date = 'Thu Mar 06 02:59:39 +0000 2008 '; 

my(@strp) = (
    DateTime::Format::Strptime->new(pattern => "%a %b %d %T %z %Y",), 
    DateTime::Format::Strptime->new(pattern => "%FY%T%Z",) 
); 

my $dt = $strp[0]->parse_datetime($date); 

print $strp[1]->format_datetime($dt); 

impressions 2008-03-06T02: 59: 39UTC

Chris

+1

Vous pouvez également utiliser Time :: Piece car il est dans la distribution CORE perl depuis V 5.10. –

1

Ainsi, le modifier avec une expression régulière et utiliser HTTP::Date:

(my $new_date_string = $old_state_string) =~ s/[+-]\d{4,}\s+//; 
1

Si vous êtes absolument, positivement sûr que la date sera toujours dans ce format, vous pouvez simplement utiliser des expressions régulières pour le reformater. La seule chose est que vous devez avoir un moyen de convertir le mois en nombre. De cette façon, vous ne devez pas télécharger des modules supplémentaires pour effectuer la conversion de date:

my $date = "Thu Mar 06 02:59:39 +0000 2008"; #Original String 

#Create the Month Hash (you might want all twelve months). 
my %monthHash (Jan => "01", Feb => 2, Mar => 3); 

# Use RegEx Matching to parse your date. 
# \S+ means one or more non-spaces 
# \s+ means one or more spaces 
# Parentheses save that part of the string in $1, $2, $3, etc. 
$date =~ m/\S+\s+(\S+)\s+(\S+)\s+(\S+)\s+\S+\s(.*)/; 

my $monthString = $1; 
my $day = $2; 
my $time = $3; 
my $year = $4; 

# Convert Month string to a number. 
my $month = $monthHash{$monthString}; 

#Reformat the string 
$fmtDate="$year-$month-$day" . "T" . "$time" . "Z"; 

Sinon, je vais dire que vous pouvez également essayer DateTime :: Format :: strptime, mais Chris Charley me devança .