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.
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
<?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.
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.
@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.
$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`
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.
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())");
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.
functionMakeSQLDate($date){if(is_null($date)){//use 1999-12-31 as a valid date or as an alertreturn date('Y-m-d', strtotime('1999-12-31'));}if(($t = strtotime($date))===false){//use 1999-12-31 as a valid date or as an alertreturn date('Y-m-d', strtotime('1999-12-31'));}else{return date('Y-m-d H:i:s', strtotime($date));}}
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.
Jawaban:
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
G
keH
, meskipun mungkin tidak berdampak, Anda mungkin ingin menggunakan format 24 jam dengan 0s terkemuka.sumber
Dari komentar
date()
halaman manual php :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.
sumber
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_UNIXTIME
fungsi.sumber
Saya menggunakan kode PHP berikut untuk membuat variabel yang saya masukkan ke dalam kolom MySQL DATETIME.
Ini akan menahan Tanggal dan Waktu server saat ini.
sumber
sumber
Memformat stempel waktu ke kolom MySQL DATETIME:
sumber
Memformat datetime MySQL dengan PHP
sumber
Saya menggunakan fungsi ini (PHP 7)
Versi PHP yang lebih lama (PHP <7)
sumber
function getDateForDatabase(string $date) : string {
untukfunction getDateForDatabase($date) {
Mengapa deklarasi tipe melempar kesalahan saya tidak tahu cukup PHP untuk memberitahu.Tidak perlu menggunakan metode date () dari PHP jika Anda tidak menggunakan timestamp. Jika
dateposted
kolom datetime, Anda dapat memasukkan tanggal saat ini seperti ini:sumber
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.
sumber
Menggunakan
DateTime
kelas di PHP7 +:sumber
Sebuah addendum kecil untuk jawaban diterima: Jika database
datetime
disimpan sebagai UTC (apa yang selalu saya lakukan), Anda harus menggunakangmdate("Y-m-d H:i:s")
bukandate("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.
sumber
Ini adalah cara yang lebih akurat untuk melakukannya. Ini menempatkan desimal di belakang detik memberikan lebih presisi.
Perhatikan
.uP
.Info lebih lanjut: https://stackoverflow.com/a/6153162/8662476
sumber