【问题标题】:Adding 2 days and comparing添加 2 天并进行比较
【发布时间】:2014-01-24 21:35:21
【问题描述】:

我已经编写了一些代码来检查是否使用 2 个日期过去了 2 天,但它似乎不起作用。

<?php
date_default_timezone_set('Europe/Amsterdam');

$_connection = mysqli_connect("localhost", "root", "root", "theater") or die("Error: " . mysqli_error());

$query = "SELECT * FROM Reservering";
$result = mysqli_query($_connection, $query);

while($row = mysqli_fetch_assoc($result)) {
    $res = strtotime($row['ReserveringsDatum']);
    echo date('d-m-y', $res);
}

mysqli_close($_connection);
?>

$row['ReserveringsDatum'] 是一个如下所示的日期:“07-01-14”(示例)。

由于某种原因,echo date('d-m-y', $res); 向我显示“14-01-07”,这只是颠倒了日期和年份。

编辑: 对于那些想知道它是如何结束的人,这里是工作代码:

<?php
date_default_timezone_set('Europe/Amsterdam');

$_connection = mysqli_connect("localhost", "root", "root", "theater") or die("Error: " . mysqli_error());

$query = "SELECT *, DATEDIFF(NOW(), DATE(ReserveringsDatum)) 'age' FROM Reservering WHERE DATEDIFF(NOW(), ReserveringsDatum) > 2 ";
$result = mysqli_query($_connection, $query);

while($row = mysqli_fetch_assoc($result)) {
    if($row['Betaalt'] == 'nee') {
        $query2 = "DELETE FROM Reservering WHERE `ReserveringID` = '".$row['ReserveringID']."'";
        mysqli_query($_connection, $query2);
    }
}

mysqli_close($_connection);


?>

【问题讨论】:

  • 哪个值有$res和$limit?你做过 var_dump 吗?
  • $limit 将永远大于$res - 它被定义为$res+172800。你确定你不是要检查它是否比真实日期/时间早2天吗?
  • 为什么不把逻辑放到你的sql语句中呢?只需获取那些通过“截止日期”的记录。
  • @Rogier 我理解你的建议,但我不太擅长使用 sql 计算。
  • 现在可以用了吗?

标签: php date strtotime


【解决方案1】:

正如评论中所说,我会在 SQL 中进行选择。不需要在 PHP 中选择所有行并过滤它们。它在 SQL 中做得更好。

简单示例:

SELECT *, DATEDIFF(NOW(), ReserveringsDatum) 'age' FROM Reservering WHERE DATEDIFF(NOW(), ReserveringsDatum) > 2 

确保 reserveringsdatum 是 DATE,如果它是 TIMESTAMP,则需要将其转换为 DATE。

SELECT *, DATEDIFF(NOW(), DATE(ReserveringsDatum)) 'age' FROM Reservering WHERE DATEDIFF(NOW(), ReserveringsDatum) > 2 

【讨论】:

  • 我将其设置为 VARCHAR。当我将其更改为日期或时间戳时,它分别给我“2007-01-14”和“2007-01-14 00:00:00”。我不知道为什么它把 07 读作年份。
  • 我已将该字段更改为 DATE,并将信息发布到数据库的方式更改为“2014-01-07”。使用此查询,它是否只返回超过 2 天的行?
  • 我已经对此进行了测试,我认为它可以正常工作。我做了 7 行,从 1 到 7(2014-01-1 到 2014-01-07),只有从 1 到 4 的行显示:D。
  • @user1433479 这样更好。是的,MySQL 将日期存储为 YYYY-MM-DD。无论如何,使用适当的列类型要好得多。对于未来,您可以使用日期计算做更多的事情(如 BETWEEN、WEEK、YEAR 等)。以 UTC 存储也是一种更好的方式(题外话),但您可以轻松地使用时区。
【解决方案2】:

你的问题出在这一行

$limit = strtotime($row['ReserveringsID']) + $2days;

你需要像这样加2天

$res = strtotime($row['ReserveringsID']);
$limit = strtotime('+2 days', $res);

将日期加 2 天的工作演示 https://eval.in/86632

How do I add 24 hours to a unix timestamp in php?

Adding days to a timestamp

【讨论】:

  • 当我使用您的方法添加 2 天时,它给了我 16-01-14(而不是预期的 09-1-14)。更奇怪的是它说已经过去了 2 天,尽管当前日期远不及 16-01-14
  • 我不知道。当我从数据库中获取值时,它说它是 14-01-07,就像它正在转动一年和一天,而是增加了 2 年。
  • 更好的解释:我从数据库中获取它为“07-01-14”,在它上面放一个 strtotime,当我用 date("dmy", $res) 再次对其进行 var_dump 它显示作为 14-01-07
  • 5.5.3。当我使用您的代码 sn-p 时,它再次给了我 14-01-07 结果。我会更新我的帖子以包含整个文档,也许这会有所帮助。
【解决方案3】:

我认为你需要修复你的状况。

如果要检查 $res 是否超过两天,则必须将 limit 与当前时间进行比较,而不是 $res。

$res = strtotime($row['ReserveringsID']);
$limit = strtotime('+2 days', $res);

if($limit < time()) {
    echo "2 days have passed";
} else {
    echo "2 days have not yet passed";
}

【讨论】:

    【解决方案4】:

    试试这个

    $res = strtotime($row['ReserveringsID']);
    $limit = strtotime($row['ReserveringsID']) + strtotime("+2 day", $res);
    var_dump($res); var_dump($limit);
    if($limit > $res) {
        echo "2 days have passed";
    } else {
        echo "2 days have not yet passed";
    }
    

    【讨论】:

    • 有什么不同?
    猜你喜欢
    • 2022-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多