Php DateTime::diff()不是';t受时区影响,但始终返回相同的值

Php DateTime::diff()不是';t受时区影响,但始终返回相同的值,php,datetime,timezone,Php,Datetime,Timezone,我正在将基于拍卖的数据添加到我的系统中。例如: user's timezone is : `America/Denver` auction start time is : Thu, 21 Jun 2012 03:46:22 AM auction period : 1 day. auction end time : Fri, 22 Jun 2012 03:46:22 AM 我将所有这些信息按原样存储在数据库中(即,所有存储的时间基于用户的时区) 现在我想要结束时间和当前时间(美国/丹佛时区)之

我正在将基于拍卖的数据添加到我的系统中。例如:

user's timezone  is : `America/Denver`
auction start time is : Thu, 21 Jun 2012 03:46:22 AM
auction period : 1 day.
auction end time : Fri, 22 Jun 2012 03:46:22 AM
我将所有这些信息按原样存储在数据库中(即,所有存储的时间基于用户的时区)

现在我想要结束时间和当前时间(美国/丹佛时区)之间的实际差异

我使用了函数

所以即使我也不转换时区;它返回相同的差异(这也是错误的)

我的PHP代码如下;你也可以在

返回:

object(DateInterval)[4]
  public 'y' => int 0
  public 'm' => int 0
  public 'd' => int 0
  public 'h' => int 16
  public 'i' => int 40
  public 's' => int 24
  public 'invert' => int 0
  public 'days' => int 6015
参考文献:


    • 在以下几行中,您基本上是说结束日期是格林尼治标准时间,而应该是美国/丹佛时间:

      $to = new DateTime($end, new DateTimeZone('GMT'));
      
      然后您打算将其转换为美国/丹佛时间,但由于您使用GMT时区创建了日期,因此无论如何这都是错误的

      // $to ->setTimeZone($owner_tz);
      
      这将使用用户时区创建结束日期,这可能是您正在寻找的:

      $to = new DateTime($end, $owner_tz);
      

      我得到了解决方案,所以我想与大家分享

      实际上,我已经在
      config.inc.php
      文件中设置了默认时区,如下所示

      date\u default\u timezone\u set('America/Los\u Angeles')

      然后我用下面的查询从phpmyadmin检查MySQL服务器的当前时区

      SELECT NOW(), SYSDATE(), @@global.time_zone , @@session.time_zone , 
            TIMEDIFF( NOW( ) , CONVERT_TZ( NOW( ) , @@session.time_zone ,  '+00:00' )) 
            AS OFFSET
      
      这将返回偏移量
      +05:30

      解决步骤:
      • 首先,我将mySQL服务器的时区更改为GMT/UTC+00:00(我在mySQL服务器上拥有super权限)

      • 我们使用
        start\u date=NOW()
        保存日期和时间(列数据类型:
        DATETIME

      现在有两种方法可以根据用户的时区获取日期和时间(
      America/Denver

      第一种方法(使用PHP) 第二种方法(使用MySQL) 注意:不要使用
      strotime()
      开始日期更改为时间戳。它将返回与
      UNIX\u TIMESTAMP()不同的值
      i、 e


      根据用户的时区存储日期/时间信息是一种非常糟糕的做法,如果用户更改了他/她的时区该怎么办?一个好的做法是存储所有的日期/时间信息,而不使用时区(如UTC时间戳),这样您就可以最大限度地减少转换和计算操作的数量,因此在向用户输出日期/时间时只需担心设置正确的时区。我的列数据类型是
      datetime
      ,所以,当我存储数据时,我需要做些什么更改,因为datetime的发布数据将作为用户的时区出现。我不是说你需要更改你的应用程序,这只是一个建议。您是否已将日期\默认\时区\设置放在某个位置以确保您的服务器时间正确?是的,我已在配置文件中进行了设置。但是你的想法真的很好。我以前也有过这种想法,但这里的重点是为什么
      日期差异
      显示错误的结果??不!我已经评论了这句话。我不想更改它,因为在添加拍卖时,结束时间已经按照用户的时区保存。正如我所说的,您打算这样做,但第一行是您犯错误的地方。让我把答案改写一下。没有区别,两者是等价的。您可以检查.so
      newdatetime($end,$owner\utz)=
      newdatetime($end,newdatetimezone('GMT')->setTimeZone($owner_z);
      SELECT NOW(), SYSDATE(), @@global.time_zone , @@session.time_zone , 
            TIMEDIFF( NOW( ) , CONVERT_TZ( NOW( ) , @@session.time_zone ,  '+00:00' )) 
            AS OFFSET
      
      SET GLOBAL time_zone = '+00:00';  
      
       /*
         * first set timezone as GMT.
         * This is MUST because default timezone is differ from user timezone  
        */     
          $gmt = new DateTimeZone('GMT');
          $user_tz = 'America/Denver';
          $st = new DateTime($row[`start_date`], $gmt);
          // now set user timezone
          $st->setTimezone($user_tz );
          $stime = $qt->format('r');
          echo $stime;
      
      #$retrieve data from server in timestamp
      $qry = "SELECT `start_date`,UNIX_TIMESTAMP(`start_date`) AS sTimestamp FROM..."  
      $st = new DateTime('@'.$row['sTimestamp ']);                     
      $stime = $st->format('r');
      echo $stime;
                        
      
       strtotime($row['start_date']) !== $row['sTimestamp']