web-dev-qa-db-ja.com

PHPでUTC日​​付を現地時間に変換する

以下を使用して、UTC日付をDBに保存しています。

$utc = gmdate("M d Y h:i:s A");

そして、保存したUTC日付をクライアントの現地時間に変換したいと思います。

どうやってやるの?

ありがとう

29
Mark

date()localtime()はどちらも、オーバーライドされない限り、サーバーのローカルタイムゾーンを使用します。 date_default_timezone_set()で使用されるタイムゾーンをオーバーライドできます。

http://www.php.net/manual/en/function.date-default-timezone-set.php

http://us3.php.net/manual/en/function.date.php

http://php.net/manual/en/function.localtime.php

10
Amber

PHPのstrtotime関数は、UTCなどのタイムゾーンコードを解釈します。タイムゾーンコードなしでデータベース/クライアントから日付を取得しても、UTCであることがわかっている場合は、追加できます。

タイムスタンプコード(「Fri Mar 23 2012 22:23:03 GMT-0700(PDT)」などのJavascriptコード""+(new Date())が与えるもの)で日付を取得するとします。

$time = strtotime($dateWithTimeZone);
$dateInLocal = date("Y-m-d H:i:s", $time);

または、MySQLからの可能性が高い場合は、次のようにします。

$time = strtotime($dateInUTC.' UTC');
$dateInLocal = date("Y-m-d H:i:s", $time);
59
webjprgm

回答

UTC日時をアメリカ/デンバーに変換します

_// create a $dt object with the UTC timezone
$dt = new DateTime('2016-12-12 12:12:12', new DateTimeZone('UTC'));

// change the timezone of the object without changing it's time
$dt->setTimezone(new DateTimeZone('America/Denver'));

// format the datetime
$dt->format('Y-m-d H:i:s T');
_

ノート

time()nix timestamp を返します。これは数値であり、タイムゾーンはありません。

date('Y-m-d H:i:s T')は、現在のロケールのタイムゾーンの日付を返します。

gmdate('Y-m-d H:i:s T')は日付をUTCで返します

date_default_timezone_set()は現在のロケールのタイムゾーンを変更します

タイムゾーンの時間を変更するには

_// create a $dt object with the America/Denver timezone
$dt = new DateTime('2016-12-12 12:12:12', new DateTimeZone('America/Denver'));

// change the timezone of the object without changing it's time
$dt->setTimezone(new DateTimeZone('UTC'));

// format the datetime
$dt->format('Y-m-d H:i:s T');
_

ここでは、利用可能なすべてのタイムゾーンを見ることができます

https://en.wikipedia.org/wiki/List_of_tz_database_time_zones

ここにすべての書式設定オプションがあります

http://php.net/manual/en/function.date.php

更新PHPタイムゾーンDB(Linuxの場合)

_Sudo pecl install timezonedb
_
49
Timo Huovinen

異なるタイムゾーンで同じタイムスタンプを表示するだけの場合は、日付演算は不要です。

$format = "M d, Y h:ia";
$timestamp = gmdate($format);

date_default_timezone_set("UTC");
$utc_datetime = date($format, $timestamp);

date_default_timezone_set("America/Guayaquil");
$local_datetime = date($format, $timestamp);
9
fijiaaron

最初に、UTCで日付を取得します-既にそれを行っているので、このステップは実際にはデータベース呼び出しにすぎません:

$timezone = "UTC";
date_default_timezone_set($timezone);

$utc = gmdate("M d Y h:i:s A");
print "UTC: " . date('r', strtotime($utc)) . "\n";

次に、PHPでローカルタイムゾーンを設定します。

$timezone = "America/Guayaquil";
date_default_timezone_set($timezone);

そして、秒単位でオフセットを取得します。

$offset = date('Z', strtotime($utc));
print "offset: $offset \n";

最後に、元の日時の整数タイムスタンプにオフセットを追加します。

print "LOCAL: " . date('r', strtotime($utc) + $offset) . "\n";
6
fijiaaron

ここでスクリプトを共有し、UTCタイムスタンプをインドのタイムスタンプに変換します。

    // create a $utc object with the UTC timezone
    $IST = new DateTime('2016-12-12 12:12:12', new DateTimeZone('UTC'));

    // change the timezone of the object without changing it's time
    $IST->setTimezone(new DateTimeZone('Asia/Kolkata'));

    // format the datetime
   echo $IST->format('Y-m-d H:i:s T');

UTC形式でDBに日付を保存しますが、ローカルタイムゾーンで最終ユーザーに表示します

// retrieve
$d = (new \DateTime($val . ' UTC'))->format('U');
return date("Y-m-d H:i:s", $d);
5
wdog

以下は、質問者のUTC時間を現地時間に変換する直接的な方法です。これは、データベースなどに保存されている時間、つまりany時間です。 UTC時間と関心のある現地時間との時間差を見つけて、保存されたUTC時間に差を加えるだけです。

$df = "G:i:s";  // Use a simple time format to find the difference
$ts1 = strtotime(date($df));   // Timestamp of current local time
$ts2 = strtotime(gmdate($df)); // Timestamp of current UTC time
$ts3 = $ts1-$ts2;              // Their difference

その後、保存されているUTC時間にこの差を追加できます。 (私の場所、アテネでは、違いは正確に5:00:00です)

例:

$time = time() // Or any other timestamp
$time += $ts3  // Add the difference
$dateInLocal = date("Y-m-d H:i:s", $time);
4
Apostolos

「America/Denver」などのローカルタイムゾーンを指定すると、DateTimeクラスを使用してUTCタイムスタンプをローカル日付に変換できます。

$timestamp = *********;
$date = new DateTime("@" . $timestamp);
$date->setTimezone(new DateTimeZone('America/Denver'));
echo $date->format('Y-m-d H:i:s');
1
Henry
$UTC_Time   = "2018-07-06 06:06:16";
echo "UTC Time ".$UTC_Time;
$Indian_Time = TimeConverion($UTC_Time);
echo "<br> Indian_Time ".$Indian_Time;

function TimeConverion($UTC_Time) {
  date_default_timezone_set('Europe/London');
  $sTime = date("Y-m-d h:i:sa");
  $ts3 = strtotime(date("G:i:s"))-strtotime($sTime); 
  $utc = explode(" ",$UTC_Time);
  $time = strtotime($utc[1]);
  date_default_timezone_set("Asia/Calcutta");
  $time += $ts3;  // Add the difference
  return $utc[0]." ".date("H:i:s", $time);
}
0
Senthur Pandi S