これを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');
上記は正しくありません。多数の異なる日付をループ処理すると、すべて同じ日付になります。
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);
_
@ drrcknlsn が正しいことを表明しますが、時間文字列をデータ時間に変換する方法は複数ありますが、これらの異なる方法は同じようにタイムゾーンを処理しないことを認識することが重要です。
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
_
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
_
おそらく最も簡単な解決策は次のとおりです。
DateTime::createFromFormat('U', $timeStamp);
「U」はUnixエポックを意味します。ドキュメントを参照してください: http://php.net/manual/en/datetime.createfromformat.php
それは私の解決策です:
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);
}