PHP tarih hesaplama

11 Cevap php

Ne belirtilen formatta iki tarih arasındaki gün farkı hesaplamak için PHP iyi (tarih formatı bağımsız şekilde).

Ben aşağıdaki işlevi çalıştı:

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));
}

'' Bu linux kutusunda Tamam çalışır, ama windows altında çalışırken döner strtotime.

EDIT:

Giriş tarihi mm/dd/yyyy formatında, ama bir parametre olarak $ biçimi kabul yapmak istiyorum.

Günlerdir tek fark gerekiyor.

11 Cevap

İstediğiniz ya da yoksa ben bu yardımcı olacağını umuyoruz bu işlevini deneyin Zend Framework veya Armut paketi kullanamazsınız:

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)
    );
}

ARMUT Date sınıfı yanı sıra tarih ve 1000 başka şeyler arasındaki farklılıkları bulmak için özellikler her türlü sunmaktadır. Bunun için belgeler vardır here...

PHP ile sorun kesin bir DateTime türü yok olmasıdır. Eğer Unix zaman damgası, ya da yerleşik DateTime sınıfı kullanabilirsiniz, ama onlar oldukça onların işlevselliği sınırlıdır. Ben tarih-saat hesaplamaları için daha geniş destek ile bazı 3. parti sınıflar olması gerektiğini bekliyoruz, ama ben bunun için bakmadım.

Tarih için Unix zaman damgalarını kullanarak (zaman değil) hesaplamaları da zordur. Siz zaman parçası atmak zorunda, ama sadece 00:00 sıfırlayarak çünkü yaz saati (DST) güvenli değildir ediyorum. DST iki gün 24 saat boyunca tam olarak yok her yıl olduğu etkisine sahiptir. Böylece tarihleri ​​çıkarılarak / eklerken * 24 3600 ile eşit bölmek değil bir değer ile bitirmek olabilir.

Tüm bu şeyler için uygun destek olan bazı 3. parti sınıf için arıyorum öneririz. Tarih / Saat hesaplamaları kendi çirkinlik olarak harika. : P

Zend Framework Zend_Date "tarih matematik" ile başa çıkmak için sınıf vardır. Bu BCMath uzantısını kullanarak sistem belirli damgası sınırları etrafında çalıştığını, ya da mevcut değil eğer sizin sisteminiz için maksimum float değeri ile damgalarını sınırlar.

// 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);

Bunu yapmak için PHP yerleşik bir işlev olmadığından ben, best olarak kabul edilir ne emin değilim, ama bazı insanlar {[(2 örneğin, gregoriantojd() kullanmış )]}.

gregoriantojd ()) (strtotime kullanarak aynı sonuçları verir, bunu yapmak için nasıl bu blogpost bakın:

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

Benim için aşağıdaki işler. Ben bir yere php.net dokümanlar buldum inanıyorum.

* Düzenleme - Woops, CSI yazı görmedim. Bu tam fonksiyon buldum burada yaptığı linkten olmuşlardır gerekir. ;)

//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);
}

Ben bir olayın süresini gösteren amacıyla iki tarih arasındaki farkı hesaplamak için çalışıyordu. Olay saat 15:00 Pazar 17:00 de Cuma bir süre formu varsa sorun üzerinde verilen fonksiyonların en başarısız olur. Amacım gibi tarihleri ​​arasındaki farkı bulmak için oldu:

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

Ama bu 99 ay bir ay, bir yıl ve 99 gün içinde olmadığı için başarısız lezzetli ve besleyicidir. Ben * 12 * 60 60 UNIX zaman damgası ve bölmek için tarih dizesi dönüştürmek olabilir, ancak bazı günler bazen bir sıçrama secound orada eaven oluyor saat daha fazla ya da daha az sayıda var. Yani getdate () zaman damgası ile ilgili innformation bir dizi döndüren bir fonksiyon kullanarak kendi işlevini yaptı.

/*
 * 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 () fonksiyonu ile ilgili olarak, bu işe yarayabilir, ama nasıl çalıştığını anlamıyorum çünkü ben biraz huzursuz hissediyorum.

Beyler, overengineer etmeyelim.

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

Php kullanarak iki Tarihler (ve zaman) arasındaki farkı hesaplayın. Aşağıdaki sayfa zaman farkı (saat, munites), gün, ay ya da iki tarih arasındaki yıl belirlemek için, Php kullanarak tarih / saat hesaplamaları gerçekleştirmek için farklı yöntemler (toplam 7) bir dizi sağlar.

Bkz Php Date Time - 7 Methods to Calculate the Difference between 2 dates

PHP 5.2 Bu kolaylaştırır DateTime ve DateInterval sınıfları tanıttı:

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');
}