Как рассчитать две даты, чтобы получить выходные данные в днях [дублировать]

Указатель NULL - это тот, который указывает на никуда. Когда вы разыскиваете указатель p, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p является нулевым указателем, местоположение, хранящееся в p, является nowhere, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception.

В общем, это потому, что что-то не было правильно инициализировано.

499
задан Qantas 94 Heavy 15 February 2014 в 05:45
поделиться

22 ответа

$now = time(); // or your date as well
$your_date = strtotime("2010-01-01");
$datediff = $now - $your_date;

echo round($datediff / (60 * 60 * 24));
750
ответ дан Community 17 August 2018 в 14:41
поделиться
  • 1
    Я думаю, что возвращение отрицательного количества дней предоставляет соответствующую информацию. И вы должны использовать $your_date-$now, если хотите, чтобы будущая дата возвращала положительное целое число. – Tim 2 March 2012 в 20:49
  • 2
    Как насчет секунд прыжка? Не все дни имеют ровно 24 * 60 * 60 секунд. Этот код может быть достаточным для практических целей, но он не является точным в очень редких случаях. – Benjamin Brizzi 1 August 2012 в 09:15
  • 3
    Забудьте о прыжках секунд (нет, на самом деле их тоже рассмотрите), но это НЕ учитывает изменения летнего времени! Каждый год он может быть отключен на протяжении этих границ. Вам нужно использовать классы DateTime. – Levi 4 December 2012 в 05:34
  • 4
    @billynoah Извините, я никогда не возвращался, чтобы обновить свой комментарий. Вы должны быть осторожны с летними часовыми поясами. Если вы сравните дату с летним днем, а затем дату без нее, вместо возврата на 7 дней, она вернется на 6,9 дня. Принимая пол возвращается 6 вместо 7. – Alex Angelico 23 July 2014 в 23:45
  • 5
    Мало того, что strtotime () терпит неудачу через 20 лет, он непригоден для использования прямо сейчас. ОП указали даты, а не время. Даты могут быть довольно старыми. Вот более простой ответ: $ NumberDays = gregoriantojd ($ EndM, $ EndD, $ EndY) - gregoriantojd ($ StartM, $ StartD, $ StartY); (для инклюзивного диапазона). В отличие от класса Datetime, по-григориански до Julian доступен в версии 4 вверх. Допустимый диапазон - 4714 B.C. до 9999 A.D. Остерегайтесь упорядоченного порядка параметров (например, вам нужно это предупреждение для php). – Guy Gordon 8 December 2016 в 21:18
$datediff = floor(strtotime($date1)/(60*60*24)) - floor(strtotime($date2)/(60*60*24));

и, при необходимости:

$datediff=abs($datediff);
3
ответ дан animuson 17 August 2018 в 14:41
поделиться

Попробуйте использовать Carbon

$d1 = \Carbon\Carbon::now()->subDays(92);
$d2 = \Carbon\Carbon::now()->subDays(10);
$days_btw = $d1->diffInDays($d2);

Также вы можете использовать

\Carbon\Carbon::parse('')

, чтобы создать объект даты Carbon с использованием заданной строкой timestamp.

5
ответ дан Arda 17 August 2018 в 14:41
поделиться
  • 1
    Не могли бы вы рассказать, в чем разница между этим и моим ответом? – Arda 29 July 2015 в 14:30
  • 2
    Чтобы сделать простую разницу в дате, вы предлагаете включить в себя совершенно новый пакет? – tomazahlin 8 March 2018 в 12:04

Легко использовать date_diff

$from=date_create(date('Y-m-d'));
$to=date_create("2013-03-15");
$diff=date_diff($to,$from);
print_r($diff);
echo $diff->format('%R%a days');
16
ответ дан Balaji D 17 August 2018 в 14:41
поделиться
  • 1
    Это хороший процедурный способ сделать это, используя класс DateTime. В этом случае не хватает четкого использования объекта интервала ($diff). Что-то вроде if ($diff->days > 30) { [doyourstuff]; } – Gusstavv Gil 23 September 2016 в 04:26

Если вы используете PHP 5.3 >, это, безусловно, самый точный способ вычисления разницы:

$earlier = new DateTime("2010-07-06");
$later = new DateTime("2010-07-09");

$diff = $later->diff($earlier)->format("%a");
428
ответ дан brownlightning 17 August 2018 в 14:41
поделиться
  • 1
    Обратите внимание, что, поскольку мы говорим о временных интервалах не конкретных моментов времени, синтаксис формата отличается от синтаксиса date () и strftime (). Синтаксис интервала времени можно найти здесь: php.net/manual/en/dateinterval.format.php – Andrew 4 June 2013 в 08:56
  • 2
    или в моем случае число дней между ними равно $ date2- & gt; diff ($ date1) - & gt; format ("% a") - 1 – xeo 21 February 2014 в 04:07
  • 3
    Имейте в виду, что если у вас есть время в свои даты, это не будет работать, как вы могли бы ожидать. Например, если у вас есть интервал в 23:30 часов ... и они находятся в разные дни, разница будет равна 0. – Layke 12 May 2014 в 10:47
  • 4
    Если вам нужно число дней relative (отрицательное, когда $date1 находится перед $date2), используйте вместо этого $diff = $date2->diff($date1)->format("%r%a");. – Socce 24 April 2015 в 09:06
  • 5
    Каков формат даты в DateTime("2010-07-06")?, Является ли это Y-m-d или Y-d-m ?, каков формат параметра DateTime. какой день? – 151291 23 January 2016 в 15:43

Из PHP версии 5.3 и выше добавлены новые функции даты / времени , чтобы получить разницу:

$datetime1 = new DateTime("2010-06-20");

$datetime2 = new DateTime("2011-06-22");

$difference = $datetime1->diff($datetime2);

echo 'Difference: '.$difference->y.' years, ' 
                   .$difference->m.' months, ' 
                   .$difference->d.' days';

print_r($difference);

Результат, как показано ниже:

Difference: 1 years, 0 months, 2 days

DateInterval Object
(
    [y] => 1
    [m] => 0
    [d] => 2
    [h] => 0
    [i] => 0
    [s] => 0
    [invert] => 0
    [days] => 367
)

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

132
ответ дан duplode 17 August 2018 в 14:41
поделиться
  • 1
    Да, это кажется лучше, чем принятый ответ, который в некоторых случаях не работает. Например: $ from = '2014-03-01'; $ К = '2014-03-31'; – MBozic 30 May 2014 в 15:51
  • 2
    Я согласен, так легко следовать и отлично работает! Просто не забудьте использовать функцию date_default_timezone_set (), иначе это даст вам странные результаты, основанные на времени UTC. – zeckdude 23 April 2015 в 04:50
  • 3
    Эта функция не удалась 0 из 14603 тестов в период с 1980 по 2020 год. – LSerni 9 November 2017 в 22:38
    // Change this to the day in the future
$day = 15;

// Change this to the month in the future
$month = 11;

// Change this to the year in the future
$year = 2012;

// $days is the number of days between now and the date in the future
$days = (int)((mktime (0,0,0,$month,$day,$year) - time(void))/86400);

echo "There are $days days until $day/$month/$year";
0
ответ дан engineervix 17 August 2018 в 14:41
поделиться

Если вы хотите повторить все дни между датой начала и окончания, я придумал следующее:

$startdatum = $_POST['start']; // starting date
$einddatum = $_POST['eind']; // end date

$now = strtotime($startdatum);
$your_date = strtotime($einddatum);
$datediff = $your_date - $now;
$number = floor($datediff/(60*60*24));

for($i=0;$i <= $number; $i++)
{
    echo date('d-m-Y' ,strtotime("+".$i." day"))."<br>";
}
1
ответ дан Fllo 17 August 2018 в 14:41
поделиться

Это работает!

$start = strtotime('2010-01-25');
$end = strtotime('2010-02-20');

$days_between = ceil(abs($end - $start) / 86400);
-4
ответ дан Jason Roman 17 August 2018 в 14:41
поделиться
50
ответ дан LSerni 17 August 2018 в 14:41
поделиться
$early_start_date = date2sql($_POST['early_leave_date']);


$date = new DateTime($early_start_date);
$date->modify('+1 day');


$date_a = new DateTime($early_start_date . ' ' . $_POST['start_hr'] . ':' . $_POST['start_mm']);
$date_b = new DateTime($date->format('Y-m-d') . ' ' . $_POST['end_hr'] . ':' . $_POST['end_mm']);

$interval = date_diff($date_a, $date_b);


$time = $interval->format('%h:%i');
$parsed = date_parse($time);
$seconds = $parsed['hour'] * 3600 + $parsed['minute'] * 60;
//        display_error($seconds);

$second3 = $employee_information['shift'] * 60 * 60;

if ($second3 < $seconds)
    display_error(_('Leave time can not be greater than shift time.Please try again........'));
    set_focus('start_hr');
    set_focus('end_hr');
    return FALSE;
}
0
ответ дан Marco Santarossa 17 August 2018 в 14:41
поделиться

Ну, выбранный ответ не самый правильный, потому что он выйдет за пределы UTC. В зависимости от часового пояса ( list ) могут быть настройки времени, создающие дни «без» 24 часов, и это приведет к сбою вычисления (60 * 60 * 24).

Здесь это пример этого:

date_default_timezone_set('europe/lisbon');
$time1 = strtotime('2016-03-27');
$time2 = strtotime('2016-03-29');
echo floor( ($time2-$time1) /(60*60*24));
 ^-- the output will be **1**

Итак, правильное решение будет использовать DateTime

date_default_timezone_set('europe/lisbon');
$date1 = new DateTime("2016-03-27");
$date2 = new DateTime("2016-03-29");

echo $date2->diff($date1)->format("%a");
 ^-- the output will be **2**
9
ответ дан Miguel Costa 17 August 2018 в 14:41
поделиться

Объектно-ориентированный стиль:

$datetime1 = new DateTime('2009-10-11');
$datetime2 = new DateTime('2009-10-13');
$interval = $datetime1->diff($datetime2);
echo $interval->format('%R%a days');

Процедурный стиль:

$datetime1 = date_create('2009-10-11');
$datetime2 = date_create('2009-10-13');
$interval = date_diff($datetime1, $datetime2);
echo $interval->format('%R%a days');
15
ответ дан Paul Tomkiel 17 August 2018 в 14:41
поделиться
$start = '2013-09-08';
$end = '2013-09-15';
$diff = (strtotime($end)- strtotime($start))/24/3600; 
echo $diff;
5
ответ дан power66x 17 August 2018 в 14:41
поделиться
  • 1
    Эта функция не удалась 560 из ее 14603 тестов в период с 1980 по 2020 год. – LSerni 9 November 2017 в 22:40

Использовал это:)

$days = (strtotime($endDate) - strtotime($startDate)) / (60 * 60 * 24);
print $days;

Теперь он работает

8
ответ дан ridecar2 17 August 2018 в 14:41
поделиться
  • 1
    Мухаммад, это не форум. Вы не должны публиковать ответы на свой вопрос, если кто-то не смог ответить на него за вас, что не так в этой ситуации. Вы хотите использовать функцию комментариев, чтобы получить разъяснения по отдельным ответам. Кроме того, вы всегда можете отредактировать исходный вопрос. – Justin Johnson 11 January 2010 в 09:21
  • 2
    Очень старый комментарий выше, но это неверно. StackOverflow делает , чтобы вы могли ответить на свой вопрос (даже если вы задаете ваш вопрос). Ответ на вопрос сам после того, как кто-то уже опубликовал одно и то же решение, однако считается грубым. – Maarten Bodewes 19 May 2014 в 19:37
  • 3
    Эта функция не удалась 560 из ее 14603 тестов в период с 1980 по 2020 год. – LSerni 9 November 2017 в 22:43

Вот моя улучшенная версия, которая показывает 1 год (ы) 2 Месяцев (ы) 25 дней, если передан второй параметр.

class App_Sandbox_String_Util {
    /**
     * Usage: App_Sandbox_String_Util::getDateDiff();
     * @param int $your_date timestamp
     * @param bool $hr human readable. e.g. 1 year(s) 2 day(s)
     * @see http://stackoverflow.com/questions/2040560/finding-the-number-of-days-between-two-dates
     * @see http://qSandbox.com
     */
    static public function getDateDiff($your_date, $hr = 0) {
        $now = time(); // or your date as well
        $datediff = $now - $your_date;
        $days = floor( $datediff / ( 3600 * 24 ) );

        $label = '';

        if ($hr) {
            if ($days >= 365) { // over a year
                $years = floor($days / 365);
                $label .= $years . ' Year(s)';
                $days -= 365 * $years;
            }

            if ($days) {
                $months = floor( $days / 30 );
                $label .= ' ' . $months . ' Month(s)';
                $days -= 30 * $months;
            }

            if ($days) {
                $label .= ' ' . $days . ' day(s)';
            }
        } else {
            $label = $days;
        }

        return $label;
    }
}
0
ответ дан Svetoslav Marinov 17 August 2018 в 14:41
поделиться

Преобразуйте даты в временные метки unix, а затем выложите один из другого. Это даст вам разницу в секундах, которую вы разделите на 86400 (количество секунд в день), чтобы дать вам приблизительное количество дней в этом диапазоне.

Если ваши даты в формате 25.1.2010 , 01/25/2010 или 2010-01-25, вы можете использовать функцию strtotime:

$start = strtotime('2010-01-25');
$end = strtotime('2010-02-20');

$days_between = ceil(abs($end - $start) / 86400);

Используя ceil, округлите количество дней до следующего полного дня. Используйте floor вместо этого, если вы хотите получить количество полных дней между этими двумя датами.

Если ваши даты уже находятся в формате timestamp в формате unix, вы можете пропустить преобразование и просто выполнить $days_between часть , Для более экзотических форматов даты вам, возможно, придется сделать некоторые индивидуальные синтаксические разборки, чтобы исправить их.

121
ответ дан Tatu Ulmanen 17 August 2018 в 14:41
поделиться
  • 1
    Как насчет ДСТ? – toon81 6 February 2013 в 12:38
  • 2
    @ toon81 - мы используем временные метки Unix , чтобы избежать таких беспорядков! ;) – Alastair 18 September 2013 в 05:57
  • 3
    Позвольте мне уточнить: допустим, что сегодня утром в 3 утра почти вся Европа перевела часы назад. Это означает, что сегодня есть дополнительные 3600 секунд, и это должно отражаться в отметках времени UNIX. Если это так, то это означает, что сегодня будет рассчитан на два дня с вышеуказанным способом вычисления количества дней. И я даже не начинаю скачкообразно, так как ни PHP, ни UNIX, похоже, не учитывают те, которые действительно понятны ИМО. TL; DR: не все дни составляют 86 400 секунд . – toon81 18 September 2013 в 09:59
  • 4
    @ toon81 У этой даты еще 3600 секунд. Ничего не происходит с отметкой времени UNIX при переходе на или с DST. – nickdnk 20 December 2015 в 21:43
  • 5
    Если с временной отметкой UNIX ничего не происходит, вы согласитесь со мной: разница между отметкой UNIX с отметкой времени 1PM на $day и отметкой времени UNIX на 1PM на $day+1 не всегда составляет 86400 секунд в часовых поясах, которые наблюдают DST. Это может быть 23 или 25 часов в секундах вместо 24 часов. – toon81 21 December 2015 в 14:25
function howManyDays($startDate,$endDate) {

    $date1  = strtotime($startDate." 0:00:00");
    $date2  = strtotime($endDate." 23:59:59");
    $res    =  (int)(($date2-$date1)/86400);        

return $res;
} 
1
ответ дан Thor 17 August 2018 в 14:41
поделиться
  • 1
    Эта функция провалила 320 своих тестов 14603 между 1980 и 2020 годами. – LSerni 9 November 2017 в 22:41
function get_daydiff($end_date,$today)
{
    if($today=='')
    {
        $today=date('Y-m-d');
    }
    $str = floor(strtotime($end_date)/(60*60*24)) - floor(strtotime($today)/(60*60*24));
    return $str;
}
$d1 = "2018-12-31";
$d2 = "2018-06-06";
echo get_daydiff($d1, $d2);
0
ответ дан user3216114 17 August 2018 в 14:41
поделиться

Если вы используете MySql

function daysSince($date, $date2){
$q = "SELECT DATEDIFF('$date','$date2') AS days;";
$result = execQ($q);
$row = mysql_fetch_array($result,MYSQL_BOTH);
return ($row[0]);

}

function execQ($q){
$result = mysql_query( $q);
if(!$result){echo ('Database error execQ' . mysql_error());echo $q;}    
return $result;

}

0
ответ дан user462990 17 August 2018 в 14:41
поделиться
<?php
$date1=date_create("2013-03-15");
$date2=date_create("2013-12-12");
$diff=date_diff($date1,$date2);
echo $diff->format("%R%a days");
?>

использовал приведенный выше код очень просто. Спасибо.

0
ответ дан Y. Joy 17 August 2018 в 14:41
поделиться

Если у вас есть время в секундах (отметка времени времени I.E. unix), вы можете просто вычесть время и разделить на 86400 (секунды в день)

2
ответ дан zmbush 17 August 2018 в 14:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: