Как получить абсолютную разницу между двумя датами в PHP? - PullRequest
0 голосов
/ 07 августа 2011

Я вижу, что есть другие посты по этому вопросу на других языках, но я не могу найти один для PHP.Я не ищу разницу между двумя датами, а сколько дней отличается.Например:

2011-08-06 14:05:28

и

2011-08-07 08:46:28

с интервалом менее одного дня, но я хочу функцию, которая сообщит мнеони находятся в те дни, которые разделены одним днем, т.е. вернут значение 1 для этих двух дат и вернут значение 2 для следующих дат, например:

2011-08-06 23:05:28

и

2011-08-08 01:46:28

На самом деле, я предполагаю, что это должно быть легко, но я раньше мало работал с датами.

Ои еще одно ограничение, мне нужно что-то совместимое с PHP 5.2, поэтому я не могу использовать DateTime::diff.

РЕДАКТИРОВАТЬ: изменено, чтобы пояснить, что мне действительно нужно числовое возвращаемое значение, извините:)

Ответы [ 6 ]

1 голос
/ 07 августа 2011
$date1 = "2011-08-06 14:05:28";
$date2 = "2011-08-07 08:46:28";
if(date('Ymd', strtotime($date1)) == date('Ymd', strtotime($date2)))
{
    // Same day!
}

Обновление

Если вы действительно хотите количество дней между датами, я предлагаю вам обновить до PHP 5.3. Подсчет количества дней может быть довольно сложным, особенно если вы хотите иметь возможность обрабатывать дни в разные годы.

$days = abs(date('z', strtotime($date1)) - date('z', strtotime($date2)));

Это лучшее, что я могу сделать, но требует , что $date1 и $date2 находятся в одном и том же году.

1 голос
/ 07 августа 2011

Если я правильно интерпретирую вопрос, вам нужно GregorianToJD или mysql to_days

Обе функции возвращают юлианский день для конкретной даты, которая, в основном, является числом дней с "дня 0".

0 голосов
/ 21 августа 2016

Я бы попробовал что-то вроде этого (используя в основном временные метки):

/**
 * @param string $date1
 * @param string $date2
 * @return int
 *   Number of days between the two dates.
 */
function date_diff_days($date1, $date2) {

    // Ignore the time part and convert the date part to timestamp.
    $date1 = substr($date1, 0, 10);
    $date1 = strtotime($date1 . ' 00:00:00');
    $date2 = substr($date2, 0, 10);
    $date2 = strtotime($date2 . ' 00:00:00');

    // Compute the difference in seconds.
    $diff_secs = abs($date1 - $date2);

    // Convert the difference to days.
    $diff_days = ceil($diff_secs / (60 * 60 * 24));

    return $diff_days;

}

Я опробовал его на обоих ваших тестовых примерах, и это сработало так, как вы хотели. Если вы хотите какие-либо изменения, вы можете редактировать функцию. Надеюсь, это поможет!

0 голосов
/ 07 августа 2011
$secondsApart = strtotime( '2011-08-07 08:46:28' ) -
                   strtotime( '2011-08-06 14:05:28' );

Теперь вы можете вычислить любое другое значение на основе этого:

$hoursApart = round( $secondsApart / 3600 );
$daysApart = round( $secondsApart / 86400 );
...

Вы также можете использовать floor () или ceil () вместо round (), если это лучше соответствует вашим потребностям.

0 голосов
/ 07 августа 2011
  1. Преобразование даты в метки времени. Как это сделать, зависит от формата входных данных.
  2. Отформатируйте временные метки с помощью PHP-функции date (Ymd кажется подходящим $format).
  3. Сравните полученные строки на равенство.

Если вам нужна фактическая разница в днях, звоните date отдельно, используя Y, m и d в качестве форматов, создавайте временные метки из результата (используя mktime) и разделите разницу между временными метками на 86400 (количество секунд в день).

0 голосов
/ 07 августа 2011
  $date1 = "2011-08-06 14:05:28";
  $date2 = "2011-08-07 08:46:28";
  if(date("Ymd",strtotime($date1)) == date("Ymd",strtotime($date2)) {
      // they match

  } else {
      // calculate the difference
      $diff = ceil(abs(strtotime($date1)-strtotime($date2))/86400); 

  }
...