Как преобразовать дату в эпоху времени в Perl?


"Солярис-10", похоже, не очень-то мне нравится. Я пытаюсь запустить простой скрипт, чтобы принять дату и вернуть эпоху этой даты:

#!/usr/bin/perl -w
use strict;
use Time::ParseDate;

my $date1 = "Mon Mar 27 05:54:08 CDT 2009";

#Convert to seconds since start of epoch
my $time1 = parsedate($date1);
print $time1;

Отлично работает на RHEL box, но привинчивается на Solaris(оба имеют 5.8.8 Perl), что приводит к следующему сообщению об ошибке.

Не могу найдите дату/обработку.ПМ в @Inc (@Inc, в содержится: в /usr/perl5/5.8.4/Либ/для sun4-Солярис-64int в /usr/perl5/5.8.4/lib и в /usr/perl5/site_perl/5.8.4/для sun4-Солярис-64int в /usr/perl5/site_perl/5.8.4 в /usr/perl5/site_perl /usr / perl5/vendor_perl/5.8.4 /sun4-solaris-64int/usr/perl5/vendor_perl /5.8.4/usr/perl5 / vendor_perl .) на try1.pl строка 3. Начать не удалось -- компиляция прервана на try1.pl строка 3.

Что здесь не так?.. как это исправить?.

О.. почти забыл, я не могу изменить/установить / изменить что-либо на этой коробке Solaris, этот скрипт должен быть отправлен клиенту, который запускает Solaris 10!. Поэтому просить его установить модуль-это определенно не вариант. : (

6 3

6 ответов:

Сообщение об ошибке говорит, что он не может найти модуль Date:: Parse в вашей библиотеке Perl include path (@INC).

Модуль доступен из CPAN (комплексная сеть архивов Perl). Если вам нужен модуль Perl, который не входит в базовую установку, обычно (>90%) он доступен из CPAN, сайта архива модулей Perl de facto.

Ваш вопрос решается с помощью модуля CPAN (модуль CPAN используется для извлечения модулей из CPAN) документация. Я предлагаю начать с FAQ Вопрос 5: "я не root, как я могу установить модуль в личный каталог?"

Вы должны быть в состоянии сделать это со временем:: кусок, который является ядром на Perl 5.10 (поправка здесь: это не ядро в 5.8). Вот пример из моей машины. Видишь man strftime, man strptime и perldoc Time::Piece. В документах Time::Piece вы хотите проверить раздел разбор дат. (Детали преобразования могут отличаться на машине Solaris. Я нахожусь на OS X прямо сейчас на работе.)

#!/usr/bin/env perl
use strict;
use warnings;
use Time::Piece;

my $date = Time::Piece->strptime("Tue Apr 7 12:46:59 2009",
  "%a %b %e %H:%M:%S %Y");
my $epoch_date = $date->epoch;

print "$epoch_date\n";

Edit : синтаксический анализатор подавляется CDT (%Z, похоже, не распознает его), поэтому вам, возможно, потребуется сделать это в два этапа. То следующие работы для меня:

my $string = "Mon Mar 27 05:54:08 CDT 2009";
$string =~ s/CDT/-0500/; # Replace timezone with offset from UTC
my $date = Time::Piece->strptime($string, "%a %b %e %H:%M:%S %z %Y");
my $epoch_date = $date->epoch;

print "$epoch_date\n";
Однако теперь у нас есть дополнительная проблема CDT => -0500 против CST => -0600. Я официально ненавижу летнее время.

Вы уверены, что это правильное сообщение об ошибке? Date::Parse - это совершенно отдельный модуль отTime::ParseDate . Они обеспечивают схожую функциональность, но не используют друг друга.

Вы можете использоватьModule::CoreList , чтобы получить список модулей, которые поставляются с 5.8.8. Я не знаю, включал ли Solaris 10 какие-либо дополнительные модули.

Возможно, вам придется скопировать кишки из подходящего модуля и вставить их в свой скрипт. (Помните, что файл Perl может имейте несколько операторов package.)

Поскольку вам необходимо отправить программу клиенту, который не будет устанавливать модули для вас, вам нужно будет использовать PAR::Packer для создания собственного исполняемого файла, который содержит все ваши зависимости (или использовать только основные модули).

"Солярис-10", похоже, не очень-то мне нравится. Я пытаюсь запустить простой скрипт, чтобы принять дату и вернуть эпоху этой даты

Глупый вопрос, но каков источник входной строки даты? Если строка извлекается из системы, ваш код может быть намного проще.

Старый поток, но это может помочь людям с той же проблемой. Используйте функцию timelocal в стандартном модуле Time::Local. Смотрите perlfaq 4