PHP - подсчет количества недель между двумя датами - PullRequest
1 голос
/ 30 апреля 2019

Я пытаюсь подсчитать количество недель между двумя датами.Код ниже имеет результат 3 недели.Тем не менее, это действительно 4 недели.Почему он вычисляет неправильно и в чем заключается решение?

Мне интересно узнать, почему этот конкретный код не работает, но также хотелось бы узнать, есть ли лучший способ сделать это.

Я использую PHP версии 7.2.Ниже приведен код, который я использую:

$HowManyWeeks = date( 'W', strtotime( 2019-04-21 23:59:00 ) ) - date( 'W', strtotime( 2019-03-25 00:00:00 ) );

Значение $ HowManyWeeks должно быть 4, но отображается как 3.

Кроме того, когда я пытаюсь этот код на https://phpfiddle.org/ выдает ошибку:

Line : 2 -- syntax error, unexpected '23' (T_LNUMBER), expecting ',' or ')'

Но при запуске на моем сервере отображается «3» без ошибок.

Спасибо,

Тим

Ответы [ 3 ]

2 голосов
/ 30 апреля 2019

Значение $ HowManyWeeks должно быть 4

Почему? обратите внимание, что в php неделя составляет , начинается с понедельника , и я считаю в календаре ровно 3.

Если вам нужно 4 (воскресенье как первый день недели), отметьте день недели

$time1 = strtotime('2019-04-21 23:59:00');
$week1 = idate('W', $time1);
if(idate('w', $time1) == 0) # Sunday, next week
    $week1++;
...
2 голосов
/ 30 апреля 2019

Даты, которые вы передаете strtotime, должны быть заключены в кавычки. И правильный ответ действительно 3, так как между этими двумя значениями 3 недели, 6 дней, 23 часа и 59 минут. Попробуйте это:

$HowManyWeeks = date( 'W', strtotime( '2019-04-21 23:59:00' ) ) - date( 'W', strtotime( '2019-03-25 00:00:00' ) );
echo $HowManyWeeks;

Как уже указывалось, это будет работать только тогда, когда недели находятся в одном и том же году. Проще использовать DateTime объекты, как в ответе @MiroslavGlamuzina, или вы можете просто разделить разницу strtotime на 604800 (секунд в неделю); затем вы можете взять floor или ceil, если требуется, для преобразования в целочисленное значение:

$HowManyWeeks = (strtotime( '2019-04-21 23:59:00' ) - strtotime( '2019-03-25 00:00:00' )) / 604800;
echo $HowManyWeeks;

Выход:

3.9939484126984

Демонстрация на 3v4l.org

2 голосов
/ 30 апреля 2019

Вы можете использовать DateTime() для достижения этой цели:

$date1 = new DateTime('2017-04-30');
$date2 = new DateTime('2019-04-30');
// I have left the remainer. You may need to round up/down. 
$differenceInWeeks = $date1->diff($date2)->days / 7;
print_r($differenceInWeeks);

Надеюсь, это поможет,

...