首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PHP:检查日期是否过期(end可能在午夜之后,也可能不是)

PHP:检查日期是否过期(end可能在午夜之后,也可能不是)
EN

Stack Overflow用户
提问于 2017-09-20 04:12:54
回答 2查看 239关注 0票数 1

我需要检查$now (在协调世界时的时间)是在某个时间间隔之前、之后还是之间。

所以,如果$end在午夜之间(例如$start = '18:00'$end = '22:00' ),没问题。

但是在一些测试之后,我确实“发现”如果$end是在午夜之后(在我的例子中是可以的),这可能是一个问题。例如,$start = '20:00'$end = '04:00'。在这种情况下,$start的日期为2017年9月19日,截止日期为2017年9月20日。

这是代码的第一部分(一些函数来自我自己编写的SupportDate类)。

代码语言:javascript
运行
复制
/**
                 * CASE #1  >>      NOW can be AFTER start and end time.
                 *              E.g.    now == 21.30 and start == 18.00 and end == 21.00
                 * 
                 * CASE #2  >>      NOW can be BEFORE start and end time.
                 *              E.g.    Now == 17.00, start == 18, end == 21.00
                 * 
                 * CASE #3  >>      NOW can be BETWEEN start and end time.
                 *              E.g.    Now == 19, start == 18, end = 21.00
                 */

                // CASE #1
                if ( ( $support->isExpired($start) === true ) && ( $support->isExpired($end) === true ) ) {

                    echo 'CASE #1 - siamo ben oltre sia l\'inizio che la fine';

                }

                // CASE #2
                if ( ( $support->isExpired($start) === false ) && ( $support->isExpired($end) === false ) ) {

                    echo 'CASE #2 - siamo ben PRIMA sia dell\'inizio che della fine';

                }

                // CASE #3
                if ( ( $support->isExpired($start) === true ) && ( $support->isExpired($end) === false ) ) {

                    echo 'CASE #3 - siamo TRA l\'inizio E la fine';

                }

(这是isExpired方法)

代码语言:javascript
运行
复制
public function isExpired($date=null,$qty=1,$interval='seconds') {

        $now = new \DateTime(null, new \DateTimeZone("UTC"));

        $expiry_date = new \DateTime($date, new \DateTimeZone("UTC"));

        date_add($expiry_date, date_interval_create_from_date_string($qty.' '.$interval));

        if ($now >= $expiry_date) {

            return true;

        } else {

            return false;
        }

    }

我可以复制这3个案例并应用先前的检查(伪代码: if $start > $end Else....)在false/true上反转检查,但是,我认为有一个更好的模式来获得我的3个案例。

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2017-09-20 04:23:59

您需要添加时区信息,但我使用以下内容:

代码语言:javascript
运行
复制
  /**
   * @param $date       DateTime to evaluate
   * @param $dateFrom   Start DateTime
   * @param $dateTo     End DateTime
   * @return bool
   */
    public static function isDateTimeBetween($date, $dateFrom, $dateTo)
    {
        return ($date>=$dateFrom && $date<=$dateTo);
    }
票数 0
EN

Stack Overflow用户

发布于 2017-09-25 20:08:40

基本逻辑是,如果您使用的是datetime对象,则可能需要调整实际的比较操作:

代码语言:javascript
运行
复制
if($start > $end) return ($now >= $start || $now <= $end);
else return ($now >= $start && $now <= $end);

这假设您只使用时间数据,而不使用日期数据。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46309023

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档