web-dev-qa-db-ja.com

PHP DateTimeへのタイムスタンプ

これをstrtotimeに変換する方法、またはDateTimeオブジェクトに渡す同様のタイプの値をどのように変換できるか知っていますか?

私が持っている日付:

Mon, 12 Dec 2011 21:17:52 +0000

私が試したもの:

$time = substr($item->pubDate, -14);
$date = substr($item->pubDate, 0, strlen($time));

$dtm = new DateTime(strtotime($time));
$dtm->setTimezone(new DateTimeZone(ADMIN_TIMEZONE));
$date = $dtm->format('D, M dS');
$time = $dtm->format('g:i a');

上記は正しくありません。多数の異なる日付をループ処理すると、すべて同じ日付になります。

68
JREAM

DateTimeオブジェクトを作成するために文字列をタイムスタンプに変換する必要はありません(実際、そのコンストラクターでは、これを実行することさえできません。日付文字列をそのままDateTimeコンストラクターに渡すことができます。

_// Assuming $item->pubDate is "Mon, 12 Dec 2011 21:17:52 +0000"
$dt = new DateTime($item->pubDate);
_

つまり、文字列の代わりに使用するタイムスタンプがある場合は、 DateTime::setTimestamp() を使用して実行できます。

_$timestamp = strtotime('Mon, 12 Dec 2011 21:17:52 +0000');
$dt = new DateTime();
$dt->setTimestamp($timestamp);
_

編集(2014-05-07):

私は実際にはこのことに気付いていませんでしたが、DateTimeコンストラクターdoesは、タイムスタンプから直接インスタンスを作成することをサポートします。 このドキュメント によると、あなたがする必要があるのは、タイムスタンプの先頭に_@_文字を追加することだけです:

_$timestamp = strtotime('Mon, 12 Dec 2011 21:17:52 +0000');
$dt = new DateTime('@' . $timestamp);
_
126
FtDRbwLXw6

@ drrcknlsn が正しいことを表明しますが、時間文字列をデータ時間に変換する方法は複数ありますが、これらの異なる方法は同じようにタイムゾーンを処理しないことを認識することが重要です。


オプション1:DateTime('@' . $timestamp)

次のコードを検討してください:

_date_format(date_create('@'. strtotime('Mon, 12 Dec 2011 21:17:52 +0800')), 'c');
_

strtotimeビットはタイムゾーン情報を排除し、_date_create_関数はGMT(_Europe/Brussels_)を想定しています。

そのため、実行するサーバーに関係なく、出力は次のようになります。

_2011-12-12T13:17:52+00:00
_

オプション2:date_create()->setTimestamp($timestamp)

次のコードを検討してください:

_date_format(date_create()->setTimestamp(strtotime('Mon, 12 Dec 2011 21:17:52 +0800')), 'c');
_

これにより、同じ出力が生成されることが予想されます。ただし、ベルギーのサーバーからこのコードを実行すると、次の出力が得られます。

_2011-12-12T14:17:52+01:00
_

_date_create_関数とは異なり、setTimestampメソッドは、GMTではなくサーバーのタイムゾーン(私の場合は_'Europe/Brussels'_)を想定しています。


タイムゾーンを明示的に設定する

出力が入力のタイムゾーンと一致することを確認する場合は、明示的に設定するのが最善です。

次のコードを検討してください:

_date_format(date_create('@'. strtotime('Mon, 12 Dec 2011 21:17:52 +0800'))->setTimezone(new DateTimeZone('Asia/Hong_Kong')), 'c')
_

ここで、次のコードも検討してください。

_date_format(date_create()->setTimestamp(strtotime('Mon, 12 Dec 2011 21:17:52 +0800'))->setTimezone(new DateTimeZone('Asia/Hong_Kong')), 'c')
_

出力のタイムゾーンを入力のタイムゾーンと明示的に設定するため、どちらも同じ(正しい)出力を作成します。

_2011-12-12T21:17:52+08:00
_
27
John Slegers

おそらく最も簡単な解決策は次のとおりです。

DateTime::createFromFormat('U', $timeStamp);

「U」はUnixエポックを意味します。ドキュメントを参照してください: http://php.net/manual/en/datetime.createfromformat.php

15
forsberg

それは私の解決策です:

    function changeDateTimezone($date, $from='UTC', $to='Asia/Tehran', $targetFormat="Y-m-d H:i:s")
    {
        $date = new DateTime($date, new DateTimeZone($from));
        $date->setTimeZone(new DateTimeZone($to));
        return $date->format($targetFormat);
    }
0
ingenious