Как преобразовать дату в эпоху времени в 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 ответов:
Сообщение об ошибке говорит, что он не может найти модуль 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, похоже, не распознает его), поэтому вам, возможно, потребуется сделать это в два этапа. То следующие работы для меня:
Однако теперь у нас есть дополнительная проблема CDT => -0500 против CST => -0600. Я официально ненавижу летнее время.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";
Вы уверены, что это правильное сообщение об ошибке? Date::Parse - это совершенно отдельный модуль отTime::ParseDate . Они обеспечивают схожую функциональность, но не используют друг друга.
Вы можете использоватьModule::CoreList , чтобы получить список модулей, которые поставляются с 5.8.8. Я не знаю, включал ли Solaris 10 какие-либо дополнительные модули.
Возможно, вам придется скопировать кишки из подходящего модуля и вставить их в свой скрипт. (Помните, что файл Perl может имейте несколько операторов
package
.)
Поскольку вам необходимо отправить программу клиенту, который не будет устанавливать модули для вас, вам нужно будет использовать PAR::Packer для создания собственного исполняемого файла, который содержит все ваши зависимости (или использовать только основные модули).
"Солярис-10", похоже, не очень-то мне нравится. Я пытаюсь запустить простой скрипт, чтобы принять дату и вернуть эпоху этой датыГлупый вопрос, но каков источник входной строки даты? Если строка извлекается из системы, ваш код может быть намного проще.
Старый поток, но это может помочь людям с той же проблемой. Используйте функцию timelocal в стандартном модуле Time::Local. Смотрите perlfaq 4