Получите точки изменения дня между двумя метками времени UNIX - PullRequest
2 голосов
/ 14 декабря 2010

У меня есть диапазон дат (две метки времени UNIX), и мне нужно найти точку (и) в 23:59:59, если она существует.Как я могу сделать это с Perl?

PS Я думаю, для () не очень хорошая идея, потому что у меня может быть очень большой диапазон.Есть еще варианты?

Ответы [ 4 ]

5 голосов
/ 14 декабря 2010

Я бы использовал Date::Calc. Предположим, что ваши две временные метки расположены в $ts1 и $ts2:

use Date::Calc qw(Time_to_Date Date_to_Time Delta_Days Add_Delta_Days);

my @date1 = (Time_to_Date($ts1))[0..2];
my @date2 = (Time_to_Date($ts2))[0..2];
my @midnights;

for (my $i = 0; $i < Delta_Days(@date1, @date2); ++$i) {
    push @midnights, Date_to_Time(Add_Delta_Days(@date1, $i), 23, 59, 59);
}

@midnights теперь содержит метки времени UNIX (эпохальные секунды) всех 23:59:59 точек между двумя заданными метками времени.

Отказ от ответственности : Конечно, вы также можете сделать это с DateTime.

2 голосов
/ 14 декабря 2010

Это общий алгоритм.X - первая метка времени, Y - последняя.

1) Получить дату первого изменения, Z.

If Z > Y , there is no change.

2) Получить дату последнего изменения, W

   If W = Z, there is only one change date.

3) Получить диапазон дат R. Учитывая диапазон одного дня, D

   R = W - Z .. The number of points will be the integer of (W - Z)/D
1 голос
/ 14 декабря 2010

Вот пример, который я собрал вместе, основываясь на своих недавних знаниях о отметке времени UNIX (школа так давно ...)используя другие инструменты, чтобы сделать это, так как мой пример не учитывает дополнительных секунд, и я очень сомневаюсь, что это POSIX-совместимый.Подробнее здесь .

1 голос
/ 14 декабря 2010

использование DateTime ;

...