Zend framework Zend Date--日差

Zend framework Zend Date--日差,zend-framework,zend-form,zend-date,Zend Framework,Zend Form,Zend Date,我有下面的代码行 $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((($dateDif

我有下面的代码行

$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;  
这将返回4

但是如果给

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

它将返回-27。。我怎样才能得到正确的答案我相信问题出在你的部分。请改为尝试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);
返回$days


这给出了正确的答案

我已经扩展了
Zend_Date
以方便自己使用。我的解决方案与Nisanth的类似,但有一些关键区别:

  • 比较前计算两天的开始时间
  • 使用
    round()
    代替
    ceil()
  • 不要在结果中添加
    1
  • 示例代码:

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

    注册日期(较晚)和购买日期(之前)之间的天数


    如果$date是Zend_日期对象,则可以使用以下内容:

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

    或者Zend_Date对象的其他subXxx函数。

    注意“yyy”是ISO年。对年份使用“yyyy”。Zend Framework Date::sub()以秒为单位返回差值,而不是对象toString将不起作用。现在查看日期代码,sub()在末尾返回$this(这是一个Zend_Date对象)。这是zend framework 1.11版的情况。如果差异大于一个月,此代码将无法按预期工作此方法将修改
    day2
    对象,这可能是不需要的,因为OP只要求在天内进行比较。一、 首先,他们希望避免修改对象,因为它们可能在以后的原始日期需要。我喜欢你的方法。我与->isLater一起使用,这也是可用的(当然,用于其他目的)。
        $cerimonia = new Zend_Date('your date here');
        $days = $cerimonia->sub(Zend_Date::now());
        $days = round($days/86400)+1;
    
    // $datePurchase instanceof Zend_Date
    // $dateRegistration instanceof Zend_Date
    if($datePurchase && $dateRegistration) {
       $diff = $dateRegistration->sub($datePurchase)->toValue();
       $days = ceil($diff/60/60/24)+1;
     } 
    
    if ($date->isEarlier(Zend_Date::now()->subDay(2)){
        [...]
    }