2010-03-25 41 views
8

Tôi có dòng dưới đây của mãZend ngày - ngày chênh lệch

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

này sẽ trở lại 4

Nhưng nếu đã

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

nó sẽ trở lại -27 .. sẽ như thế nào tôi nhận được câu trả lời đúng

Trả lời

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 $ ngày;

này cung cấp cho câu trả lời đúng

7

Tôi tin rằng vấn đề nằm trong chuỗi phần của bạn. Thay vào đó, hãy thử YYYY-MM-dd.

$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

Cảm ơn Mike .. nó đang hoạt động ... nhưng cần trừ 1;) –

+5

Hãy coi chừng 'YYYY' là Năm ISO. Sử dụng 'yyyy' cho năm. – smack0007

+0

Zend Framework Date :: sub() trả về một sự khác biệt trong vài giây và không phải đối tượng toString sẽ không hoạt động. – kevin

2

tôi đã mở rộng Zend_Date cho các chức năng thuận tiện của riêng tôi. Giải pháp của tôi cũng tương tự như Nisanth, với một số khác biệt quan trọng:

  1. tính toán đầu ngày cho cả hai ngày trước khi so sánh
  2. sử dụng round() thay vì ceil()
  3. không thêm 1 đến kết quả

Mã ví dụ:

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

số ngày giữa ngày đăng ký (sau này) và ngày mua (trước)

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

Nếu $ date là một đối tượng Zend_Date bạn có thể sử dụng như sau:

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

hoặc các hàm subXxx khác của đối tượng Zend_Date.

Các vấn đề liên quan