Разница в датах между серверами

Мне интересно, почему я все время получаю абсолютно неверные вычисления с помощью PHP.

У меня есть такой код:

echo floor((strtotime("2017-03-27") - strtotime("2017-03-24"))/86400);

который на одном из серверов возвращает: 3 (как 3 дня)

и на другом сервере возвращает: 2! (2.9583333333333 день?) Почему есть разница?

0

Решение

Или просто используйте лучшие методы:

РЕДАКТИРОВАТЬ Я обновил код, чтобы использовать те же даты, что и OP. Возвращается 3, как и должно быть, и я вполне уверен, что это будет сделано на любом сервере, на котором вы его тестируете.

<?php

$date1 = date_create('2017-03-27');
$date2 = date_create('2017-03-24');

$interval = date_diff($date1,$date2);

echo $interval->format('%a');

?>

Ref: http://php.net/manual/en/function.date-diff.php

2

Другие решения

Ваши серверы могут находиться в двух разных часовых поясах. Преобразуйте дни в часы, и вы получите разницу в один час.

3 days        * 24 hours/1 day = 72 hours
2.958333 days * 24 hours/1 day = 71 hours
0

Поскольку некоторые люди испытывают трудности с принятием того, что это происходит из-за изменения летнего времени, специфичного для TZ, есть некоторые доказательства:

function poc($tz_str) {
$tz = new DateTimeZone($tz_str);
$start = (new DateTime('2017-03-24', $tz))->format('U');
$end = (new DateTime('2017-03-27', $tz))->format('U');

return [$tz_str, $end - $start, ( $end - $start ) / 86400];
}

var_dump(
poc('UTC'),
poc('Europe/London'),
poc('America/New_York')
);

Выход:

array(3) {
[0]=> string(3) "UTC"[1]=> int(259200)
[2]=> int(3)
}
array(3) {
[0]=> string(13) "Europe/London"[1]=> int(255600)
[2]=> float(2.9583333333333)
}
array(3) {
[0]=> string(16) "America/New_York"[1]=> int(259200)
[2]=> int(3)
}
  • UTC не имеет DST, не влияет.
  • На большей части восточного полушария изменения летнего времени произошли 26 марта, пострадавших.
  • На большей части западного полушария изменения летнего времени 12 марта не пострадали.

Тем не менее, не делайте ручную математику даты на отметке времени Unix.

0
По вопросам рекламы [email protected]