Как мне преобразовать дату в время эпохи в Perl? - PullRequest
4 голосов
/ 07 апреля 2009

Солярис 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), выдавая следующее сообщение об ошибке.

Невозможно найти Date / Parse.pm в @INC (@INC содержит: /usr/perl5/5.8.4/lib/sun4-solaris-64int /usr/perl5/5.8.4/lib / usr / perl5 /site_perl/5.8.4/sun4-solaris-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 ]

4 голосов
/ 07 апреля 2009

Вы должны быть в состоянии сделать это с Time :: Piece, который является ядром в 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";

Редактировать : синтаксический анализатор блокирует 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. Я официально ненавижу летнее время.

4 голосов
/ 07 апреля 2009

В сообщении об ошибке говорится, что не удается найти модуль Date :: Parse в пути к вашей библиотеке Perl ( @ INC ).

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

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

3 голосов
/ 07 апреля 2009

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

3 голосов
/ 07 апреля 2009

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

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

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

0 голосов
/ 01 августа 2012

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

0 голосов
/ 08 апреля 2009

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

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

...