2009-08-13 3 views
4

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

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

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

+0

Подождите, я ответил слишком быстро. Вы хотите, чтобы строка ** '2009-08-14 00: 37: 02' ** или количество секунд с эпохи? –

+0

Я хочу получить время со строки 2009T08T14 TTTT00: 37: 02, чтобы сравнить его с «действующими» метками времени. – Markus

ответ

7

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

Вы упомянули в своем ответе POSIX::strptime, который отлично подходит, если ваша платформа поддерживает его. Кроме того, вы можете использовать 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 объект, так что вы можете сделать почти все, что вы хотите с ним.

+0

Хорошо, но если у меня есть функция, параметр которой является строкой форматирования (здесь для примера «% YT% mT% d TTTT% H:% M:% S»), но я точно не знаю. Так, Я ищу oposite функции strftime . – Markus

+0

Нет, просто используйте DateTime :: Format :: Strptime. –

0

Так easyy

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

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

$seconds_since_jan1_1970 = parsedate($t) 
2

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

+0

Я не знал о http://search.cpan.org/dist/POSIX-strptime/ ... Однако похоже, что я не могу установить это в Windows, потому что 'strptime' не существует в Windows. Дополнительную информацию см. В http://stackoverflow.com/questions/321849/strptime-equivalent-on-windows. –

+0

Конечно, вам может не понравиться Windows. Я просто упоминаю об этом, если вы обеспокоены переносимостью. –