PHP Найти дату, ближайшую к периоду шкалы времени - PullRequest
7 голосов
/ 22 декабря 2010

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

Это моя проблема:

alt text

Учитывая начальную дату (отметку времени), период периода времени (секунды) и сегодняшнюю дату (отметку времени), мне нужно найти ближайшую дату, которая совпадает с периодом * n плюс исходная / начальная дата.

Пока что некоторые вещи работают хорошо, например, количество «периодов» между начальной и конечной (сегодняшней) датой, которое будет равно «2» в демонстрационной версии выше:

$initial=strtotime('2 April 1991');
$time=time();
$period=strtotime('+10 years',0);

$periods=round(($time-$initial)/$period);

Следующее, что я сделал, было:

$range=$periods*$period;

И наконец:

echo date('d M Y',$initial+$range);

Который написал «03 апреля 2011». Как дошло до 3? (Я подозреваю, что это проблема високосного года?) Вы знаете это чувство, когда упускаете что-то маленькое? Я чувствую все это прямо сейчас ...

Ответы [ 4 ]

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

Хорошо, поэтому, если я понял, о чем вы спрашиваете, вы хотите знать следующую дату, которая произойдет через определенный промежуток времени (в вашем случае, каждые 10 лет, начиная с 2 апреля 1991 года, когда будет следующая дата: 2 апреля 2011 г.).

Итак, вам следует глубже взглянуть на класс DateTime в PHP, который лучше использовать для дат, потому что он более точный. Вы смешиваете его с DateInterval , который точно соответствует тому, что вам нужно:

<?php
$interval = new DateInterval('P10Y'); // 10 years
$initial = new DateTime('1991-04-02');
$now = new DateTime('now');

while ($now->getTimestamp() > $initial->getTimestamp()) {
    $initial = $initial->add($interval);
}

echo $initial->format('d M Y'); // should return April 2, 2011 !
?>
1 голос
/ 22 декабря 2010

Что произошло:

+10 years с Год 0 (1970) будет включать 3 високосных года '72, '76 и '80, но с '91 до '11 естьтолько пять високосных лет '92, '96, '00, '04 и '08.Вы добавили этот период дважды, поэтому, поскольку не было 6 високосных лет, вы получили один дополнительный день.

Что нужно сделать:

Объявление периода с strtotime одним шагом навремя.

$period = "+10 years";
$newTime = $startingTime;
while(<condition>){
    $newTime = strtotime($period, $newTime);
}
1 голос
/ 22 декабря 2010

Попробуйте это:

$current = $initial = strtotime('2 April 1991');
$time_span = '+10 years';

while ($current < time())
{ 
  $current = strtotime($time_span, $current);
}

echo date('d M Y', $current);
0 голосов
/ 22 декабря 2010

Как исправить ответ cx42net :

<?php

$initial = new DateTime('2 April 1991');
$now = new DateTime('now');
$interval = new DateInterval('P10Y');

$curDate = $initial;

while (true) {
    $curDate = $curDate->add($interval);

    $curDiff = $curDate->diff($now)->days;

    if (isset($lastDiff) && ($curDiff > $lastDiff)) {
        echo $lastDate->format('d M Y');
        break;
    } else {
        $lastDate = clone $curDate;
        $lastDiff = $curDiff;
    }
}
...