72

MySQL データベースの日時を PHP で iso 8601 形式の文字列として表示しようとしていますが、うまくいきません。

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

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

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

$post[3] is the datetime (CURRENT_TIMESTAMP)私のMySQLデータベースから。

何がうまくいかないのですか?

4

6 に答える 6

93

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

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

<?= date("c", strtotime($post[3])) ?>
于 2009-05-24T06:15:50.127 に答える
41

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');
于 2013-01-29T19:48:06.013 に答える
20

手続き型 :

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
于 2016-02-20T13:19:55.337 に答える
8

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));
}
于 2010-11-04T14:02:27.363 に答える
8

PHP 5 より前の場合:

function iso8601($time=false) {
    if(!$time) $time=time();
    return date("Y-m-d", $time) . 'T' . date("H:i:s", $time) .'+00:00';
}
于 2010-04-08T14:32:18.377 に答える
7

問題は、多くの場合、 4 または 8の最終段階にあるミリ秒と最終のマイクロ秒で何度も発生します。DATE を ISO 8601 "date(DATE_ISO8601)"に変換するには、これらは私にとって有効なソリューションの 1 つです。

// In this form it leaves the date as it is without taking the current date as a reference
$dt = new DateTime();
echo $dt->format('Y-m-d\TH:i:s.').substr($dt->format('u'),0,3).'Z';
// return-> 2020-05-14T13:35:55.191Z

// In this form it takes the reference of the current date
echo date('Y-m-d\TH:i:s'.substr((string)microtime(), 1, 4).'\Z');
return-> 2020-05-14T13:35:55.191Z

// Various examples:
$date_in = '2020-05-25 22:12 03.056';
$dt = new DateTime($date_in);
echo $dt->format('Y-m-d\TH:i:s.').substr($dt->format('u'),0,3).'Z';
// return-> 2020-05-25T22:12:03.056Z

//In this form it takes the reference of the current date
echo date('Y-m-d\TH:i:s'.substr((string)microtime(), 1, 4).'\Z',strtotime($date_in));
// return-> 2020-05-25T14:22:05.188Z
于 2020-05-14T11:53:06.733 に答える