MySQLのdatetimeに挿入するときのPHPのdate()形式


324

date()結果をMySQL datetimeタイプの列に挿入する場合、PHP の関数に渡す正しい形式は何ですか?

私は試しましたdate("Y-M-D G:i:s")が、毎回「0000-00-00 00:00:00」が挿入されるだけです。


3
これまでにパラメーターを指定していないので、実際に現在の時刻を記録しますか?
Mark Elliot、

回答:


680

問題は、テキスト表現である'M'and を使用していることです'D'。MySQLはフォーマットの数値表現を期待しています2010-02-06 19:30:13

試してみてください:date("Y-m-d H:i:s")同等の数値を使用します。

編集:に切り替えGましたがH、影響はないかもしれませんが、先頭に0が付いた24時間形式を使用することをお勧めします。


28
これは、誰もが必要とする最も一般的な日時形式の1つでなければなりません。ビルトインphpグローバルまたは日付関数自体の一部(たとえば、 'c'、 'r')である必要があります
ビリーノア

33
なぜこれが当てはまらないのか、私にはわかりません。毎回スタックオーバーフローを参照する必要があります。シングル。機能しています。時間。
Mazatec

11
ここに来る方が、このような使用方法をコードで検索するよりも高速です。
MRodrigues 2016年

64
ただ、形式を覚えるためのかわいいニーモニック考える:「Yは、当社メートルの Yのdがないを食べた」。非常に多くのレベルで機能します:)
IzzEps 2017年

2
ISO 8601とRFC 2822の場合と同様に、これにはphpの省略形があるはずです
ビリーノア

105

PHPのdate()マニュアルページのコメントから:

<?php $mysqltime = date ("Y-m-d H:i:s", $phptime); ?>

「Y」は正しかった-通年ですが、「M」は3文字の月、「m」は2桁の月です。「d」の代わりに「D」を使用した同じ問題。「G」は1桁または2桁の時間で、「H」は常に必要なときに先頭に0が付きます。


1
@Pekkaに感謝します。あなたと私がほぼ同じ担当者だったときのことを覚えています。あなたはかなりアクティブでした。
Tim Lytle、2010

1
ええ、私は今たくさん働いています、そしてSOはその間の私のお気に入りの娯楽です:)それは再び変わるでしょう。
Pekka

41

PHPの日付をタイムスタンプとして使用している場合は、PHPでの処理をバイパスし、FROM_UNIXTIME関数を使用してDBが日付を変換できるようにします。

mysql> insert into a_table values(FROM_UNIXTIME(1231634282));
Query OK, 1 row affected (0.00 sec)

mysql> select * from a_table;

+---------------------+
| a_date              |
+---------------------+
| 2009-01-10 18:38:02 |
+---------------------+

これはエレガントなソリューションです。
ありがとう

2
@ trejder、mysqlで行う方がphpで行うよりも速いと誰が言ったのですか?DBは通常ボトルネックであり、できるだけ早く出入りしたいので、PHPでそれを行う方が良いです。
Pacerier、2015年

1
@Pacerier DBは、DBが適切に構築されていない場合、またはより強力で効果的な単一クエリの代わりに多数の小さなクエリを実行している場合、または多くの場合、ORMを使用してデータベースを管理している場合にボトルネックになります。適切にインデックス化されたリレーショナルデータベースを使用したSolid SQLは遅くありません。
mopsyd

2
@ mopsyd、DBはボトルネックです。水平方向にスケーリングするには複雑さが必要ためです。コードを変更せずに世界中で複製できるウェブサーバーと比較してください。
Pacerier

1
クエリが失敗し、どこかにログが記録され、デバッグする必要がある場合、タイムスタンプは、@ tim-lytleで記述されたフォーマット済みの日付文字列よりもはるかに読み取りにくくなります。
humbads

27

次のPHPコードを使用して、MySQL DATETIME列に挿入する変数を作成します。

$datetime = date_create()->format('Y-m-d H:i:s');

これは、サーバーの現在の日付と時刻を保持します。


12
$date_old = '23-5-2016 23:15:23'; 
//Date for database
$date_for_database = date ("Y-m-d H:i:s", strtotime($date_old));

//Format should be like 'Y-m-d H:i:s'`enter code here`

2
このコードは質問に回答する場合がありますが、質問に回答する理由方法に関する追加のコンテキストを提供すると、長期的な価値が大幅に向上します。してください編集いくつかの説明を追加するにはあなたの答えを、そしてあなたの書式設定の問題を修正します。
Toby Speight 2016年


8

PHPでMySQL日時をフォーマットする

$date = "'".date('Y-m-d H:i:s', strtotime(str_replace('-', '/', $_POST['date'])))."'";

8

この関数を使用します(PHP 7)

function getDateForDatabase(string $date): string {
    $timestamp = strtotime($date);
    $date_formated = date('Y-m-d H:i:s', $timestamp);
    return $date_formated;
}

古いバージョンのPHP(PHP <7)

function getDateForDatabase($date) {
    $timestamp = strtotime($date);
    $date_formated = date('Y-m-d H:i:s', $timestamp);
    return $date_formated;
}

最初の行を編集した後で機能したので、私はあなたの回答に投票しました。なぜ型宣言がエラーをスローfunction getDateForDatabase(string $date) : string {するのfunction getDateForDatabase($date) {かについては、PHPには十分な知識がありません。
クリスピンク

「getDateForDatabase()に渡される引数1は文字列のインスタンスでなければなりません、文字列を指定してください」-私の入力は文字列でした
Chris Pink

7

タイムスタンプを使用しない場合は、PHPのdate()メソッドを使用する必要はありません。datepostedが日時列の場合、次のように現在の日付を挿入できます。

$db->query("INSERT INTO table (dateposted) VALUES (now())");

2
このアプローチを共有してくれてありがとう。今まで見た中で最も簡単な方法です。
Shondeslitch 2017年

2

これは私に単純な答えを探して怒ってしまいました。最後に、すべての入力をキャッチし、正しい、または少なくとも有効でチェック可能な適切なSQL文字列を提供するように見えるこの関数を作成しました。それが1999-12-31の場合、それはおそらく間違っていますが、MySQLでは悪いエラーをスローしません。

function MakeSQLDate($date) {
    if (is_null($date)) {
        //use 1999-12-31 as a valid date or as an alert
        return date('Y-m-d', strtotime('1999-12-31'));
    }

    if (($t = strtotime($date)) === false) {
        //use 1999-12-31 as a valid date or as an alert
        return date('Y-m-d', strtotime('1999-12-31'));
    } else {
        return date('Y-m-d H:i:s', strtotime($date));
    }
}

1

DateTimePHP7 +でクラスを使用する:

function getMysqlDatetimeFromDate(int $day, int $month, int $year): string {
    $dt = new DateTime();
    $dt->setTimezone(new DateTimeZone('UTC'));
    $dt->setDate($year, $month, $day);
    $dt->setTime(0, 0, 0, 0); // set tine to midnight

    return $dt->format("Y-m-d H:i:s");
}

1

受け入れられた回答の小さな補足:データベースdatetimeがUTC(私がいつもしていること)として保存されている場合は、gmdate("Y-m-d H:i:s")ではなくを使用する必要がありますdate("Y-m-d H:i:s")

または、MySQLにすべてを処理させたい場合は、いくつかの回答が示唆するように、MySQLを挿入UTC_TIMESTAMPしても同じ結果になります。

注:私は現在の時刻についての質問を理解しました。


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