Format PHP date () saat memasukkan ke dalam datetime di MySQL

324

Apa format yang benar untuk diteruskan ke date()fungsi dalam PHP jika saya ingin memasukkan hasilnya ke dalam datetimekolom tipe MySQL ?

Saya sudah mencoba date("Y-M-D G:i:s")tetapi itu hanya menyisipkan "0000-00-00 00:00:00" setiap kali.

Alex
sumber
3
karena Anda tidak menyediakan parameter hingga saat ini, apakah Anda benar-benar ingin mencatat waktu saat ini?
Mark Elliot

Jawaban:

680

Masalahnya adalah bahwa Anda menggunakan 'M'dan 'D', yang merupakan representasi tekstual, MySQL mengharapkan representasi numerik dari format tersebut2010-02-06 19:30:13

Coba: date("Y-m-d H:i:s")yang menggunakan persamaan numerik.

sunting: beralih Gke H, meskipun mungkin tidak berdampak, Anda mungkin ingin menggunakan format 24 jam dengan 0s terkemuka.

Mark Elliot
sumber
28
ini harus menjadi salah satu format datetime tunggal paling umum yang pernah dibutuhkan. harus dibangun di php global atau bagian dari fungsi tanggal itu sendiri (misalnya, 'c', 'r')
billynoah
33
Kenapa ini tidak terjadi saya tidak tahu. Saya harus merujuk ke stack overflow setiap. tunggal. berfungsi. waktu.
Mazatec
11
Lebih cepat datang ke sini, daripada mencari di kode saya untuk penggunaan seperti ini.
MRodrigues
64
Hanya berpikir dari mnemonic lucu untuk mengingat format: " Y kami m y d makan tidak -Nya ". bekerja pada banyak tingkatan :)
IzzEps
2
Harus ada singkatan php untuk ini karena ada untuk ISO 8601 dan RFC 2822
billynoah
105

Dari komentar date()halaman manual php :

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

Anda memiliki 'Y' yang benar - itu setahun penuh, tetapi 'M' adalah bulan tiga karakter, sedangkan 'm' adalah bulan dua digit. Masalah yang sama dengan 'D' bukannya 'd'. 'G' adalah jam 1 atau 2 digit, di mana 'H' selalu memiliki 0 di depan ketika dibutuhkan.

Tim Lytle
sumber
1
Terima kasih @ Pekka - Saya ingat ketika Anda dan saya memiliki perwakilan yang hampir sama - Anda sudah cukup aktif.
Tim Lytle
1
ya, saya banyak bekerja sekarang, dan SO adalah hiburan favorit saya di antaranya :) yang akan berubah lagi.
Pekka
41

Berikut ini solusi alternatif: jika Anda memiliki tanggal dalam PHP sebagai timestamp, memotong penanganannya dengan PHP dan biarkan DB berhati-hati mengubahnya dengan menggunakan FROM_UNIXTIMEfungsi.

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 |
+---------------------+
JAL
sumber
Ini adalah solusi yang elegan. Terima kasih :)
kta
2
@trejder, Siapa yang bilang bahwa melakukannya di mysql lebih cepat daripada melakukannya di php? Melakukannya dalam PHP lebih baik karena DB biasanya adalah hambatan dan Anda ingin masuk dan keluar secepatnya .
Pacerier
1
@Pacerier, DB adalah penghambat jika Anda memiliki DB yang tidak dibangun dengan baik, atau menjalankan terlalu banyak kueri kecil alih-alih permintaan tunggal yang lebih kuat dan efektif, atau dalam banyak kasus jika Anda mengandalkan ORM untuk mengelola database. SQL padat dengan basis data relasional yang diindeks dengan baik tidak lambat.
mopsyd
2
@opsops, DB adalah hambatan karena penskalaan secara horizontal membutuhkan kompleksitas. Bandingkan dengan server web yang dapat digandakan di seluruh dunia tanpa ada perubahan kode.
Pacerier
1
Jika kueri gagal, dicatat di suatu tempat, dan Anda harus men-debugnya, maka stempel waktu lebih sulit dibaca daripada string tanggal yang diformat yang dijelaskan oleh @ tim-lytle.
humbads
27

Saya menggunakan kode PHP berikut untuk membuat variabel yang saya masukkan ke dalam kolom MySQL DATETIME.

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

Ini akan menahan Tanggal dan Waktu server saat ini.

Steffan Clent Davies
sumber
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`
Ali Umair
sumber
2
Meskipun kode ini dapat menjawab pertanyaan, memberikan konteks tambahan tentang mengapa dan / atau bagaimana ia menjawab pertanyaan akan secara signifikan meningkatkan nilai jangka panjangnya. Harap edit jawaban Anda untuk menambahkan beberapa penjelasan, dan untuk memperbaiki masalah pemformatan Anda.
Toby Speight
9

Memformat stempel waktu ke kolom MySQL DATETIME:

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

Memformat datetime MySQL dengan PHP

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

Saya menggunakan fungsi ini (PHP 7)

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

Versi PHP yang lebih lama (PHP <7)

function getDateForDatabase($date) {
    $timestamp = strtotime($date);
    $date_formated = date('Y-m-d H:i:s', $timestamp);
    return $date_formated;
}
SandroMarques
sumber
Saya telah memilih jawaban Anda karena berhasil setelah saya mengedit baris pertama; function getDateForDatabase(string $date) : string {untuk function getDateForDatabase($date) {Mengapa deklarasi tipe melempar kesalahan saya tidak tahu cukup PHP untuk memberitahu.
Chris Pink
"Argumen 1 yang diteruskan ke getDateForDatabase () harus berupa string, string yang diberikan," - input saya adalah string,
Chris Pink
7

Tidak perlu menggunakan metode date () dari PHP jika Anda tidak menggunakan timestamp. Jika datepostedkolom datetime, Anda dapat memasukkan tanggal saat ini seperti ini:

$db->query("INSERT INTO table (dateposted) VALUES (now())");
Adam
sumber
2
Terima kasih telah berbagi pendekatan ini. Ini metode termudah yang saya lihat sampai sekarang.
Shondeslitch
2

Ini membuat saya gila mencari jawaban sederhana. Akhirnya saya membuat fungsi ini yang sepertinya menangkap semua input dan memberikan string SQL yang baik yang benar atau setidaknya valid dan dapat diperiksa. Jika 1999-12-31 mungkin salah tetapi tidak akan membuat kesalahan buruk di 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));
    }
}
Brian Jones
sumber
1

Menggunakan DateTimekelas di PHP7 +:

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

Sebuah addendum kecil untuk jawaban diterima: Jika database datetimedisimpan sebagai UTC (apa yang selalu saya lakukan), Anda harus menggunakan gmdate("Y-m-d H:i:s")bukan date("Y-m-d H:i:s").

Atau, jika Anda lebih suka membiarkan MySQL menangani semuanya, seperti beberapa jawaban sarankan, saya akan memasukkan MySQL UTC_TIMESTAMP, dengan hasil yang sama.

Catatan: Saya mengerti pertanyaan yang merujuk pada waktu saat ini.

Bruno
sumber
0

Ini adalah cara yang lebih akurat untuk melakukannya. Ini menempatkan desimal di belakang detik memberikan lebih presisi.

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

Perhatikan .uP.

Info lebih lanjut: https://stackoverflow.com/a/6153162/8662476

Maurici Abad
sumber