Как я могу разобрать строку в формате strftime в Perl?

Я новичок в Perl и хочу узнать, есть ли обратная функция для strftime(). Посмотрите,

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

Я получаю: 2009T08T14 TTTT00:37:02. Как я могу сделать обратную операцию? Из строки "2009T08T14 TTTT00:37:02", чтобы получить 2009-08-14 00:37:02, зная строку форматирования "%YT%mT%d TTTT%H:%M:%S"?

3 ответа

Решение

Один из вариантов - проанализировать числа с помощью регулярного выражения, а затем использовать Time:: Local. Тем не менее, теперь, когда я понимаю, ваш вопрос, как перейти от strftime форматированная строка для времени в целом, такой подход должен быть громоздким.

Вы упоминаете в своем ответе POSIX::strptime это здорово, если ваша платформа поддерживает это. В качестве альтернативы вы можете использовать http://search.cpan.org/perldoc/DateTime::Format::Strptime:

#!/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 является объектом DateTime, поэтому вы можете делать с ним практически все, что захотите.

Я думаю, что нашел решение: strptime($strptime_pattern, $string)

Так легко

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

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

$seconds_since_jan1_1970 = parsedate($t)
Другие вопросы по тегам