ライブラリを使用せずに、日付のタイムスタンプを(サーバーが存在するタイムゾーンから)UTCに変換する簡単な方法が必要です。
16 に答える
DateTimeの使用:
$given = new DateTime("2014-12-12 14:18:00");
echo $given->format("Y-m-d H:i:s e") . "\n"; // 2014-12-12 14:18:00 Asia/Bangkok
$given->setTimezone(new DateTimeZone("UTC"));
echo $given->format("Y-m-d H:i:s e") . "\n"; // 2014-12-12 07:18:00 UTC
getTimezoneとsetTimezoneを試してください。例を参照してください
(ただし、これはクラスを使用します)
アップデート:
クラスがなければ、次のようなことを試すことができます。
$the_date = strtotime("2010-01-19 00:00:00");
echo(date_default_timezone_get() . "<br />");
echo(date("Y-d-mTG:i:sz",$the_date) . "<br />");
echo(date_default_timezone_set("UTC") . "<br />");
echo(date("Y-d-mTG:i:sz", $the_date) . "<br />");
注:タイムゾーンを元に戻す必要がある場合もあります
このようにします:
gmdate('Y-m-d H:i:s', $timestamp)
または単に
gmdate('Y-m-d H:i:s')
UTCで「NOW」を取得します。
参照を確認してください:
この形式の日付がYYYY-MM-HHdd:mm:ssの場合、「datetime文字列」の最後にUTCを追加し、strtotimeを使用して変換することで、実際にphpをだますことができます。
date_default_timezone_set('Europe/Stockholm');
print date('Y-m-d H:i:s',strtotime("2009-01-01 12:00"." UTC"))."\n";
print date('Y-m-d H:i:s',strtotime("2009-06-01 12:00"." UTC"))."\n";
これはこれを印刷します:
2009-01-01 13:00:00
2009-06-01 14:00:00
ご覧のとおり、夏時間の問題も処理されます。
それを解決するための少し奇妙な方法....:)
ローカルタイムゾーン文字列をUTC文字列に変換します。
例:ニュージーランドタイムゾーン
$datetime = "2016-02-01 00:00:01";
$given = new DateTime($datetime, new DateTimeZone("Pacific/Auckland"));
$given->setTimezone(new DateTimeZone("UTC"));
$output = $given->format("Y-m-d H:i:s");
echo ($output);
- NZDT:UTC + 13:00
if $ datetime = "2016-02-01 00:00:01"、$ output = "2016-01-31 11:00:01";
$ datetime = "2016-02-29 23:59:59"の場合、$ output = "2016-02-29 10:59:59"; - NZST:UTC + 12:00
if $ datetime = "2016-05-01 00:00:01"、$ output = "2016-04-30 12:00:01";
$ datetime = "2016-05-31 23:59:59"の場合、$ output = "2016-05-31 11:59:59";
PHP 5.2.0以降で使用可能になっているPHPのDateTimeクラスを使用してもかまわない場合は、状況に適したシナリオがいくつかあります。
UTCに変換したいDateTimeオブジェクトがある場合
$givenDt
、これはそれをUTCに変換します。$givenDt->setTimezone(new DateTimeZone('UTC'));
後でオリジナルが必要になった場合
$givenDt
は、複製されたオブジェクトを変換する前に、指定されたDateTimeオブジェクトを複製することもできます。$utcDt = clone $givenDt; $utcDt->setTimezone(new DateTimeZone('UTC'));
たとえば
$givenStr = '2018-12-17 10:47:12'
、日時文字列しかない場合は、最初に日時オブジェクトを作成してから変換します。これは、$givenStr
がPHPの構成済みタイムゾーンにあることを前提としていることに注意してください。$utcDt = (new DateTime($givenStr))->setTimezone(new DateTimeZone('UTC'));
指定された日時文字列がPHP構成のタイムゾーンとは異なるタイムゾーンにある場合は、正しいタイムゾーンを指定して日時オブジェクトを作成します(PHPがサポートするタイムゾーンのリストを参照してください)。この例では、アムステルダムのローカルタイムゾーンを想定しています。
$givenDt = new DateTime($givenStr, new DateTimeZone('Europe/Amsterdam')); $givenDt->setTimezone(new DateTimeZone('UTC'));
strtotimeには特定の入力形式が必要なため、DateTime :: createFromFormatを使用できます(php 5.3+が必要です)
// set timezone to user timezone
date_default_timezone_set($str_user_timezone);
// create date object using any given format
$date = DateTime::createFromFormat($str_user_dateformat, $str_user_datetime);
// convert given datetime to safe format for strtotime
$str_user_datetime = $date->format('Y-m-d H:i:s');
// convert to UTC
$str_UTC_datetime = gmdate($str_server_dateformat, strtotime($str_user_datetime));
// return timezone to server default
date_default_timezone_set($str_server_timezone);
私は時々この方法を使用します:
// It is not importnat what timezone your system is set to.
// Get the UTC offset in seconds:
$offset = date("Z");
// Then subtract if from your original timestamp:
$utc_time = date("Y-m-d H:i:s", strtotime($original_time." -".$offset." Seconds"));
ほとんどの場合に機能します 。
http://php.net/manual/en/function.strtotime.phpまたは、文字列ではなく時間コンポーネントを使用する必要がある場合は、 http: //us.php.net/manual/en/function.mktime。 php
PHP 5以降では、datetime :: format関数を使用できます(ドキュメントhttp://us.php.net/manual/en/datetime.format.phpを参照)
echo strftime( '%e %B %Y' ,
date_create_from_format('Y-d-m G:i:s', '2012-04-05 11:55:21')->format('U')
); // 4 May 2012
試す
echo date('F d Y'、strtotime( '2010-01-19 00:00:00'));
出力します:
2010年1月19日
他の出力を表示するには、フォーマット時間を変更する必要があります
任意のタイムゾーンから他のタイムゾーンに任意のタイムスタンプをフォーマットするための汎用正規化関数。リレーショナルデータベースにさまざまなタイムゾーンのユーザーの日時スタンプを保存するのに非常に便利です。データベース比較の場合、タイムスタンプをUTCとして保存し、gmdate('Y-m-d H:i:s')
/**
* Convert Datetime from any given olsonzone to other.
* @return datetime in user specified format
*/
function datetimeconv($datetime, $from, $to)
{
try {
if ($from['localeFormat'] != 'Y-m-d H:i:s') {
$datetime = DateTime::createFromFormat($from['localeFormat'], $datetime)->format('Y-m-d H:i:s');
}
$datetime = new DateTime($datetime, new DateTimeZone($from['olsonZone']));
$datetime->setTimeZone(new DateTimeZone($to['olsonZone']));
return $datetime->format($to['localeFormat']);
} catch (\Exception $e) {
return null;
}
}
使用法:
$from = ['localeFormat' => "d/m/Y H:i A", 'olsonZone' => 'Asia/Calcutta']; $to = ['localeFormat' => "Y-m-d H:i:s", 'olsonZone' => 'UTC']; datetimeconv("14/05/1986 10:45 PM", $from, $to); // returns "1986-05-14 17:15:00"
Phill Paffordの回答の改善として(私は彼の「Yd-mTG:i:sz」を理解していなかったので、彼はタイムゾーンを元に戻すことを提案しました)。だから私はこれを提案します(プレーン/テキストのHMTL形式を変更することで複雑になりました...):
<?php
header('content-type: text/plain;');
$my_timestamp = strtotime("2010-01-19 00:00:00");
// stores timezone
$my_timezone = date_default_timezone_get();
echo date(DATE_ATOM, $my_timestamp)."\t ($my_timezone date)\n";
// changes timezone
date_default_timezone_set("UTC");
echo date("Y-m-d\TH:i:s\Z", $my_timestamp)."\t\t (ISO8601 UTC date)\n";
echo date("Y-m-d H:i:s", $my_timestamp)."\t\t (your UTC date)\n";
// reverts change
date_default_timezone_set($my_timezone);
echo date(DATE_ATOM, $my_timestamp)."\t ($my_timezone date is back)\n";
?>
または、これを試すことができます。
<?php echo (new DateTime("now", new DateTimeZone('Asia/Singapore')))->format("Y-m-d H:i:s e"); ?>
これは出力します:
2017-10-2517:13:20アジア/シンガポール
読み取り専用の日付のみを表示する場合は、テキスト入力ボックスのvalue属性内でこれを使用できます。
お住まいの地域/国を表示したくない場合は、「e」を削除してください。
次の手順に従って、ユーザーのローカルシステムに設定されている任意のタイムゾーンのUTC時刻を取得します(これは、WebアプリケーションがさまざまなタイムゾーンをUTCに保存するために必要です)。
Javascript(クライアント側):
var dateVar = new Date(); var offset = dateVar.getTimezoneOffset(); //getTimezoneOffset - returns the timezone difference between UTC and Local Time document.cookie = "offset="+offset;
PHP(サーバー側):
public function convert_utc_time($date) { $time_difference = isset($_COOKIE['offset'])?$_COOKIE['offset']:''; if($time_difference != ''){ $time = strtotime($date); $time = $time + ($time_difference*60); //minutes * 60 seconds $date = date("Y-m-d H:i:s", $time); } //on failure of js, default timezone is set as UTC below return $date; } .. .. //in my function $timezone = 'UTC'; $date = $this->convert_utc_time($post_date); //$post_date('Y-m-d H:i:s') echo strtotime($date. ' '. $timezone)