0

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

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

我将所有这些信息按原样存储在我的数据库中(即所有存储时间都基于用户的时区)。

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

我使用DateTime()了函数

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

我的PHP代码如下;您也可以在CodePad上找到它

$end_time = 'Fri, 22 Jun 2012 03:46:22 AM';
$tz = 'America/Denver';
dateDifference($end_time,$tz);

function dateDifference($end, $tz = NULL)
    {
      $owner_tz = new DateTimeZone($tz);
      //var_dump($owner_tz->getName()); 

      $from  = new DateTime("now", new DateTimeZone('GMT'));     
      $from ->setTimeZone($owner_tz);

      $to = new DateTime($end,new DateTimeZone('GMT'));
      /* @Note:I have commented below setTimeZone() because I have already stored 
       * `end time` as per user's  timezone, So I dont need to convert it again 
       * into user's timezone.you can un-comment below line. 
       * it doesn't affect the results anyways.
       */
     //$to ->setTimeZone($owner_tz);        

    //procedural style using date_diff()
    $interval = date_diff($from, $to);        
    var_dump($interval); 

    // OO style using dateTime::diff()
    $interval = $from->diff($to);       
    var_dump($interval);     
}

回报:

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

参考:

4

2 回答 2

1

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

$to = new DateTime($end, new DateTimeZone('GMT'));

然后您打算将其转换为美国/丹佛时间,但由于您使用 GMT 时区创建日期,所以无论如何这都是错误的。

// $to ->setTimeZone($owner_tz);

这将使用用户时区创建结束日期,这可能是您正在寻找的:

$to = new DateTime($end, $owner_tz);
于 2012-06-21T12:41:05.400 回答
0

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

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

date_default_timezone_set('America/Los_Angeles');

然后我使用以下查询从 phpmyadmin检查MySQL 服务器的当前时间和时区

SELECT NOW(), SYSDATE(), @@global.time_zone , @@session.time_zone , 
      TIMEDIFF( NOW( ) , CONVERT_TZ( NOW( ) , @@session.time_zone ,  '+00:00' )) 
      AS OFFSET

这将返回OFFSET+05:30

解决步骤:

  • 首先,我将 mySQL Server 的时区更改为GMT/UTC +00:00(我在 mySQL Server 上拥有超级特权)

    SET GLOBAL time_zone = '+00:00';  
    
  • start_date = NOW()我们使用(列数据类型:)DATETIME保存日期和时间

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

第一种方法(使用 PHP DateTime

 /*
   * 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;

第二种方法(使用 MySQL UNIX_TIMESTAMP

#$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;
                  

注意:不要更改start_date 为时间戳strtotime()。它将返回与UNIX_TIMESTAMP() ie不同的值

 strtotime($row['start_date']) !== $row['sTimestamp']
于 2012-06-30T04:35:16.653 回答