web-dev-qa-db-ja.com

PHPでISO 8601形式として日付を表示する方法

MySQLデータベースの日付時刻を、PHPのISO 8601形式の文字列として表示しようとしていますが、間違っています。

2008年10月17日は1969-12-31T18:33:28-06:00として公開されますが、これは明らかに正しくありません(1969年ではなく2008年である必要があります)

これは私が使用しているコードです:

_<?= date("c", $post[3]) ?>
_

MySQLデータベースの$post[3] is the datetime (CURRENT_TIMESTAMP).

何が間違っているのでしょうか?

55

date の2番目の引数は、データベースのタイムスタンプ文字列ではなく、UNIXタイムスタンプです。

strtotime でデータベースのタイムスタンプを変換する必要があります。

<?= date("c", strtotime($post[3])) ?>
71

PHPバージョン5.2で利用可能な DateTimeクラス を使用すると、次のようになります。

$datetime = new DateTime('17 Oct 2008');
echo $datetime->format('c');

アクションで見る

PHP 5.4の時点で、これをワンライナーとして実行できます。

echo (new DateTime('17 Oct 2008'))->format('c');
30
John Conde

手続き型:

echo date_format(date_create('17 Oct 2008'), 'c');
// Output : 2008-10-17T00:00:00+02:00

オブジェクト指向スタイル:

$formatteddate = new DateTime('17 Oct 2008');
echo $datetime->format('c');
// Output : 2008-10-17T00:00:00+02:00

ハイブリッド1:

echo date_format(new DateTime('17 Oct 2008'), 'c');
// Output : 2008-10-17T00:00:00+02:00

ハイブリッド2:

echo date_create('17 Oct 2008')->format('c');
// Output : 2008-10-17T00:00:00+02:00

ノート :

1)'Y-m-d\TH:i:sP'の代わりに'c'をフォーマットに使用することもできます。

2)入力のデフォルトのタイムゾーンは、サーバーのタイムゾーンです。入力を別のタイムゾーン用にしたい場合は、タイムゾーンを明示的に設定する必要があります。ただし、これは出力にも影響します。

echo date_format(date_create('17 Oct 2008 +0800'), 'c');
// Output : 2008-10-17T00:00:00+08:00

3)入力とは異なるタイムゾーンの出力にする場合は、タイムゾーンを明示的に設定できます。

echo date_format(date_create('17 Oct 2008')->setTimezone(new DateTimeZone('America/New_York')), 'c');
// Output : 2008-10-16T18:00:00-04:00
13
John Slegers

Pre PHP 5:

function iso8601($time=false) {
    if(!$time) $time=time();
    return date("Y-m-d", $time) . 'T' . date("H:i:s", $time) .'+00:00';
}
8
Newmania

Pre PHP 5:最後にGMTの違いを追加しましたが、ハードコードされていません。

function iso8601($time=false) {
    if ($time === false) $time = time();
    $date = date('Y-m-d\TH:i:sO', $time);
    return (substr($date, 0, strlen($date)-2).':'.substr($date, -2));
}
7
Guillaume