2013-06-11 2 views
-1

Как я могу сравнить две даты в формате с помощью Perl:Как сравнить даты с помощью perl?

"dd mon yyyy hh:mm:ss GMT" 

.: 12 например May 2013 10:10:20 GMT

Я не могу установить любые внешние модули Perl. Пожалуйста, совет.

+4

«Я не могу установить любые внешние модули Perl» - это [не очень вероятно] (http://www.perlmonks.org/?node=693828) – Quentin

+3

«Я не могу установить любой внешний Perl модулей "- тогда это первая проблема, которую вы должны решить. Если вы не можете устанавливать модули из CPAN, вы не используете большую часть возможностей Perl.Фиксирование должно быть вашим наивысшим приоритетом. –

+0

Если у вас есть собственный код Perl в системе, вы можете установить модуль Perl. Либо через [local :: lib] (http://p3rl.org/local::lib), либо просто скопируйте их с помощью своего кода. –

ответ

3

Если у вас есть Perl v5.9.5 или новее, вы можете использовать основной модуль Time::Piece. Вот простая демонстрация соответствующих операций

  • Преобразование даты из строки в Time::Piece объекта

    my $date = "12 May 2013 10:10:20 GMT"; 
    my $tp1 = Time::Piece->strptime($date, "%d %B %Y %T %Z"); 
    my $tp2 = ... 
    
  • Найти разницу между 2 раза

    my $diff = $tp2 - $tp1; 
    

    , который дает вам Time::Seconds объект ,

  • Наконец, отобразите разницу в единицах секунд (или что-то еще).

    print $diff->seconds; 
    
  • Или вы могли бы просто сравнить два напрямую (спасибо stevenl)

    $tp2 > $tp1 
    

Ссылки:

  1. Time::Seconds
  2. Time::Piece
  3. man strftime для форматной строки для использования с Time::Piece->strptime
  4. man strptime для форматной строки для использования с $tp->strftime
    • Обратите внимание, что только символы формата aAbBcdHIjmMpSUwWxXyYZ% безопасны, если вы используете не-Unix системы (например, Window Perl не поддерживает спецификатор %e).
+0

Помимо выполнения вычитания, вы можете сделать прямое сравнение: '$ tp1 <$ tp2' – stevenl

+0

@stevenl, спасибо за головы. Добавлена ​​информация к сообщению. – doubleDown

+0

Предполагая, что вы имеете в виду perl 5.9.5 (эффективно perl 5.10) здесь; «perl 5.95» неверен. – hobbs

1

Один из самых популярных модулей даты - DateTime. Он имеет a FAQ, который может помочь вам приступить к работе.

sub to_comparable { 

     my ($date) = @_; 
     my ($H,$M,$S,$d,$m,$Y) = $date =~ m{^([0-9]{2}):([0-9]{2}):([0-9]{2}), ([0-9]{2})/([0-9]{2})/([0-9]{4})\z} 
      or die; 
     return "$Y$m$d$H$M$S"; 
    } 

    if (to_comparable($date2) < to_comparable($date1)) { 
     ... 
    } else { 
     ... 
    } 
+0

извините, но, как я уже сказал, я не могу установить внешние модули perl. – david

+0

Попробуйте это сейчас @david –

+0

спасибо, я пытаюсь, но преобразование в yyyymmddhhmmss выглядит проще. что вы думаете? – david

1

Преобразование даты в формат yyyymmddhhmmss (например, 20130512101020) и сравнить как строки. Тем не менее, обработка часовых поясов может оказаться сложной без модулей.

+0

hmm выглядит хорошо. Не нужно ничего с часовыми поясами здесь. yyyymmddhhmmss работает во всех случаях? – david

+0

@ david: Попробуйте найти случай, когда он этого не сделает. – choroba

+0

yep, я пытаюсь, но я не думаю, что плохо нахожу один :) – david