Yang perlu kita ketahui adalah bagaimana tanggal disimpan dalam SQL. Apakah itu Timestamp atau Datetime atau unixtime?
Ólafur Waage
Mereka disimpan bukan dalam waktu unix, seperti tanggal yang normal, PHP adalah yang menangani sebagai detik dan sebagainya. Saya akan merekomendasikan Anda untuk menggunakan OOPfungsi datetime PHP , mereka sangat mudah digunakan.
Gucho Ca
2
Bisakah saya merekomendasikan dan alternatif untuk format tanggal Anda? mm/dd/yysangat Amerika, dan kita yang tinggal di bagian lain dunia lebih dari sedikit kesal mencoba menebak apa yang dimaksud 11-12-13. Standar yang lebih universal adalah yyyy-mm-dd, dan merupakan bagian dari standar ISO 8601. Gagal itu, Anda harus menggunakan nama bulan , bukan nomornya.
Manngo
Jawaban:
515
Jika Anda mencari cara untuk menormalkan tanggal ke dalam format MySQL, gunakan yang berikut ini
Baris $phpdate = strtotime( $mysqldate )menerima string dan melakukan serangkaian heuristik untuk mengubah string itu menjadi cap waktu unix.
Baris ini $mysqldate = date( 'Y-m-d H:i:s', $phpdate )menggunakan stempel waktu dan datefungsi PHP untuk mengubah stempel waktu itu kembali ke format tanggal standar MySQL.
( Catatan Editor : Jawaban ini ada di sini karena pertanyaan asli dengan kata-kata yang membingungkan, dan kegunaan umum Google jawaban ini diberikan bahkan jika itu tidak 'langsung menjawab pertanyaan yang sekarang ada)
@ 0xBAADF00D: baca pertanyaan lagi ... tidak ada yang bertanya tentang format standar MySQL.
user7116
3
tentu saja, tetapi, ketika standar ada, itu bisa menyenangkan untuk mengikuti standar (itu menghindari sakit kepala nanti ketika pengembang lain mengerjakan kode Anda) xD
0xBAADF00D
4
Pertanyaannya menanyakan ke output dalam format mm / dd / yy H: M (AM / PM), bukan "Ymd H: i: s".
Rikki
6
does not workuntuk siapa? Jawaban yang diterima akan berfungsi jika Anda ingin mengonversi dari MySQL ke mm / dd / yy H: M (AM / PM) seperti yang diminta OP. Hanya karena Anda ingin melakukan yang sebaliknya tidak membuat jawaban yang diterima salah.
toxalot
311
Untuk mengonversi tanggal yang diambil dari MySQL ke dalam format yang diminta ( mm/dd/yy H:M (AM/PM)):
Saya bisa saja salah, tetapi saya pikir beberapa dari Anda kehilangan intinya. Dia ingin output dalam format "m / d / yg: i A", menarik tanggal asli dari bidang DATETIME. Jadi kodenya bekerja. @ Mike $ row-> Createdate hanyalah kolom datetime Tim.
Mere Development
4
Jawaban @AsTeR hanya membingungkan jika Anda salah membaca pertanyaan. OP menjawab pertanyaannya sendiri dan ingin mengambil tanggal dari MySQL dan output ke format yang diminta: mm / dd / yy H: M (AM / PM) .
toxalot
@TimBoland saya pikir jawaban dapat ditingkatkan jika dari ditekankan serta format yang diminta mm / hh / tttt H: M (AM / PM) . Dan itu bisa mendapat manfaat dari tautan ke fungsi tanggal. Saya mencoba menyarankan edit , tetapi ditolak.
toxalot
1
Fakta menyenangkan: jawaban ini kira-kira setara dengan jawaban di bawah (yang sebenarnya tidak memiliki downvotes), tetapi mendapat> 40 downvotes karena menjawab pertanyaan OP, yang berbeda dari apa yang sebenarnya dimiliki oleh orang-orang yang datang ke halaman ini.
Clément
110
Jika Anda menggunakan PHP 5, Anda juga dapat mencoba
Saya pikir orang downvote karena mereka bingung tentang pertanyaan OP. Sebagian besar membaca pertanyaan itu menjadi kebalikan dari apa itu sebenarnya. Kemungkinan lain adalah bahwa ini sangat mirip dengan jawaban yang diterima yang telah diposting 5+ tahun yang lalu.
toxalot
1
Tautan yang Anda referensi tidak menunjuk ke fungsi yang Anda gunakan, juga tidak menjelaskan formatnya. Saya pikir php.net/function.date.php akan lebih baik.
toxalot
@toxalot Jawaban yang diterima salah. Itu diedit setelah jawaban saya & tentang tautan saya, saya mengganti tautan Anda. Terima kasih
Tony Stark
1
Seluruh tanya jawab ini memiliki sejarah yang kotor. Jawaban yang diterima adalah salah antara April 29, 2013 dan 24 Mei 2013. Itu benar ketika Anda pertama kali diposting jawaban Anda. Jawaban Anda adalah salah sampai 29 Mei 2013, setelah itu menjadi sangat mirip dengan jawaban yang diterima.
toxalot
23
Akhirnya solusi yang tepat untuk PHP 5.3 dan di atasnya:
(menambahkan Timezone opsional ke Contoh seperti disebutkan dalam komentar)
kesalahannya .. Kelas 'App \ Controller \ DateTime' tidak ditemukan .. menggunakan php 6.4
aswzen
1
Jika Anda bekerja di namespace lain, Anda harus menyebutnya dengan backslash di depannya:\DateTime::createFromFormat('Y-m-d H:i:s', $mysql_source_date);
Hasenpriester
2
Jangan lupa untuk menentukan zona waktu saat Anda membuat objek tanggal! Jika tidak, tanggal yang diformat Anda mungkin cuti beberapa jam. datetimeKolom Anda harus UTF8, jadi berikan new DateTimeZone('UTC')sebagai parameter ke-3 untuk memastikan PHP tahu.
Eric Seastrand
Ini adalah jawaban yang benar yang menampilkan format OP yang diinginkan, hanya mengurus zona waktu
Jika Anda lebih suka melakukannya dalam PHP, maka Anda memerlukan fungsi tanggal , tetapi Anda harus mengubah nilai database Anda menjadi timestamp terlebih dahulu.
-1 karena memformat tanggal dalam DB bukan ide yang baik. Web multilanguage membutuhkan format tanggal yang berbeda dan Anda harus memformat tanggal dalam PHP (bahasa logika bisnis yang sama). Ketika Anda menulis tentang datefungsi, maka Anda harus menulis tentang strottimefungsi juga untuk membantu seseorang alih-alih "tetapi Anda harus mengubah nilai basis data Anda menjadi stempel waktu pertama".
Untuk memformat DateTimeobjek dalam PHP dengan benar untuk disimpan di MySQL, gunakan format standar yang digunakan MySQL, yaitu ISO 8601 .
PHP telah menyimpan format ini sebagai konstanta sejak versi 5.1.1, dan saya sangat merekomendasikan untuk menggunakannya daripada mengetik secara manual setiap kali.
MySQL sebenarnya tidak menggunakan format ini, dan MySQL menghasilkan peringatan jika Anda menyertakan perancang zona waktu "+ xxxx" yang dihasilkan olehnya. UPDATE X SET Y = '2014-03-31T15: 00: 00 + 0100' di mana Z; Kueri OK, 0 baris terpengaruh, 1 peringatan (0,06 dtk) Baris cocok: 1 Berubah: 0 Peringatan: 1
George Lund
OP ingin mengambil tanggal dari format MySQL dan mengonversi ke mm / dd / yy H: M (AM / PM) .
toxalot
8
Ini harus memformat bidang dalam kueri SQL:
SELECT DATE_FORMAT(`fieldname`,'%d-%m-%Y') FROM tablename
Anda harus menentukan permintaan MySQL , bukan hanya SQL, karena itu tidak akan bekerja dengan semua database. Sementara OP meminta solusi PHP, ini adalah alternatif yang baik yang mungkin tidak diketahui OP. Namun, ini tidak akan memberikan format yang diminta. Untuk mendapatkan format yang diminta OP, Anda harus '%m/%d/%y %h:%i %p'.
Ini tidak menjawab pertanyaan OP. OP ingin mengambil tanggal dari format MySQL dan mengonversi ke mm / dd / yy H: M (AM / PM) . Plus ini hanya akan memformat waktu saat ini, bukan tanggal tertentu.
toxalot
5
SELECT
DATE_FORMAT(demo.dateFrom,'%e.%M.%Y')as dateFrom,
DATE_FORMAT(demo.dateUntil,'%e.%M.%Y')as dateUntil
FROM demo
Jika Anda tidak ingin mengubah setiap fungsi dalam kode PHP Anda, untuk menampilkan format tanggal yang diharapkan, ubah di sumber - basis data Anda.
Hal ini penting untuk nama baris dengan sebagai operator sebagai dalam contoh di atas (sebagai dateFrom, sebagai dateUntil). Nama yang Anda tulis ada nama, baris akan dipanggil di hasil Anda.
Output dari contoh ini adalah
[Hari dalam sebulan, numerik (0..31)]. [Nama bulan (Januari..Desember)]. [Tahun, angka, empat digit]
Contoh: 5.Austust.2015
Ubah titik-titik dengan pemisah pilihan dan periksa fungsi DATE_FORMAT (tanggal, format) untuk format tanggal lainnya.
Anda juga dapat meminta kueri mengembalikan waktu sebagai cap waktu Unix. Itu akan menghilangkan kebutuhan untuk menelepon strtotime()dan membuat hal-hal sedikit kurang intensif di sisi PHP ...
select UNIX_TIMESTAMP(timsstamp)as unixtime from the_table where id =1234;
Kemudian di PHP cukup gunakan date()fungsi untuk memformatnya dengan cara apa pun yang Anda inginkan.
<?php
echo date('l jS \of F Y h:i:s A', $row->unixtime);?>
atau
<?php
echo date('F j, Y, g:i a', $row->unixtime);?>
Aku seperti pendekatan ini sebagai lawan menggunakan MySQL 's DATE_FORMATfungsi, karena memungkinkan Anda untuk menggunakan kembali query yang sama untuk mengambil data dan memungkinkan Anda untuk mengubah format dalam PHP.
Menjengkelkan memiliki dua pertanyaan berbeda hanya untuk mengubah tampilan tanggal di UI.
Saya suka menggunakan ide UNIX_TIMESTAMPuntuk menghilangkan kebutuhan strtotime. Jawaban ini akan lebih baik jika memberi contoh memformat waktu dalam format yang sebenarnya diminta OP.
toxalot
1
Anda dapat mengalami masalah dengan tanggal yang tidak dikembalikan di Unix Timestamp, jadi ini berfungsi untuk saya ...
return date("F j, Y g:i a", strtotime(substr($datestring,0,15)))
Ini tidak mengonversi tanggal ke format yang diminta oleh OP
toxalot
0
Pendekatan yang saya sarankan bekerja seperti berikut ini. Pertama, Anda membuat objek datetime dasar dari string berformat mysql; dan kemudian Anda memformatnya sesuka Anda. Untungnya, datetime mysql kompatibel dengan ISO8601, sehingga kode itu sendiri dapat terlihat cukup sederhana dan elegan. Ingatlah bahwa datetimekolom itu tidak memiliki informasi zona waktu, jadi Anda perlu mengonversinya dengan tepat .
Berikut kodenya:
(new ISO8601Formatted(newFromISO8601('2038-01-19 11:14:07'),'m/d/Y h:iA'))->value();
Ini menghasilkan 01/19/2038 11:14AM- mudah-mudahan apa yang Anda harapkan.
Contoh ini menggunakan pustaka meringue. Anda dapat memeriksanya lagi jika Anda suka.
Ini tidak menjawab pertanyaan OP. OP ingin mengambil tanggal dari format MySQL dan mengonversi ke mm / dd / yy H: M (AM / PM) . Ini sebaliknya. Plus itu mengambil input dari formulir daripada database.
OOP
fungsi datetime PHP , mereka sangat mudah digunakan.mm/dd/yy
sangat Amerika, dan kita yang tinggal di bagian lain dunia lebih dari sedikit kesal mencoba menebak apa yang dimaksud11-12-13
. Standar yang lebih universal adalahyyyy-mm-dd
, dan merupakan bagian dari standar ISO 8601. Gagal itu, Anda harus menggunakan nama bulan , bukan nomornya.Jawaban:
Jika Anda mencari cara untuk menormalkan tanggal ke dalam format MySQL, gunakan yang berikut ini
Baris
$phpdate = strtotime( $mysqldate )
menerima string dan melakukan serangkaian heuristik untuk mengubah string itu menjadi cap waktu unix.Baris ini
$mysqldate = date( 'Y-m-d H:i:s', $phpdate )
menggunakan stempel waktu dandate
fungsi PHP untuk mengubah stempel waktu itu kembali ke format tanggal standar MySQL.( Catatan Editor : Jawaban ini ada di sini karena pertanyaan asli dengan kata-kata yang membingungkan, dan kegunaan umum Google jawaban ini diberikan bahkan jika itu tidak 'langsung menjawab pertanyaan yang sekarang ada)
sumber
does not work
untuk siapa? Jawaban yang diterima akan berfungsi jika Anda ingin mengonversi dari MySQL ke mm / dd / yy H: M (AM / PM) seperti yang diminta OP. Hanya karena Anda ingin melakukan yang sebaliknya tidak membuat jawaban yang diterima salah.Untuk mengonversi tanggal yang diambil dari MySQL ke dalam format yang diminta (
mm/dd/yy H:M (AM/PM)
):Lihat opsi pemformatan tanggal PHP untuk menyesuaikan format.
sumber
$row
benda ini seharusnya berasal?Jika Anda menggunakan PHP 5, Anda juga dapat mencoba
sumber
("Y-m-d H:i:s")
Referensi: http://php.net/manual/en/function.date.php
sumber
Akhirnya solusi yang tepat untuk PHP 5.3 dan di atasnya: (menambahkan Timezone opsional ke Contoh seperti disebutkan dalam komentar)
sumber
\DateTime::createFromFormat('Y-m-d H:i:s', $mysql_source_date);
datetime
Kolom Anda harus UTF8, jadi berikannew DateTimeZone('UTC')
sebagai parameter ke-3 untuk memastikan PHP tahu.Cara yang lebih mudah adalah memformat tanggal secara langsung dalam kueri MySQL, bukan PHP. Lihat entri manual MySQL untuk DATE_FORMAT .
Jika Anda lebih suka melakukannya dalam PHP, maka Anda memerlukan fungsi tanggal , tetapi Anda harus mengubah nilai database Anda menjadi timestamp terlebih dahulu.
sumber
date
fungsi, maka Anda harus menulis tentangstrottime
fungsi juga untuk membantu seseorang alih-alih "tetapi Anda harus mengubah nilai basis data Anda menjadi stempel waktu pertama".Lupakan semuanya. Cukup gunakan:
sumber
Untuk memformat
DateTime
objek dalam PHP dengan benar untuk disimpan di MySQL, gunakan format standar yang digunakan MySQL, yaitu ISO 8601 .PHP telah menyimpan format ini sebagai konstanta sejak versi 5.1.1, dan saya sangat merekomendasikan untuk menggunakannya daripada mengetik secara manual setiap kali.
Ini, dan daftar konstanta DateTime PHP lainnya tersedia di http://php.net/manual/en/class.datetime.php#datetime.constants.types
sumber
Ini harus memformat bidang dalam kueri SQL:
sumber
'%m/%d/%y %h:%i %p'
.Gunakan fungsi tanggal :
sumber
Tergantung pada konfigurasi datetime MySQL Anda. Biasanya: format 2011-12-31 07:55:13 . Fungsi yang sangat sederhana ini harus melakukan keajaiban:
Atau sedikit lebih maju untuk mencocokkan pertanyaan.
sumber
Jika Anda tidak ingin mengubah setiap fungsi dalam kode PHP Anda, untuk menampilkan format tanggal yang diharapkan, ubah di sumber - basis data Anda.
Hal ini penting untuk nama baris dengan sebagai operator sebagai dalam contoh di atas (sebagai dateFrom, sebagai dateUntil). Nama yang Anda tulis ada nama, baris akan dipanggil di hasil Anda.
Output dari contoh ini adalah
[Hari dalam sebulan, numerik (0..31)]. [Nama bulan (Januari..Desember)]. [Tahun, angka, empat digit]
Contoh: 5.Austust.2015
Ubah titik-titik dengan pemisah pilihan dan periksa fungsi DATE_FORMAT (tanggal, format) untuk format tanggal lainnya.
sumber
Anda juga dapat meminta kueri mengembalikan waktu sebagai cap waktu Unix. Itu akan menghilangkan kebutuhan untuk menelepon
strtotime()
dan membuat hal-hal sedikit kurang intensif di sisi PHP ...Kemudian di PHP cukup gunakan
date()
fungsi untuk memformatnya dengan cara apa pun yang Anda inginkan.atau
Aku seperti pendekatan ini sebagai lawan menggunakan MySQL 's
DATE_FORMAT
fungsi, karena memungkinkan Anda untuk menggunakan kembali query yang sama untuk mengambil data dan memungkinkan Anda untuk mengubah format dalam PHP.Menjengkelkan memiliki dua pertanyaan berbeda hanya untuk mengubah tampilan tanggal di UI.
sumber
UNIX_TIMESTAMP
untuk menghilangkan kebutuhanstrtotime
. Jawaban ini akan lebih baik jika memberi contoh memformat waktu dalam format yang sebenarnya diminta OP.Anda dapat mengalami masalah dengan tanggal yang tidak dikembalikan di Unix Timestamp, jadi ini berfungsi untuk saya ...
sumber
Ini akan bekerja ...
sumber
Menggunakan PHP versi 4.4.9 & MySQL 5.0, ini bekerja untuk saya:
PubDate
adalah kolom di MySQL .sumber
Pendekatan yang saya sarankan bekerja seperti berikut ini. Pertama, Anda membuat objek datetime dasar dari string berformat mysql; dan kemudian Anda memformatnya sesuka Anda. Untungnya, datetime mysql kompatibel dengan ISO8601, sehingga kode itu sendiri dapat terlihat cukup sederhana dan elegan. Ingatlah bahwa
datetime
kolom itu tidak memiliki informasi zona waktu, jadi Anda perlu mengonversinya dengan tepat .Berikut kodenya:
Ini menghasilkan
01/19/2038 11:14AM
- mudah-mudahan apa yang Anda harapkan.Contoh ini menggunakan pustaka meringue. Anda dapat memeriksanya lagi jika Anda suka.
sumber
sumber