Intereting Posts

Расчет даты PHP

Каков наилучший (независимый формат даты) в PHP для расчета разницы в днях между двумя датами в указанном формате.

Я попробовал следующую функцию:

function get_date_offset($start_date, $end_date) { $start_time = strtotime($start_date); $end_time = strtotime($end_date); return round(($end_time-$start_time)/(3600*24)); } 

Он работает нормально в linux box, но при работе под Windows strtotime возвращает ''.

EDIT :

Дата ввода в формате mm / dd / yyyy , но я бы хотел, чтобы он принимал $ format в качестве параметра.

Мне нужно только разницу в днях.

Related of "Расчет даты PHP"

Если вы не хотите или вы не можете использовать Zend Framework или Pear package, попробуйте эту функцию, я надеюсь, что это поможет:

 function dateDifference($date1, $date2) { $d1 = (is_string($date1) ? strtotime($date1) : $date1); $d2 = (is_string($date2) ? strtotime($date2) : $date2); $diff_secs = abs($d1 - $d2); $base_year = min(date("Y", $d1), date("Y", $d2)); $diff = mktime(0, 0, $diff_secs, 1, 1, $base_year); return array ( "years" => abs(substr(date('Ymd', $d1) - date('Ymd', $d2), 0, -4)), "months_total" => (date("Y", $diff) - $base_year) * 12 + date("n", $diff) - 1, "months" => date("n", $diff) - 1, "days_total" => floor($diff_secs / (3600 * 24)), "days" => date("j", $diff) - 1, "hours_total" => floor($diff_secs / 3600), "hours" => date("G", $diff), "minutes_total" => floor($diff_secs / 60), "minutes" => (int) date("i", $diff), "seconds_total" => $diff_secs, "seconds" => (int) date("s", $diff) ); } 

Класс PEAR Date предлагает всевозможные функции для поиска различий между датами и около 1000 других вещей. Документы для этого здесь …

Проблема с PHP заключается в том, что он не имеет определенного типа DateTime. Вы можете использовать временную метку Unix или встроенный класс DateTime, но они довольно ограничены в своей функциональности. Я ожидаю, что должны быть какие-то сторонние классы с более широкой поддержкой вычислений на дату, но я их не искал.

Использование временных меток Unix для расчета даты (не время) также сложно. Вам придется отказаться от временной части, но просто сброс до 00:00 небезопасен из-за летнего времени (DST). DST имеет эффект, что есть два дня каждый год, которые не имеют ровно 24 часа. Таким образом, при добавлении / вычитании дат вы можете получить значение, которое не равномерно делится на 3600 * 24.

Я бы предложил искать какой-то сторонний класс, который имеет надлежащую поддержку для всего этого. Расчеты даты / времени являются удивительными в их уродстве. :П

Zend Framework имеет класс Zend_Date для работы с «математикой даты». Он работает с ограничениями по временной шкале системы, используя расширение BCMath, или если это недоступно, ограничивает отметки времени максимальным значением float для вашей системы.

 // example printing difference in days require('Zend/Date.php'); $date1 = new Zend_Date(); $date1->set(2, Zend_Date::MONTH); $date1->set(27, Zend_Date::DAY); $date1->set(2008, Zend_Date::YEAR); $date2 = new Zend_Date(); $date2->set(3, Zend_Date::MONTH); $date2->set(3, Zend_Date::DAY); $date2->set(2008, Zend_Date::YEAR); echo ($date2->getTimestamp() - $date1->getTimestamp()) / (3600*24); 

Я не уверен, что считается лучшим , поскольку для этого нет встроенной функции в PHP, но некоторые люди использовали gregoriantojd () , например, на этом форуме .

gregoriantojd () дает те же результаты, что и при использовании strtotime (), см. этот блог-план о том, как это сделать:

http://www.phpro.org/examples/Calculate-Age-With-PHP.html

Для меня работает следующее. Поверьте, я нашел его в документах php.net где-то.

* Edit – Woops, не видел сообщение csl. Это точная функция из его ссылки, должно быть, была там, где я ее нашел. 😉

 //Find the difference between two dates function dateDiff($startDate, $endDate) { // Parse dates for conversion $startArry = date_parse($startDate); $endArry = date_parse($endDate); // Convert dates to Julian Days $start_date = gregoriantojd($startArry["month"], $startArry["day"], $startArry["year"]); $end_date = gregoriantojd($endArry["month"], $endArry["day"], $endArry["year"]); // Return difference return round(($end_date - $start_date), 0); } 

Я пытался рассчитать разницу двух дат с целью показать продолжительность события. Большинство функций, заданных по проблеме, не удается, если событие имеет длительность в пятницу в 17:00 до воскресенья в 15:00. Моя цель заключалась в том, чтобы найти разницу между датами типа:

 date('Ymd',$end)-date('Tmd',$begining); 

Но это похоже на неудачу, потому что не существует 99 месяцев в году и 99 дней в месяц. Я мог бы преобразовать строку даты в временную метку UNIX и разделить на 60 * 60 * 12, но в некоторые дни есть большее или меньшее количество часов, иногда есть даже прыжок. Поэтому я сделал свою собственную функцию, используя функцию getdate (), которая возвращает массив информации о временной метке.

 /* * datediff($first,$last) * $first - unix timestamp or string aksepted by strtotime() * $last - unix timestamp or string aksepted by strtotime() * * return - the difference in days betveen the two dates */ function datediff($first,$last){ $first = is_numeric($first) ? $first : strtotime($first); $last = is_numeric($last ) ? $last : strtotime($last ); if ($last<$first){ // Can't calculate negative difference in dates return -1; } $first = getdate($first); $last = getdate($last ); // find the difference in days since the start of the year $datediff = $last['yday'] - $first['yday']; // if the years do not match add the appropriate number of days. $yearCountedFrom = $first['year']; while($last['year'] != $yearCountedFrom ){ // Take leap years into account if( $yearCountedFrom % 4 == 0 && $yearCountedFrom != 1900 && $yearCountedFrom != 2100 ){ //leap year $datediff += 366; }else{ $datediff += 365; } $yearCountedFrom++; } return $datediff; } 

Что касается функции GregorianToJD (), это может сработать, но я чувствую себя немного неловко, так как не понимаю, как это работает.

Ребята, не надо переучивать.

 $d1 = strtotime($first_date); $d2 = strtotime($second_date); $delta = $d2 - $d1; $num_days = ($delta / 86400); 

Вычислите разницу между двумя датами (и временем) с помощью Php. На следующей странице представлен целый ряд различных методов (всего 7) для расчета даты / времени с использованием Php, чтобы определить разницу во времени (часы, муниты), дни, месяцы или годы между двумя датами.

См. Php Date Time – 7 методов расчета разницы между двумя датами

В PHP 5.2 представлены классы DateTime и DateInterval, которые упрощают:

 function get_date_offset($start_date, $end_date) { $start_time = new DateTime($start_date); $end_time = new DateTime($end_date); $interval = $end_time->diff($start_time); return $interval->format('%a days'); }