【问题标题】:PHP mySQL - UNIX_TIMESTAMP is not equal to strtotimePHP mySQL - UNIX_TIMESTAMP 不等于 strtotime
【发布时间】:2011-01-01 16:10:26
【问题描述】:

平台: PHP & mySQL

我以以下格式将日期+时间存储在数据库中:日期(“Y-m-d H:i:s”)。我的数据库中的一个值的示例是:2010-01-05 07:36:33。在我的脚本中,我将时区设置为date_default_timezone_set("America/Chicago");

问题:

我在某处读到了 UNIX_TIMESTAMP,并在查询中使用了它。 UNIX_TIMESTAMP 对来自数据库的日期值的值,似乎与 strotime(DB 日期值) 不同。

示例:

考虑到我的数据库中日期列的数据库值之一是 2010-01-05 07:36:33 现在,如果我通过以下方式获取此日期:

$result = mysql_query("SELECT date, UNIX_TIMESTAMP(date) AS ut_date FROM table");
$row = mysql_fetch_row($result);

//The result of this is:
$row['date']    = 2010-01-05 07:36:33
$row['ut_date'] = 1262657193
strtotime($row['date']) gives 1262698593

对于我的应用程序中的进一步计算,我需要使用 strtotime(date)。我有很多比较可以这样做。如果 UNIX_TIMESTAMP(date) 与 strtotime(date) 相同,我的问题就会解决。我需要使用的示例查询之一是:

$gap = 1; // time in minutes
$tm2 = date ("Y-m-d H:i:s", mktime (date("H"),date("i")-$gap,date("s"),date("m"),date("d"),date("Y")));
$target = strtotime($tm2);

$result2 = mysql_query("UPDATE table2 SET stat = 0 WHERE UNIX_TIMESTAMP(today_login_time) < $target ");

以上给出了不正确的结果。如果我尝试在上述查询中用 strtotime 替换 UNIX_TIMESTAMP,它会给我一个错误,因为函数 strtotime 似乎是 PHP 函数而不是相应的 mySQL 函数。 strtotime 是否有相应的 mySQL 函数?我该如何解决上述问题? 解决上述问题的代码非常感谢。

提前谢谢你。

【问题讨论】:

    标签: php mysql datetime


    【解决方案1】:

    可能您的 MySQL 服务器和您的 php 实例的时区不同。 例如

    echo date('Y-m-d H:i:s T', 1262657193);

    在我的机器上打印 2010-01-05 03:06:33 CET(注意 CET 时区,即 UTC+1),而您的 MySQL 服务器解释与 2010-01-05 07:36:33 相同的 unix 时间戳

    http://dev.mysql.com/doc/refman/5.1/en/time-zone-support.html
    http://docs.php.net/datetime.configuration#ini.date.timezone

    【讨论】:

    • 我确实将时区设置为 date_default_timezone_set("America/Chicago")。那么我现在该如何解决呢?谢谢。
    • 例如通过为 MySQL 服务器设置相同的时区,无论是全局(例如在其 .ini 文件中)还是基于每个会话(SET time_zone='America/Chicago' 应该可以工作)。您也可以随时使用 MySQL 的 UTC_TIMESTAMP() 或简单地通过 UNIX_TIMESTAMP() 发送 unix 时间戳来恢复到 UTC 时区,请参阅dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html
    • 感谢您的信息。所以我只是使用 SET time_zone='America/Chicago';在脚本的顶部使这项工作?这样就够了吗?我不确定网络主机是否会给我 .ini 文件进行调整。因此,如果这是我可以通过脚本编码来管理的事情,那就太好了。请告诉我。谢谢。
    • 是的,您必须通过 mysql_query() 将 SET time_zone... 语句发送到 MySQL 服务器。如果这真的是你最好的选择,我不知道。
    • 这是一个 MySQL 语句,而不是一个 php 结构。 mysql_query("SET time_zone='America/Chicago'");
    【解决方案2】:

    对于 where 查询,您不需要将 sql 时间戳转换为 unix。只需使用 DATE_FORMAT 它会使事情变得更简单:

     WHERE DATE_FORMAT(`today_login_time`, "%Y-%m-%d") < '.date('Y-m-d', $my_tsp)
    

    【讨论】:

    • 感谢您的评论。 $my_tsp 到底是什么?如何在我的代码中实现您的解决方案?
    • 好吧,我不明白您的查询在做什么。但 $my_tsp 可以是任何日期格式为 YYYY-MM-DD 的字符串。
    • 我正在尝试将统计信息更新为 0,以防数据库中的日期时间超过 1 分钟。所以我正在计算当前时间,从中减去 1 分钟(我们称之为 $target)并尝试检查是否存在任何值小于 $target 的日期时间。那有意义吗?我需要确保准确计算到最后一秒的差异,那么我将如何修改您的解决方案呢?请告诉我。谢谢。
    【解决方案3】:

    由于时差正好是 11.5 小时,因此您似乎遇到了时区问题。

    【讨论】:

    • 是的,date_default_timezone_set("America/Chicago") 是我脚本中的时区。我现在该如何解决?谢谢。
    【解决方案4】:

    格式 date("Y-m-d H:i:s") 不能准确描述日期和时间,因为它不包含时区。由于没有提供时区,因此 Web 服务器和数据库都使用明显不同的时区。

    您应该考虑将数据库中的日期存储为 unix 时间戳。 unix 时间戳只是自 Unix 纪元(格林威治标准时间 1970 年 1 月 1 日 00:00:00)以来经过的秒数。这不受时区或夏令时的影响。这样,在转换为实际日历日期和时间时,您只需担心时区和夏令时。

    【讨论】:

    • 感谢拉里的评论。只是想指出我的一个担忧,以及为什么我使用 datetime 来存储我的日期和时间。这是 mysql 参考的摘录:“TIMESTAMP 数据类型的范围为 '1970-01-01 00:00:01' UTC 到 '2038-01-19 03:14:07' UTC”。我们已经在 2010 年,即距离该范围的最大值仅 28 年,在此之后,如果使用时间戳,我预计会出现不可预测的值。所以我想避免它并使用 datetime 来解决它。现在有什么办法可以解决吗? (我在我的脚本中使用 default_timezone_set("America/Chicago"))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多