PHP расчет даты - PullRequest
       47

PHP расчет даты

2 голосов
/ 23 декабря 2008

Что является лучшим (независимый от формата даты) в 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 работает нормально, но при работе под windows strtotime возвращает ''.

EDIT

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

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

Ответы [ 11 ]

6 голосов
/ 23 декабря 2008

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

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)
    );
}
4 голосов
/ 23 декабря 2008

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

3 голосов
/ 23 декабря 2008

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

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

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

2 голосов
/ 23 декабря 2008

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

// 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);
1 голос
/ 05 сентября 2009

Я пытался вычислить разницу двух дат, чтобы показать продолжительность события. Большинство функций, указанных в задаче, не выполняется, если событие имеет продолжительность с пятницы с 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 (), она может работать, но мне немного неловко, поскольку я не понимаю, как она работает.

1 голос
/ 13 мая 2009

У меня работает следующее. Поверьте, я где-то нашел это в документации по php.net.

* Редактировать - 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);
}
1 голос
/ 13 мая 2009

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

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

1 голос
/ 23 декабря 2008

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

0 голосов
/ 30 января 2013

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');
}
0 голосов
/ 06 января 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...