首页 > 解决方案 > PHP - 日期比较建议

问题描述

编辑:感谢您的回复,使用人们在这里建议的内容,我还浏览了与我重复的帖子,那里也有一些很好的建议,但是我刚刚创建了另一个建议,因为我怀疑我的整个代码都不好并且想要一些指针,我现在让它工作,并将分享我在下面使用的代码:

$today = date("d-m-y");
$expire = $_SESSION["expiration_date"];
$today_time = strtotime($today);
$expire_time = strtotime($expire);
if($expire_time < $today_time){
    $_SESSION = array();
    session_destroy();
    header("location: contact_us_expired.php");
    exit;
}

像这样使用 strtotime 绝对不像使用 datetime 函数那样现代,并且会是一个更好的实践,但这是另一天的教训。感谢大家!

原帖:

首先,我是 PHP 新手,并且一直在通过一些实际测试和东西来学习绳索。最近我有一个真正的应用程序可以工作,它是一个小型 CRUD 系统。管理员创建了一个用户帐户,用户有 7 天的时间对系统进行采样,然后必须联系我们以获得更多时间或购买工具,所有这些工作几乎和我需要的一样好,但我无法真正比​​较约会成功。

当管理员创建一个用户帐户时,表单会收集并在数据库中写入当前时间和从现在起 7 天后的到期日期,当该用户登录时,使用代码比较该帐户是否已过期并重定向到形式。

我的问题是比较代码只是拒绝始终如一地工作,到期日期之前的某些日期实际上让用户登录就好了,如果我在数据库中手动更改同月内的某个日期但代码已经过期工作和重定向,但如果日期是从去年开始的,那么它不是,真正困扰我的是我找不到这里的罪魁祸首,var_dump 和 print_r 正在输出正确的日期。

在两次尝试中并没有真正改变,其中一次将日期存储在会话中并在用户登录时进行比较,另一次使用当前日期来比较到期日期

这是一些代码(日期比较代码)

if($_SESSION["date"] < $_SESSION["expiration_date"]){
    $_SESSION = array();
    session_destroy();
    header("location: contact_us_expired.php");
    exit;
}

(管理员创建新用户时的日期收获)

$created_at = date("d/m/y");
$expiration_date = date('d/m/y', strtotime('7 days'));

请保持冷静并理解我是新手,这是我第一次真正尝试创建一些东西,CRUD 系统似乎工作正常,但比较起来更复杂。

标签: php

解决方案


如前所述,您正在比较字符串。PHP将从左到右逐个字符进行比较,直到第一个字符让他决定您的条件是真还是假。

让我们说$_SESSION["date"] = "01/01/2020"$_SESSION["expiration_date"] = "03/12/2019"

PHP 将比较第一个字符0并查看它们是否相等。然后1反对3。由于1小于3,他会假设01/01/2020小于03/12/2019,即使不是。

将日期转换为 Datetime 对象是一个很好的解决方案。另一种方法可能是将您的日期字符串转换为时间戳。PHP 具有以下内置函数来实现这一点:strtotime()

请注意,如果您想使用此解决方案,则必须使用以下任一方法调整您的日期格式:

  1. 使用ISO格式YYYY-MM-DD
  2. 如果要保留当前格式,请将斜杠替换为破折号d-m-y。然后,您的日期将以您使用的欧洲格式进行解析。

此函数以整数形式返回自 1970 年 1 月 1 日以来经过的秒数。让您比较一个日期是否大于或小于另一个日期。

if(strtotime($_SESSION["date"]) < strtotime($_SESSION["expiration_date"])){
    $_SESSION = array();
    session_destroy();
    header("location: contact_us_expired.php");
    exit;
}

推荐阅读