Как сравнить пт 1 июля 05:21:23 2016 формат даты и времени в perl

У меня есть значение даты и времени в формате «Пт, 1 июля, 05:21:23 2016», как я могу это сравнить?

Мне нужно сделать как if($date1<$date2) { print "do something"! }

Пожалуйста, помогите найти ответ!


person user3784251    schedule 01.07.2016    source источник
comment
Time::Piece   -  person Sobrique    schedule 01.07.2016


Ответы (2)


Вы можете использовать DateTime::Format::Strptime для разбора строк в Datetime, поддерживающие сравнения:

use strict;
use warnings;
use feature 'say';
use DateTime::Format::Strptime;

my $strp = DateTime::Format::Strptime->new(pattern => '%a %b %d %H:%M:%S %Y');

my $dt1 = $strp->parse_datetime("Fri Jul 1 05:21:23 2016");
my $dt2 = $strp->parse_datetime("Sat Jul 2 05:21:23 2016");    

if ($dt1 < $dt2) {  # or use DateTime->compare()
    say '$dt1 < $dt2';
}
elsif ($dt1 == $dt2) {
    say '$dt1 == $dt2';
}
else {
    say '$dt1 > $dt2';
}
person Eugene Yarmash    schedule 01.07.2016

Используйте Time::Piece, чтобы преобразовать строки в объекты, которые можно сравнивать напрямую.

#!/usr/bin/perl

use strict;
use warnings;
use 5.010;

use Time::Piece;

my $date1 = 'Fri Jul 1 05:21:23 2016';
my $date2 = 'Thu Jun 30 12:00:00 2016';

my $date_format = '%a %b %d %H:%M:%S %Y';

my $tp1 = Time::Piece->strptime($date1, $date_format);
my $tp2 = Time::Piece->strptime($date2, $date_format);

if ($tp1 < $tp2) {
  say "$date1 is before $date2";
} elsif ($tp1 > $tp2) {
  say "$date1 is after $date2";
} else {
  say "$date1 is the same as $date2";
}
person Dave Cross    schedule 01.07.2016
comment
Потому что я использую say() в программе. Также 5.10 была первой версией, включившей Time::Piece в стандартный дистрибутив (конечно, пользователи более ранних версий Perl могут установить его из CPAN). Но главным образом, я полагаю, потому что я считаю Perl 5.10 минимально приемлемой версией для серьезной разработки Perl. - person Dave Cross; 01.07.2016
comment
Я предпочитаю использовать Datetime & Co для манипулирования датой/временем, так как это более универсально. Например, Time::Piece с радостью примет 'Thu Jul 1 05:21:23 2016' (обратите внимание на название дня), а Datetime — нет. - person Eugene Yarmash; 01.07.2016
comment
Я не думаю, что ваш пример показывает, что DateTime более универсален. Я думаю, это показывает, что Time::Piece исправляет больше ошибок, чем DateTime :-) Оба поведения могут быть полезны в определенных обстоятельствах, и я регулярно использую оба модуля. Я склонен использовать Time::Piece more в ответах StackOverflow из-за большого количества вопросов, заданных людьми, которые утверждают, что не могут устанавливать модули из CPAN. - person Dave Cross; 01.07.2016