【问题标题】:Adding time in PHP在 PHP 中添加时间
【发布时间】:2010-11-30 05:22:06
【问题描述】:

我正在从 mysql 数据库中提取日期时间,我想将 X 小时添加到它,然后将其与当前时间进行比较。到目前为止我得到了

$dateNow = strtotime(date('Y-m-d H:i:s'));
$dbTime = strtotime($row[0]);

然后我尝试了 $dbTime + strtotime("4 hours");但是 4 小时似乎在当前时间上增加了 4 小时,而不是原始的 4 小时。如何将 X 小时添加到 dbTime?

注意:我使用的是 php 5.1.2,所以 date_add 不起作用 (5.3.0)

【问题讨论】:

    标签: php mysql datetime time compare


    【解决方案1】:

    然后我尝试了 $dbTime + strtotime("4 hours");但是 4 小时似乎在当前时间上增加了 4 小时,而不是原始的 4 小时。如何将 X 小时添加到 dbTime?

    strtotime 有一个可选的第二个参数。在那里提供一个 Unix 时间戳,输出将相对于该日期而不是当前日期。

    $newTime = strtotime('+4 hours', $dbTime);
    

    您还可以使用 Unix 时间戳是基于秒的这一事实 - 如果您知道四小时是以秒为单位的,您可以将其添加到时间整数值中。

    【讨论】:

    • 不要只为 unixtime 添加秒数!这是进行所有时间/日期操作的滑坡的开始,并且非常难以维护和保持调试,特别是考虑时区和夏令时。有一些库函数可以纠正所有困难的角落和边缘情况。
    • 只需要在 unixtime 上增加几秒钟!显然,这就是它的目的。
    • @staticsan,在 unix 时间戳上添加秒数是完全可以接受的。它是自纪元日期以来的秒数度量,没有多少时区更改或夏令时会影响它。 TZ 和 DST 会影响人类可读的版本,但时间戳不受影响。
    • 这取决于原始时间戳的上下文以及为什么将其与“现在”进行比较,我们都没有。如果它是 X 小时的直接转换并且该转换在算法中是有意义的,那么只需在 unix 时间戳中添加秒数就有意义了。不幸的是,我看到太多的代码这样做了,即使它没有意义或不清楚并且不得不修复由此产生的错误。
    • 如果你想知道不同时区的当前时间,那么不,你永远不应该加/减秒。如果您想找出 4 小时后的时间,那么时间戳算法是完美的解决方案。
    【解决方案2】:

    你有很多选择:

    1.

    $result = mysql_query("SELECT myDate FROM table");
    $myDate = mysql_result($result, 0);
    $fourHoursAhead = strtotime("+4 hours", strtotime($myDate));
    

    2.

    // same first two lines from above
    $fourHoursAhead = strtotime($myDate) + 4 * 60 * 60;
    

    3.

    $result = mysql_query("SELECT UNIX_TIMESTAMP(myDate) FROM table");
    $myDate = mysql_result($result, 0);
    $fourHoursAhead = $myDate + 4 * 60 * 60;
    

    4.

    $fourHoursAhead = strtotime("+4 hours", $myDate);
    

    5.

    $result = mysql_query("SELECT UNIX_TIMESTAMP(DATE_ADD(myDate, INTERVAL 4 HOUR))");
    $fourHoursAhead = mysql_result($result, 0);
    

    【讨论】:

    • 如果我可以对您的部分问题投反对票,我会的。 #2 是您可以发布的最糟糕的解决方案。
    • 真的吗?我会认为#1是最糟糕的。作为记录,我个人可能会使用 #3 或 #5,这取决于我对构建 SQL 查询的控制程度。
    • 查看 cmets 到 ceejayoz 的回答,了解我为什么这么认为。
    【解决方案3】:

    time() 和 strtotime() 以秒为单位生成 unix 时间戳,因此您可以执行以下操作,提供您的数据库并进行比较:

    $fourHours = 60 * 60 * 4;
    $futureTime = time() + $fourHours;
    

    【讨论】:

      【解决方案4】:

      strtotime("+4 小时", $dbTime);

      第二个参数是时间戳,用作计算相对日期的基础;它默认为当前时间。查看documentation

      编辑: 在很短的时间内,最多 1 周,在时间戳中添加秒是完全可以接受的。一周总有 (7 * 24 * 3600) 秒;一个月或一年都不能这么说。此外,unix 时间戳只是自 Unix 纪元(格林威治标准时间 1970 年 1 月 1 日 00:00:00)以来经过的秒数。这不受时区或夏令时的影响。时区和夏令时仅在将 unix 时间戳转换为实际日历日期和时间时才重要。

      【讨论】:

      【解决方案5】:

      我倾向于使用 time() 函数,手册中的这个页面显示他们显示未来一周的日期: http://us3.php.net/manual/en/function.time.php

      【讨论】:

        【解决方案6】:

        我会这样做:

        1. 使用UNIX_TIMESTAMP()函数从数据库中提取时间。

        2. UNIX 时间戳以秒为单位,因此添加4*60*60

        3. 使用 PHP 的 localtime()strftime() 函数将修改后的 UNIX 时间戳转换为日期。

          query("SELECT UNIX_TIMESTAMP(someDatetimeColumn) ...");
          . . .
          $dbTimeAdjusted = localtime($row[0] + 4*60*60);
          

        【讨论】:

          【解决方案7】:

          进行比较的最安全方法可能是在 SQL 中

          SELECT * FROM my_table WHERE someDateTimeColumn < DATE_ADD(NOW(), INTERVAL 4 hour)
          

          由于您是在 PHP 中组装它,因此您可以用您的代码需要比较的任何内容动态替换“4 小时”位。

          (注意:将整个计算放在与列进行比较的另一侧允许 MySQL 对每个查询进行一次计算,而不是每行一次,并且还使用表的索引,如果该列有一个。)

          【讨论】:

            【解决方案8】:

            假设数据库返回的时间戳是 SQL 格式,以下应该可以正常工作:

            $dbTime = strtotime($row[0]);
            $nowTime = time();
            
            $future_dbTime = strtotime("+4 hours", $dbTime);
            
            $diff_time_seconds = $nowTime - $dbTime;
            
            if ($diff_time_seconds > 0) {
                   echo "The current time is greater than the database time by:\n";
                   $not_equal = true;
            
                }
            if ($diff_time_seconds == 0) {
                   echo "The current time is equal to the database time!";
                }
            if ($diff_time_seconds < 0) {
                   echo "The current time is less than the database time by:\n";
                   $not_equal = true;
                }
            
            if ($not_equal) {
            $diff_time_abs_seconds = abs($diff_time_seconds);
            echo date('h:m:s', $diff_time_abs_seconds);
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-11-01
              • 1970-01-01
              相关资源
              最近更新 更多