Как я могу использовать Perl для сравнения даты и времени и вычисления дельт? - PullRequest
2 голосов
/ 12 октября 2009

Я извлек данные года, месяца, дня, часа, минуты, секунды и миллисекунды из читаемого человеком текста (это было не в формате отметки времени, а скорее что-то вроде «X началось в ЧЧ: ММ: СС.ССS включен» ДД МММ ГГГГ и заканчивается на ЧЧ: ММ: СС.СССС на ДД МММ ГГГГ "), поэтому для каждого записанного события у меня есть каждое из значений.

Тем не менее, мне нужно превратить их в некую временную метку, чтобы я мог на ней вычислить - я хочу определить, как долго длилось событие (время окончания - время начала). Я надеялся, что функция time будет принимать параметры, чтобы я мог создать два произвольных time s, но это не так.

Если возможно, я хотел бы придерживаться функций, доступных в основных библиотеках Perl или сценариях, которые я могу добавить в проект, поскольку установка модулей CPAN на целевые машины просто создаст головную боль для всех, даже если возможно получить модули через ограничения безопасности.

Ответы [ 5 ]

7 голосов
/ 12 октября 2009

Требуется модуль CPAN DateTime . Вот введение.

В системе Debian GNU / Linux или Ubuntu просто запустите:

apt-get install libdatetime-perl

для установки модуля.

3 голосов
/ 12 октября 2009

Вы можете сделать это с Время: Местное . По сути, это обратная функция встроенного локального времени, поэтому вы можете сгенерировать метку времени из стандартной даты.

2 голосов
/ 12 октября 2009

Если вас интересовало только сравнение времени,

my $ts1 = sprintf( '%4.4d%2.2d%2.2d%2.2d%2.2d%3.3d', 
                   $year1, $month1, $mday1, $hour1, $min1, $sec1, $ms1 );

до

my $ts2 = sprintf( '%4.4d%2.2d%2.2d%2.2d%2.2d%3.3d', 
                   $year2, $month2, $mday2, $hour2, $min2, $sec2, $ms2 );

с использованием cmp будет достаточно.

Чтобы выполнить арифметику в это время, используйте Time :: Local , чтобы получить секунды с начала эпохи, а затем добавьте $ms1/1000 к этому значению.

my $time1 = timelocal($sec1, $min1, $hour1, $mday1, $mon1, $year1) + $ms1/1000;
2 голосов
/ 12 октября 2009

С точки зрения встроенных модулей они могут быть полезны:

  1. POSIX (для mktime и strftime)
  2. Time::Piece, Time::Local и Time::Seconds. Все они являются стандартными в Perl 5.10, но могут быть недоступны по умолчанию в более ранних системах.

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

Редактировать : из вашего комментария к другому сообщению я вижу, что являются ограничениями компании. Вам следует обновить исходное сообщение, поскольку между «головными болями» и «ограничениями безопасности» существует большая разница. В любом случае, DateTime и Date::Manip заслуживают внимания. Даже если вы не установите их, вы можете многое почитать, прочитав их источник.

1 голос
/ 12 октября 2009

Вы можете использовать POSIX::mktime, чтобы превратить разбитое время в метку времени. Имейте в виду, что месяц основан на 0, а год основан на 1900, поэтому настройте его соответствующим образом. : -)

use POSIX qw(mktime);
$timestamp = mktime($sec, $min, $hour, $day, $month - 1, $year - 1900);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...