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

これらすべての情報をそのままDBに保存します(つまり、すべての保存時間はユーザーのタイムゾーンに基づいています)。

ここで、終了時刻と現在の時刻(アメリカ/デンバーのタイムゾーン) の実際の差が必要です。

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

次の行では、基本的に、終了日はGMTであるのに対し、アメリカ/デンバー時間である必要があると言っています。

$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サーバーのタイムゾーンをGMT / UTC +00:00に変更しました( mySQLサーバーに特権があります)

    SET GLOBAL time_zone = '+00:00';  
    
  • start_date = NOW()(列データ型:)を使用して日付と時刻を保存しDATETIMEます

現在、ユーザーのタイムゾーンごとに日付と時刻を取得する2つの方法があります(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;

2番目の方法(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 に答える