php和mysql日期时间差

php和mysql日期时间差,php,mysql,datetime,Php,Mysql,Datetime,我在php中这样做是为了在mysql datetime列中存储上次登录 date('Y-m-d h:i:s') //which then gave > '2014-01-04 08:00:56' 然后保存了它 当我需要计算在线时间超过20分钟的用户时,我是在mysql中这样做的 SELECT * FROM `elc_users` WHERE TIMESTAMPDIFF( MINUTE , lastlogin, NOW( ) ) <20 这给出了2014-01-05 18:53:

我在php中这样做是为了在mysql datetime列中存储上次登录

date('Y-m-d h:i:s') //which then gave > '2014-01-04 08:00:56'
然后保存了它

当我需要计算在线时间超过20分钟的用户时,我是在mysql中这样做的

SELECT * FROM `elc_users`  WHERE TIMESTAMPDIFF( MINUTE , lastlogin, NOW( ) ) <20
这给出了
2014-01-05 18:53:53

现在我还执行下面的代码来检查全局和会话时区,得到了phpMyAdmin

SELECT created, NOW( )  `elc_users`
mysql> SELECT @@global.time_zone, @@session.time_zone;

然后给出了
SYSTEM | SYSTEM

,就像菲利普说的,这可能是一个时区问题;您可以将脚本的时区更改为MySQL设置为的任何时区,如下所示:

date_default_timezone_set('America/Los_Angeles');

为避免此类问题,请检查以下事项

  • 确保数据库服务器和应用程序服务器的
    系统时间
    系统时区
    相同
  • 确保您已将PHP和MySQL的配置设置为使用正确的时区
  • 始终使用单个函数设置更新,插入其中包含
    dateTime
    字段的行。就个人而言,我建议您在代码中的某个地方编写一个通用函数,无论何时需要获取当前时间,都可以使用该函数,而不是使用MySQL的
    NOW()

  • 我不认为这会是一个时区问题,因为PHP和MySQL都运行在同一台机器上,所以调用当前日期时间时,两者将获得相同的时间。也许你可以试试这个,因为我像你说的那样在我的机器上试过

    SELECT * FROM `elc_users` WHERE lastlogin < date_add(NOW(), INTERVAL -20 MINUTE) 
    
    从'elc_users'中选择*,其中lastlogin
    我通过删除日期列并重新创建来解决问题。 现在,它以正确的格式记录了时间

    timestamp
    give
    2014-01-04 20:58:56
    ,和
    NOW()
    give
    2014-01-04 20:58:56

    感谢所有贡献者,这不是@AbdulJabbarWebBestow提到的时区问题


    再次感谢

    可能您的mysql服务器有不同的时区。这是在我的开发机器上,好的,我如何避免这个时区difference@FilipGórny请查看编辑我如何在生产服务器中检测到这一点?或者如果我在php中设置它,它会影响mysql
    select timediff(now(),convert_tz(now(),@@session.time_zone,+00:00')
    应该为您返回mysql时区另一种“黑客”方式是在查询中使用php date,而不是使用mysql NOW()+1来处理时区问题,因为php和mysql都在同一台机器上运行。我不知道这个查询,但我遇到了类似的情况,正如@abduljabbarwebbestow所说的,这不是PHP和xml中的时区差异MySQL@JohnSmith谢谢,您可以通过选择日期添加来检查查询(现在(),间隔-20分钟)因为它将给您当前时间的-20分钟,因此意味着它将给您过去20分钟登录的记录。这些记录登录时间超过20分钟minutes@AbdulJabbarWebBestow为什么时代不同?