PHP mySQL-UNIX_时间戳不等于strotime

PHP mySQL-UNIX_时间戳不等于strotime,php,mysql,datetime,Php,Mysql,Datetime,平台: PHP和mySQL 我将日期+时间以以下格式存储在数据库中:date(“Y-m-dh:I:s”)。我在数据库中的一个值示例是:2010-01-05 07:36:33。在我的脚本中,我将时区设置为date\u default\u timezone\u set(“美国/芝加哥”) 问题: 我在某个地方读到了关于UNIX\u时间戳的信息,并在查询中使用了它。来自DB的日期值上的UNIX_时间戳的值似乎与strotime(DB日期值)不同 示例: 假设my DB中日期列的一个DB值为2010-0

平台: PHP和mySQL

我将日期+时间以以下格式存储在数据库中:date(“Y-m-dh:I:s”)。我在数据库中的一个值示例是:2010-01-05 07:36:33。在我的脚本中,我将时区设置为
date\u default\u timezone\u set(“美国/芝加哥”)

问题:

我在某个地方读到了关于UNIX\u时间戳的信息,并在查询中使用了它。来自DB的日期值上的UNIX_时间戳的值似乎与strotime(DB日期值)不同

示例:

假设my DB中日期列的一个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
为了在我的应用程序中进行进一步计算,我需要使用strotime(date)。我有很多这样的比较。如果UNIX_时间戳(date)与strotime(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 ");
$gap=1;//时间(分钟)
$tm2=日期(“Y-m-d H:i:s”)、mktime(日期(“H”)、日期(“i”)-$gap、日期(“s”)、日期(“m”)、日期(“d”)、日期(“Y”);
$target=strottime($tm2);
$result2=mysql\u query(“更新表2 SET stat=0,其中UNIX\u时间戳(今天登录时间)<$target”);
上面给出的结果不正确。如果我在上面的查询中尝试用strotime替换UNIX_TIMESTAMP,它会给我一个错误,因为strotime函数似乎是PHP函数,而不是相应的mySQL函数。strotime是否有相应的mySQL函数?如何解决上述问题非常感谢解决上述问题的代码


提前谢谢。

可能MySQL服务器和php实例的时区不同。 e、 g

echo日期('Y-m-dh:i:st',1262657193)

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



对于where查询,您不需要将sql时间戳转换为unix。只需使用DATE_格式,事情就会简单得多:

 WHERE DATE_FORMAT(`today_login_time`, "%Y-%m-%d") < '.date('Y-m-d', $my_tsp)
WHERE DATE\u格式('today\u login\u time',%Y-%m-%d)<'.DATE('Y-m-d',$my\u tsp)

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

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


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

我确实将时区设置为date\u default\u timezone\u set(“美国/芝加哥”)。那我现在怎么解决这个问题呢?谢谢你。通过为MySQL服务器设置相同的时区,可以全局设置(例如在其.ini文件中),也可以按会话设置(
SET time\u zone='America/Chicago'
)。您也可以通过使用MySQL的UTC_TIMESTAMP()或简单地通过unix_TIMESTAMP()发送unix时间戳来始终还原到UTC时区,请参阅“感谢”以获取信息。那么,我是否只需要使用设置的时区class='America/Chicago';在脚本的顶部,使这项工作?够了吗?我不确定网络主机是否会给我.ini文件进行调整。所以,如果这是我可以通过脚本编码来管理的东西,那就太好了。请让我知道。谢谢。是的,您必须通过mysql\u query()将
设置时区…
语句发送到mysql服务器。如果这真的是你最好的选择,我不知道。这是一个MySQL语句,而不是php构造<代码>mysql查询(“设置时区='America/Chicago'”)是,日期\默认\时区\设置(“美国/芝加哥”)是我脚本中的时区。我现在怎么解决它?谢谢。谢谢你的评论,拉里。我只是想指出我的一个担忧,以及为什么我使用datetime来存储我的日期和时间。以下是mysql参考的摘录:“时间戳数据类型的范围为'1970-01-01 00:00:01'UTC到'2038-01-19 03:14:07'UTC”。我们已经到了2010年,也就是说距离最大值只有28年了,如果使用时间戳,在这之后,我预计会出现不可预测的值。所以我想避免它,而是用datetime来解决它。现在有什么办法可以解决吗?(我在脚本中使用默认时区集(“美国/芝加哥”),谢谢您的评论。$my_tsp到底是什么?如何在代码中实现您的解决方案?我不明白您的查询在做什么。但是$my_tsp可以是任何日期格式为YYYY-MM-DD的字符串。我正在尝试将stat更新为0,以防数据库中的datetime超过1分钟。因此,我计算当前时间,从中减去1分钟(我们称之为$target),并尝试检查是否存在值小于$target的datetime。这有意义吗?我需要确保差异精确计算到最后一秒,那么我将如何修改您的解决方案?请让我知道。非常感谢。