web-dev-qa-db-ja.com

PHP MySQLのdatetimeに挿入するときのdate()フォーマット

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

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

277
Alex

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

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

edit:GHに変更しましたが、影響はないかもしれませんが、おそらく先頭に0を付けて24時間形式を使用したいでしょう。

610
Mark Elliot

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

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

あなたは 'Y'を正しいとしました - それは通年ですが、 'M'は2桁の月ですが、 'M'は3文字の月です。 'd'ではなく 'D'でも同様の問題があります。 'G'は1桁または2桁の時です。 'H'は必要に応じて常に先頭に0を付けます。

101
Tim Lytle

これに代わる解決策があります:PHPに日付をタイムスタンプとして持っているなら、PHPでそれを扱うことをバイパスして、DBがFROM_UNIXTIME関数を使ってそれを変換するようにしてください。

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 |
+---------------------+
40
JAL

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

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

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

23
$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`
10
Ali Umair

タイムスタンプをMySQL DATETIME列にフォーマットします。

strftime('%Y-%m-%d %H:%M:%S',$timestamp);
9
Ahmed Saber

私はこの機能を使っています(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;
}
9
SandroMarques

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

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

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

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

これは私に簡単な答えを探して怒っています。最後に、すべての入力をキャッチして正しいか、少なくとも有効でチェック可能な優れた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
Brian Jones

PHP 7以降でDateTimeクラスを使用する:

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");
}
0
Nino Škopac

受け入れられた答えに対する小さな補足:データベースdatetimeがUTCとして保存されている場合(私がいつもしていることですが)、gmdate("Y-m-d H:i:s")の代わりにdate("Y-m-d H:i:s")を使うべきです。

あるいは、MySQLにすべてを処理させることを好む場合は、いくつかの回答が示すように、MySQLのUTC_TIMESTAMPを挿入しても同じ結果が得られます。

注:私は現在の時間を参照して質問を理解しました。

0
Bruno

これは、より正確な方法です。秒の後ろに小数を配置して、精度を上げます。

$now = date('Y-m-d\TH:i:s.uP', time());

.uPに注意してください。

詳細: https://stackoverflow.com/a/6153162/8662476