Ads 468x60px

пятница, 23 марта 2012 г.

Debian perl сравнение дат.

Получение разницы в секундах используя POSIX:
#!/usr/bin/perl
# perldate.plx
use POSIX; # отсюда берем функцию mktime

# дата в заданном формате 
$date = '2012-02-23 11:00:00';
# получить массив параметров даты год и месяц приводим к виду для работы с POSIX
my @a = split(/\D/,$date);
my ($sec, $min, $hour,$mday,$mon,$year) =
($a[5],$a[4],$a[3],$a[2],$a[1]-1,$a[0]-1900);

# сформировать значение даты в unix timestamp
my $vardate = mktime($sec,$min,$hour,$mday,$mon,$year);

## проверка правильности
# print scalar localtime($vardate),"\n";
# print $date,"\n";

# отличие текущей даты и заданной в секундах
my $datediff;
if (time > $vardate){
    $datediff = time - $vardate;
} else {
    $datediff = $vardate - time;
}
print $datediff,"\n";
Сравнение дат при помощи модуля Date::Calc.
Устанавливаем модуль для Perl
sudo aptitude install libdate-calc-perl
И пример его использования:
#!/usr/bin/perl
# perldatecalc.plx
use warnings;
use strict;
use Date::Calc qw(:all);

my $date = '2011-04-23 01:00:00';
# получить массив параметров даты год и месяц не изменяем
my @a = split(/\D/,$date);
my ($sec, $min, $hour,$mday,$mon,$year) =
($a[5],$a[4],$a[3],$a[2],$a[1],$a[0]);
# получаем значение текущей даты
my ($secnow,$minnow,$hournow,$mdaynow,$monnow,$yearnow,$wdaynow,$ydaynow,$isdstnow) = localtime(time);
# год и месяц приводим к стандартному виду
($monnow,$yearnow) = ($monnow+1,$yearnow+1900);
# разница в днях
print Delta_Days($year,$mon,$mday,
                 $yearnow,$monnow,$mdaynow),"\n";
# разница разбитая по годам месяцам и дням
my ($dy,$dm,$dd) = N_Delta_YMD($year,$mon,$mday,
                 $yearnow,$monnow,$mdaynow);
print $dy,".",$dm,".",$dd,"\n";
# разница разбитая до секунд
my ($dy1,$dm1,$dd1,$dh1,$dmi1,$ds1) = N_Delta_YMDHMS ($year,$mon,$mday,$hour,$min,$sec,
                                                  $yearnow,$monnow,$mdaynow,$hournow,$minnow,$secnow);
print $dy1,".",$dm1,".",$dd1,"  ",$dh1,":",$dmi1,":",$ds1,"\n";
В комментариях все достаточно подробно описано, полный список функций Date::Calc можно посмотреть тут

Комментариев нет: