PHPタイムスタンプをDateTimeに


94

これを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');

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

回答:


164

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コンストラクタータイムスタンプから直接インスタンスを作成することをサポートしています。このドキュメントによると、必要なのはタイムスタンプの前に@文字を付けることだけです。

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

これはうまくいきます。私は以前にこれを試しましたが、十分なチャンスを与えていなかったに違いありません!!! ありがとう:))
JREAM 2012

18
タイムゾーンを同じように扱わないことに注意しnew DateTime('@' . $timestamp)$dt = new DateTime(); $dt->setTimestamp($timestamp)ください。詳細については、私の回答@ stackoverflow.com / questions / 12038558 / を参照してください。
John Slegers 2016

43

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


オプション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メソッドは'Europe/Brussels'GMTではなくサーバーのタイムゾーン(私の場合)を想定しています。


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

出力が入力のタイムゾーンと一致することを確認する場合は、明示的に設定することをお勧めします。

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

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

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

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

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


3
このメソッドはタイムゾーンも無視します
Bouke Versteegh 2017

2
@BoukeVersteeghとどちらがそうではありませんか?
forsberg 2017年

2
@BoukeVersteeghこれはUnixタイムスタンプです!、オブジェクトの作成中にタイムゾーンの問題から解放されます。ちょうど使用->setTimezone呼び出す前に、望ましいタイムゾーンを設定する->format()
会計士م

1
@BoukeVersteegh PHPマニュアルの この大きなメモを確認してください。「$ timeパラメーターがUNIXタイムスタンプ(例:@ 946684800)であるか、タイムゾーンを指定している場合(例:2010-01-28T15:00: 00 + 02:00)。 "
会計士م19年

1
Unixのタイムスタンプは、タイムゾーンを持っていない、彼らは、定義により、常にUTCです
the_nuts

0

それは私の解決策です:

    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);
    }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.