phpは日時をUTCに変換します


90

ライブラリを使用せずに、日付のタイムスタンプを(サーバーが存在するタイムゾーンから)UTCに変換する簡単な方法が必要です。

回答:


30

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 />");

注:タイムゾーンを元に戻す必要がある場合もあります


55
gmdateデフォルトのタイムゾーンをUTCに変更する代わりに、を使用する必要があります。gmdate自動的にUTCを使用するため。
2010年

29
-1は、このためのグローバルなデフォルトのタイムゾーンを変更したくないためです。意図しない副作用を要求するだけです。
ワードベッカー2010

@Phillここで「sz」とは何ですか?
Shahid Karimi 2015

2
「Yd-mTG ...」ではなく「Ym-dTG ...」にする必要があると思います
Alex Angelico

Laravelプロジェクトでは機能しません。その同じ日付を返します
Dharmender Tuli 2018年

109

strtotimeを使用して、指定された文字列(現地時間として解釈されます)からタイムスタンプを生成し、gmdateを使用してフォーマットされたUTC日付として取得します。

リクエストに応じて、簡単な例を次に示します。

echo gmdate('d.m.Y H:i', strtotime('2012-06-28 23:55'));

7
小さな例かもしれませんか?
cherouvim 2012年

2
@cherouvim必要だとは思わないが、とにかく追加した…お役に立てば幸い。
2012年

5
gmdate()は、ずっと前に偶然見つけたかったPHP関数の1つです。nl2br、誰か?
チャーリーシュリーサー2013年

1
GMTとUTCは常に同じであるとは限りません。
ジェイシェス2013年

1
@poke GMTは夏時間を尊重しますが、UTCは夏時間を尊重しません。そのため、他に何も考慮に入れる必要はありません
Necro

72

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

質問は、タイムスタンプをタイムスタンプに変換することを示していますが、DateTimeはタイムスタンプを入力として受け入れません。なんらかの方法で文字列に変換してから、元に戻す必要があります。
felwithe


14

この形式の日付が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

ご覧のとおり、夏時間の問題も処理します。

それを解決するための少し奇妙な方法.... :)


OPがあなたの提案を選ばなかった理由を本当に理解していません:D
php_nub_qq 2014年

@php_nub_qqは、スクリプト全体のタイムゾーンを変更することで機能するためと考えられます。これは望ましくない場合があり、意図しない結果をもたらす可能性があります。
felwithe

@felwithe最初の行をスキップしても、デモ用です
php_nub_qq

11

ローカルタイムゾーン文字列を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:
    $ datetime = "2016-02-01 00:00:01"、$ output = "2016-01-31 11:00:01"の場合、UTC + 13:00 ;
    $ 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";

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


5

PHP 5.2.0以降で使用可能になっているPHPのDateTimeクラスを使用してもかまわない場合は、状況に適したシナリオがいくつかあります。

  1. あなたが持っている場合は$givenDt、あなたがUTCに変換することをDateTimeオブジェクトを、これはUTCに変換します。

    $givenDt->setTimezone(new DateTimeZone('UTC'));
    
  2. $givenDt後でオリジナルが必要な場合は、複製されたオブジェクトを変換する前に、指定されたDateTimeオブジェクトを複製することもできます。

    $utcDt = clone $givenDt;
    $utcDt->setTimezone(new DateTimeZone('UTC'));
    
  3. たとえば$givenStr = '2018-12-17 10:47:12'、日時文字列しかない場合は、最初に日時オブジェクトを作成してから変換します。これは、$givenStrがPHPの構成済みタイムゾーンにあることを前提としていることに注意してください。

    $utcDt = (new DateTime($givenStr))->setTimezone(new DateTimeZone('UTC'));
    
  4. 指定された日時文字列がPHP構成のタイムゾーンとは異なるタイムゾーンにある場合は、正しいタイムゾーンを指定して日時オブジェクトを作成します(PHPがサポートするタイムゾーンリストを参照)。この例では、アムステルダムのローカルタイムゾーンを想定しています。

    $givenDt = new DateTime($givenStr, new DateTimeZone('Europe/Amsterdam'));
    $givenDt->setTimezone(new DateTimeZone('UTC'));
    

4

strtotimeが特定の入力フォーマットを必要とし、日時:: 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);

4

私は時々この方法を使用します:

// 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"));

作品のすべての MOSTの時間。


3
ここに2つの問題があります。まず、減算するのではなく、オフセットを追加する必要があります。次に、ローカルタイムゾーンが現在DSTにあり、目的の日付がDSTにない場合、これは機能しません。オフセットは1時間ずれます。またはその逆。そうです、これはほとんどの場合機能しますが、常に機能するとは限りません。
ajon 2013



0

試してみてください

echo date( 'F d Y'、strtotime( '2010-01-19 00:00:00'));

出力します:

2010年1月19日

他の出力を表示するには、フォーマット時間を変更する必要があります


0

任意のタイムゾーンから他のタイムゾーンにタイムスタンプをフォーマットするための汎用正規化関数。さまざまなタイムゾーンのユーザーの日時スタンプをリレーショナルデータベースに保存するのに非常に便利です。データベース比較の場合、タイムスタンプを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"

0

または、これを試すこともできます。

<?php echo (new DateTime("now", new DateTimeZone('Asia/Singapore')))->format("Y-m-d H:i:s e"); ?>

これは出力します:

2017-10-2517:13:20アジア/シンガポール

読み取り専用の日付のみを表示する場合は、テキスト入力ボックスのvalue属性内でこれを使用できます。

地域/国を表示したくない場合は、「e」を削除してください。


0

取得するには、次の手順に従いUTC時間任意の時間帯、ユーザーのローカルシステムに設定し(これはUTCに異なるタイムゾーンを保存するには、Webアプリケーションのために必要となります)。

  1. Javascript(クライアント側):

    var dateVar = new Date();
    var offset = dateVar.getTimezoneOffset();
    //getTimezoneOffset - returns the timezone difference between UTC and Local Time
    document.cookie = "offset="+offset;
    
  2. 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)
    

-1

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"; 
?>

2
Philの回答がどのように改善されるを説明するために、回答を編集する必要があります。コードで何を変更しましたか?また、なぜそれが優れているのですか?
コーディグレイ

デフォルトのPHPタイムゾーンを変更して2つのタイムスタンプを変換することは機能するハックですが、洗練されたソリューションではありません。
コプロラル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.