Konversi dari datetime MySQL ke format lain dengan PHP

447

Saya memiliki datetimekolom di MySQL.

Bagaimana saya bisa mengubahnya ke tampilan sebagai mm / hh / tttt H: M (AM / PM) menggunakan PHP?

Tim Boland
sumber
4
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

$phpdate = strtotime( $mysqldate );
$mysqldate = date( 'Y-m-d H:i:s', $phpdate );

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)

kta
sumber
19
jawaban ini membingungkan topik
Alex K
5
@ 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)):

// $datetime is something like: 2014-01-31 13:05:59
$time = strtotime($datetimeFromMysql);
$myFormatForView = date("m/d/y g:i A", $time);
// $myFormatForView is something like: 01/31/14 1:05 PM

Lihat opsi pemformatan tanggal PHP untuk menyesuaikan format.

Tim Boland
sumber
Dari mana $rowbenda ini seharusnya berasal?
Mike
25
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

$oDate = new DateTime($row->createdate);
$sDate = $oDate->format("Y-m-d H:i:s");
enobrev
sumber
Seperti yang dinyatakan di atas dalam komentar, format standar adalah("Y-m-d H:i:s")
Yannickv
45
$valid_date = date( 'm/d/y g:i A', strtotime($date));

Referensi: http://php.net/manual/en/function.date.php

Tony Stark
sumber
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)

$date = \DateTime::createFromFormat('Y-m-d H:i:s', $mysql_source_date, new \DateTimeZone('UTC'));
$date->setTimezone(new \DateTimeZone('Europe/Berlin')); // optional
echo $date->format('m/d/y h:i a');
Hasenpriester
sumber
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
Akuntan.
12

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.

flash
sumber
11
-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".
Boris Šuška
10

Lupakan semuanya. Cukup gunakan:

$date = date("Y-m-d H:i:s",strtotime(str_replace('/','-',$date)))
nixis
sumber
9

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.

$dtNow = new DateTime();
$mysqlDateTime = $dtNow->format(DateTime::ISO8601);

Ini, dan daftar konstanta DateTime PHP lainnya tersedia di http://php.net/manual/en/class.datetime.php#datetime.constants.types

Greg
sumber
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
riz
sumber
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'.
toxalot
7

Gunakan fungsi tanggal :

<?php
    echo date("m/d/y g:i (A)", $DB_Date_Field);
?>
Gustavo Carreno
sumber
25
Tidakkah fungsi date () mengharapkan cap waktu bilangan bulat daripada waktu yang ditentukan dalam pertanyaan?
Loftx
5

Tergantung pada konfigurasi datetime MySQL Anda. Biasanya: format 2011-12-31 07:55:13 . Fungsi yang sangat sederhana ini harus melakukan keajaiban:

function datetime()
{
    return date( 'Y-m-d H:i:s', time());
}

echo datetime(); // display example: 2011-12-31 07:55:13

Atau sedikit lebih maju untuk mencocokkan pertanyaan.

function datetime($date_string = false)
{
    if (!$date_string)
    {
        $date_string = time();
    }
    return date("Y-m-d H:i:s", strtotime($date_string));
}
tfont
sumber
1
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.

Rangel
sumber
3

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.

phatduckk
sumber
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)))
matt.j.crawford
sumber
1
Ini tidak mengonversi tanggal ke format yang diminta oleh OP.
toxalot
1

Ini akan bekerja ...

echo date('m/d/y H:i (A)',strtotime($data_from_mysql));
Mihir Vadalia
sumber
1
Format itu bercampur 24 kali dengan AM / PM. Kalau tidak, itu sama dengan jawaban yang diterima yang telah diposting 5+ tahun yang lalu.
toxalot
0

Menggunakan PHP versi 4.4.9 & MySQL 5.0, ini bekerja untuk saya:

$oDate = strtotime($row['PubDate']);
$sDate = date("m/d/y",$oDate);
echo $sDate

PubDateadalah kolom di MySQL .

Peter Mortensen
sumber
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(
    new FromISO8601('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.

Vadim Samokhin
sumber
-1
$date = "'".date('Y-m-d H:i:s', strtotime(str_replace('-', '/', $_POST['date'])))."'";
SagarPPanchal
sumber
1
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.
toxalot