2010-03-25 13 views
8

Ich habe die unten Linie von CodesZend Datum - Tag Unterschied

$day1 = new Zend_Date('2010-03-01', 'YYYY-mm-dd'); 
$day2 = new Zend_Date('2010-03-05', 'YYYY-mm-dd'); 
$dateDiff = $day2->getDate()->get(Zend_Date::TIMESTAMP) - $day1->getDate()->get(Zend_Date::TIMESTAMP); 
$days = floor((($dateDiff/60)/60)/24); 
return $days; 

dieses 4

zurückkehren Aber wenn gab

$day1 = new Zend_Date('2010-02-28', 'YYYY-mm-dd'); 
$day2 = new Zend_Date('2010-03-01', 'YYYY-mm-dd'); 
$dateDiff = $day2->getDate()->get(Zend_Date::TIMESTAMP) - $day1->getDate()->get(Zend_Date::TIMESTAMP); 
$days = floor((($dateDiff/60)/60)/24); 
return $days; 

es zurück -27 .. wie wird Ich bekomme die richtige Antwort

Antwort

14
$firstDay = new Zend_Date('2010-02-28', 'YYYY-MM-dd'); 
$lastDay = new Zend_Date('2010-03-01', 'YYYY-MM-dd'); 
$diff = $lastDay->sub($firstDay)->toValue(); 
$days = ceil($diff/60/60/24) +1; 

return $ Tage;

Dies gibt die richtige Antwort

7

Ich glaube, das Problem ist in Ihrem Teil String. Versuchen Sie YYYY-MM-dd stattdessen.

$day1 = new Zend_Date('2010-02-28', 'YYYY-MM-dd'); 
$day2 = new Zend_Date('2010-03-01', 'YYYY-MM-dd'); 
echo $day2->sub($day1)->toString(Zend_Date::DAY); 
+0

Danke Mike .. es funktioniert ... aber muss 1 subtrahieren;) –

+5

Vorsicht "YYYY" ist das ISO-Jahr. Verwenden Sie "yyyy" für das Jahr. – smack0007

+0

Zend Framework Date :: sub() gibt einen Unterschied in Sekunden zurück und kein Objekt toString funktioniert nicht. – kevin

2

ich Zend_Date für meine eigenen Komfort-Funktionen erweitert haben. Meine Lösung ist ähnlich Nisanth des mit einigen wichtigen Unterschieden:

  1. den Beginn des Tages für beiden Tage berechnen, bevor
  2. Verwendung Vergleich round() statt ceil()
  3. nicht hinzufügen 1 das Ergebnis

Beispielcode:

class My_Date extends Zend_Date 
{ 
    public static function now($locale = null) 
    { 
     return new My_Date(time(), self::TIMESTAMP, $locale); 
    } 

    /** 
    * set to the first second of current day 
    */ 
    public function setDayStart() 
    { 
     return $this->setHour(0)->setMinute(0)->setSecond(0); 
    } 

    /** 
    * get the first second of current day 
    */ 
    public function getDayStart() 
    { 
     $clone = clone $this; 
     return $clone->setDayStart(); 
    } 

    /** 
    * get count of days between dates, ignores time values 
    */ 
    public function getDaysBetween($date) 
    { 
     // 86400 seconds/day = 24 hours/day * 60 minutes/hour * 60 seconds/minute 
     // rounding takes care of time changes 
     return round($date->getDayStart()->sub(
      $this->getDayStart() 
     )->toValue()/86400); 
    } 
} 
3
$cerimonia = new Zend_Date('your date here'); 
    $days = $cerimonia->sub(Zend_Date::now()); 
    $days = round($days/86400)+1; 
0

Anzahl der Tage zwischen Zeitpunkt der Eintragung (später) und Kaufdatum (vor)

// $datePurchase instanceof Zend_Date 
// $dateRegistration instanceof Zend_Date 
if($datePurchase && $dateRegistration) { 
    $diff = $dateRegistration->sub($datePurchase)->toValue(); 
    $days = ceil($diff/60/60/24)+1; 
} 
0

Wenn $ Datum ein Zend_Date Objekt ist, dass Sie die folgende verwenden:

if ($date->isEarlier(Zend_Date::now()->subDay(2)){ 
    [...] 
} 

oder andere SubXxx-Funktionen des Zend_Date-Objekts.