2010-03-25 6 views
8

je la ligne ci-dessous des codesDate de Zend - différence jour

$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; 

ce retournera 4

Mais si donné

$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; 

il retournera -27 .. comment sera Je reçois la bonne réponse

Répondre

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; 

retour jours $;

cela donne la bonne réponse

7

Je crois que le problème est dans votre partie de chaîne. Essayez YYYY-MM-dd à la place.

$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

Merci Mike .. il fonctionne ... mais besoin de soustraire 1;) –

+5

Méfiez-vous 'YYYY' est l'année ISO. Utilisez 'aaaa' pour l'année. – smack0007

+0

Zend Framework Date :: sub() renvoie une différence en secondes et non un objet toString ne fonctionnera pas. – kevin

2

J'ai étendu Zend_Date pour mes propres fonctions de commodité. Ma solution est similaire à Nisanth de, avec quelques différences importantes:

  1. calculer le début de la journée pour les deux jours avant de comparer
  2. utilisation round() au lieu de ceil()
  3. ne pas ajouter 1 au résultat

code Exemple:

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

nombre de jours entre la date d'enregistrement (plus tard) et la date d'achat (avant)

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

Si la date de $ est un objet Zend_Date vous pouvez utiliser les éléments suivants:

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

ou autres fonctions subXxx de l'objet Zend_Date.