Как я могу вычислить количество дней между двумя датами в Perl?

Не будет никаких побочных эффектов, но и улучшений тоже не будет. Код GA должен идти перед CSS и тегами сценариев, поскольку их загрузка может блокировать браузер и задерживать загрузку Google Script и (что более важно) задерживать запуск очереди команд ga. Мета-теги на самом деле не влияют на обработку, поэтому не имеет значения, предшествуют ли они коду, но браузеры не очень разборчивы, так как в заголовке заголовка и в мета-месте отображаются слова

.
15
задан brian d foy 7 May 2009 в 05:03
поделиться

5 ответов

Time :: ParseDate прекрасно справится с этим форматом:

use Time::ParseDate qw(parsedate);

$d1="04-MAR-09";
$d2="06-MAR-09";

printf "%d days difference\n", (parsedate($d2) - parsedate($d1)) / (60 * 60 * 24);
5
ответ дан 1 December 2019 в 00:33
поделиться

Date :: Calc имеет Decode_Date_EU (и US и т. Д.)

#!/usr/bin/perl
use Date::Calc qw(Delta_Days Decode_Date_EU);

($year1,$month1,$day1) = Decode_Date_EU('02-MAY-09');
($year2,$month2,$day2) = Decode_Date_EU('04-MAY-09');

print "Diff = " . Delta_Days($year1,$month1,$day1, $year2,$month2,$day2);
4
ответ дан 1 December 2019 в 00:33
поделиться

Преобразовать две даты в секунды, а затем выполнить математику:

#!/usr/bin/perl

use strict;
use warnings;
use POSIX qw/mktime/;

{

    my %mon = (
        JAN => 0,
        FEB => 1,
        MAR => 2,
        APR => 3,
        MAY => 4,
        JUN => 5,
        JUL => 6,
        AUG => 7,
        SEP => 8,
        OCT => 9,
        NOV => 10,
        DEC => 11,
    );

    sub date_to_seconds {
        my $date = shift;
        my ($day, $month, $year) = split /-/, $date;

        $month = $mon{$month};
        if ($year < 50) { #or whatever your cutoff is
            $year += 100; #make it 20??
        }

        #return midnight on the day in question in 
        #seconds since the epoch
        return mktime 0, 0, 0, $day, $month, $year;
    }
}

my $d1 = "04-MAY-99";
my $d2 = "04-MAY-00";

my $s1 = date_to_seconds $d1;
my $s2 = date_to_seconds $d2;

my $days = int(($s2 - $s1)/(24*60*60));

print "there are $days days between $d1 and $d2\n";
1
ответ дан 1 December 2019 в 00:33
поделиться

Вы можете преобразовать даты в длинный целочисленный формат, который представляет собой количество секунд с начала эпохи (я думаю, что какая-то дата в 1970 году). Затем у вас есть две переменные, которые являются датами в секундах; вычесть меньшее из большего. Теперь у вас есть промежуток времени в секундах; разделите его на количество секунд в 24 часах.

1
ответ дан 1 December 2019 в 00:33
поделиться

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

Вот фрагмент, который я использую для вычисления и отображения различий даты и времени несколькими различными способами с использованием библиотеки DateTime . Думаю, последний напечатанный ответ - это тот, который вам нужен.

#!/usr/bin/perl -w

use strict;

use DateTime;
use DateTime::Format::Duration;

# XXX: Create your two dates here
my $d1 = DateTime->new(...);
my $d2 = DateTime->new(...);

my $dur = ($d1 > $d2 ? ($d1->subtract_datetime_absolute($d2)) : 
                       ($d2->subtract_datetime_absolute($d1)));

my $f = DateTime::Format::Duration->new(pattern => 
  '%Y years, %m months, %e days, %H hours, %M minutes, %S seconds');

print $f->format_duration($dur), "\n";

$dur = $d1->delta_md($d2);

my $dy = int($dur->delta_months / 12);
my $dm = $dur->delta_months % 12;
print "$dy years $dm months ", $dur->delta_days, " days\n";
print $dur->delta_months, " months ", $dur->delta_days, " days\n";
print $d1->delta_days($d2)->delta_days, " days\n";
16
ответ дан 1 December 2019 в 00:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: