2009-08-13 28 views
4

Ich bin neu in Perl und ich wan wissen, ob es eine umgekehrte Funktion für die strftime() gibt. Schauen Sie,Wie kann ich eine strftime formatierte Zeichenfolge in Perl analysieren?

use POSIX qw(strftime); 
print strftime("%YT%mT%d TTTT%H:%M:%S", localtime) 

ich: 2009T08T14 TTTT00: 37: 02. Wie kann ich die Gegenoperation durchführen? Von "2009T08T14 TTTT00: 37: 02" Zeichenfolge zu erhalten 2009-08-14 00:37:02, mit der Formatierungszeichenfolge "% YT% mT% TTTT% H:% M:% S"?

+0

Warte, ich zu schnell beantwortet. Meinst du, du willst die Zeichenfolge ** '2009-08-14 00: 37: 02' ** oder die Anzahl der Sekunden seit der Epoche? –

+0

Ich möchte die Zeit von der Zeichenfolge 2009T08T14 TTTT00: 37: 02 abrufen, um sie mit "gültigen" Zeitstempeln zu vergleichen. – Markus

Antwort

7

Eine Möglichkeit besteht darin, die Zahlen mit einem regulären Ausdruck zu analysieren und dann Time::Local zu verwenden. Nun, da ich verstehe, Ihre Frage ist, wie man von einer formatierten Zeichenfolge strftime zu einer Zeit im Allgemeinen gehen, wird dieser Ansatz zwangsläufig umständlich sein.

Sie erwähnen in Ihrer Antwort POSIX::strptime, die groß ist, wenn Ihre Plattform es unterstützt. Alternativ können Sie DateTime::Format::Strptime verwenden:

#!/usr/bin/perl 

use strict; 
use warnings; 

use DateTime::Format::Strptime; 
use POSIX qw(strftime); 

my $f = "%YT%mT%d TTTT%H:%M:%S"; 
my $s = strftime($f, localtime); 

print "$s\n"; 

my $Strp = DateTime::Format::Strptime->new(
    pattern => $f, 
    locale => 'en_US', 
    time_zone => 'US/Eastern', 
); 

my $dt = $Strp->parse_datetime($s); 

print $dt->epoch, "\n"; 
print scalar localtime $dt->epoch, "\n"; 

$dt ist ein DateTime Objekt, so dass Sie ziemlich viel tun können, was man will.

+0

Ok, aber wenn ich eine Funktion habe, deren Parameter der Formatierungsstring ist (hier zB "% YT% mT% d TTTT% H:% M:% S") aber ich weiß es nicht genau..So, Ich suche das Gegenteil der strftime Funktion . – Markus

+0

Nein, verwenden Sie stattdessen nur DateTime :: Format :: Strptime. –

0

So easyy

use Time::ParseDate; 
my $t = '2009T08T14 TTTT00:37:02'; 

$t =~ s/TTTT//; 
$t =~ s/T/-/g; 

$seconds_since_jan1_1970 = parsedate($t) 
2

Ich denke, dass ich die Lösung gefunden haben: strptime($strptime_pattern, $string)

+0

Ich wusste nicht über http://search.cpan.org/dist/POSIX-strptime/ ... Es sieht jedoch so aus, als ob ich das unter Windows nicht installieren kann, weil "strptime" unter Windows nicht existiert. Weitere Informationen finden Sie unter http://stackoverflow.com/questions/321849/strptime-equivalent-on-windows. –

+0

Natürlich interessieren Sie sich nicht für Windows. Ich erwähne es nur, falls Sie Bedenken hinsichtlich der Portabilität haben. –

Verwandte Themen