MySQL datetime'dan PHP ile başka bir formata dönüştürme


447

datetimeMySQL'de bir sütun var .

PHP kullanarak ekrana mm / gg / yy Y: E (AM / PM) olarak nasıl dönüştürebilirim ?


4
Bilmemiz gereken, tarihin SQL içinde nasıl saklandığıdır. Zaman Damgası mı yoksa Tarih mi, yoksa unixtime mı?
furlafur Ücreti

Normal bir tarih gibi, unix zamanında saklanmazlar, PHP saniyelerle uğraşan PHP'dir. PHP OOPdatetime fonksiyonlarını kullanmanızı tavsiye ederim, kullanımı çok kolaydır.
Gucho Ca

2
Tarih biçiminizi önerebilir ve alternatif olabilir miyim? mm/dd/yyçok Amerikalı ve dünyanın diğer bölgelerinde yaşayan bizler, neyin kastedildiğini tahmin etmeye çalışırken biraz sinirliyiz 11-12-13. Daha evrensel standart yyyy-mm-ddISO 8601 standardının bir parçasıdır. Bunu yapmazsanız, numarayı değil ay adını kullanmalısınız .
Manngo

Yanıtlar:


515

Bir tarihi MySQL biçiminde normalleştirmenin bir yolunu arıyorsanız, aşağıdakileri kullanın

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

Çizgi $phpdate = strtotime( $mysqldate )bir dizeyi kabul eder ve bu dizgiyi unix zaman damgasına dönüştürmek için bir dizi buluşsal yöntem gerçekleştirir.

Bu satır $mysqldate = date( 'Y-m-d H:i:s', $phpdate ), zaman damgasını ve PHP'nin datebu zaman damgasını MySQL'in standart tarih biçimine dönüştürmek için işlevini kullanır .

( Editör Not : Bu cevap, kafa karıştırıcı ifadelere sahip orijinal bir soru ve bu cevabın, şu anda var olan soruyu doğrudan yanıtlamasa bile sağlanan genel Google kullanışlılığı nedeniyle buradadır)


19
bu cevap konuyu karıştırıyor
Alex K

5
@ 0xBAADF00D: lütfen soruyu tekrar okuyun ... kimse MySQL standart formatını sormadı.
user7116

3
Tabii ki, ancak standart mevcut olduğunda, standardı takip etmek güzel olabilir (kodunuzda başka bir geliştirici çalıştıktan sonra baş ağrısını önler) xD
0xBAADF00D 22:13

4
Soru, "Ymd H: i: s" değil, aa / gg / yy Y: E (AM / PM) biçiminde çıktı alınmasını ister.
Rikki

6
does not workkim için? Eğer dönüştürmek istiyorsanız Kabul cevap çalışacaktır dan içine MySQL aa / gg / yy H: M (AM / PM) OP istendiği gibi. Tam tersini yapmak istemeniz, kabul edilen cevabı yanlış yapmaz.
toxalot

311

MySQL'den alınan bir tarihi istenen biçime dönüştürmek için ( 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

Biçimi ayarlamak için PHP tarih biçimlendirme seçeneklerine bakın .


Bu $rownesnenin nereden gelmesi gerekiyor?
Mike

25
Yanılıyor olabilirim ama bence bazılarınız bu noktayı kaçırıyor. Çıktının orijinal tarihi bir DATETIME alanından alarak "m / d / yg: i A" formatında olmasını ister. Yani kodu çalışıyor. @Mike $ row-> createdate sadece Tim'in datetime sütunudur.
Sadece Geliştirme

4
@AsTeR yanıtı sadece soruyu yanlış okuduğunuzda kafa karıştırıcıdır. OP kendi soruya cevap ve bir tarih almak istiyor den istenen biçime MySQL ve çıkışı: aa / gg / yy H: M (AM / PM) .
toxalot

@TimBoland Cevabın geliştirilebilir düşünüyorsanız dan iyi istenen biçim olarak vurgulanmıştır aa / gg / yy H: M (AM / PM) . Ve tarih işlevine bir bağlantıdan yararlanabilir. Bir düzenleme önermeye çalıştım , ancak reddedildi.
Mart'ta

1
Eğlenceli gerçek: bu cevap hemen hemen aşağıya (hemen hemen hiç aşağı oyu olmayan) eşdeğerdir, ancak> 40 aşağı oy aldı, çünkü OP'nin bu sayfaya gelen insanların aslında sahip olduğu sorudan farklı olan sorusuna cevap veriyor.
Clément

110

PHP 5 kullanıyorsanız,

$oDate = new DateTime($row->createdate);
$sDate = $oDate->format("Y-m-d H:i:s");

Yukarıda yorumlarda belirtildiği gibi, standart biçim("Y-m-d H:i:s")
Yannickv

45
$valid_date = date( 'm/d/y g:i A', strtotime($date));

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


Bence insanlar aşağı iniyorlar çünkü OP sorusu hakkında kafaları karışıyor. Birçoğu soruyu gerçekte ne olduğunun tam tersi olarak okur. Diğer olasılık, bunun 5+ yıl önce gönderilen kabul edilen cevaba çok benzemesi.
Mart'ta

1
Başvurduğunuz bağlantı kullandığınız işlevi göstermez veya biçimi açıklamaz. Bence php.net/function.date.php daha iyi olurdu.
toxalot

@toxalot Kabul edilen cevap yanlış. Cevabımdan sonra & bağlantım hakkında değiştirdim, bağlantınızı değiştiriyorum. Teşekkürler
Tony Stark

1
Tüm bu soru-cevapların korkunç bir geçmişi var. Kabul cevap oldu öncelikle yanıt gönderdiniz zaman doğruydu 2013, 29 Nisan 2013 ve 24 Mayıs arasında yanlış. Yanıtınız oldu 29 Mayıs 2013 tarihine kadar bu sürenin sonunda da kabul edilen cevaba çok benzer oldu yanlış.
toxalot

23

Son olarak PHP 5.3 ve üstü için doğru çözüm: (Yorumda belirtildiği gibi Örneğe isteğe bağlı Zaman Dilimi eklenmiştir)

$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');

onun hatası .. Sınıf 'App \ Controller \ DateTime' bulunamadı .. php kullanarak 6.4
aswzen

1
Başka bir ad alanında çalışıyorsanız, önünde ters eğik çizgi ile çağırmanız gerekir:\DateTime::createFromFormat('Y-m-d H:i:s', $mysql_source_date);
Hasenpriester

2
Tarih nesnenizi oluştururken saat dilimini belirtmeyi unutmayın! Aksi takdirde, biçimlendirdiğiniz tarih birkaç saat kapalı olabilir. Kişisel datetimekolonlar yüzden geçer, UTF8 olmalıdır new DateTimeZone('UTC')PHP bilir sağlamak için 3 parametre olarak.
Eric Seastrand

Bu OP'nin istenen formatını veren doğru cevaptır, sadece zaman dilimlerine dikkat edin
Accountant م

12

Daha kolay bir yol, tarihi PHP yerine doğrudan MySQL sorgusunda biçimlendirmektir. DATE_FORMAT için MySQL manuel girişine bakın .

PHP'de yapmayı tercih ediyorsanız, tarih işlevine ihtiyacınız vardır , ancak önce veritabanı değerinizi bir zaman damgasına dönüştürmeniz gerekir.


11
-1 çünkü DB'de tarih biçimlendirme iyi bir fikir değildir. Çok dilli web farklı tarih biçimlerine ihtiyaç duyar ve daha sonra PHP'de tarihi biçimlendirmeniz gerekir (ortak iş mantığı dili). dateİşlev hakkında yazdığınızda strottime, "ancak" önce veritabanı değerinizi bir zaman damgasına dönüştürmeniz gerekir "yerine işlev hakkında da yazmalısınız.
Boris Šuška

10

Hepsini unut. Sadece kullan:

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

9

DateTimePHP'de bir nesneyi MySQL'de saklamak üzere doğru biçimlendirmek için, MySQL'in kullandığı standart formatı ( ISO 8601) kullanın .

PHP, 5.1.1 sürümünden beri bu formatı sabit olarak saklamıştır ve her seferinde dizeyi manuel olarak yazmak yerine kullanmanızı şiddetle tavsiye ederim.

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

Bu ve diğer PHP DateTime sabitlerinin bir listesini http://php.net/manual/en/class.datetime.php#datetime.constants.types adresinde bulabilirsiniz.


MySQL aslında bu biçimi kullanmaz ve MySQL, tarafından oluşturulan "+ xxxx" saat dilimi işaretleyicisini eklerseniz bir uyarı oluşturur. GÜNCELLEME X SET Y = '2014-03-31T15: 00: 00 + 0100' burada Z; Sorgu tamam, 0 satır etkilendi, 1 uyarı (0,06 sn) Eşleşen satır sayısı: 1 Değiştirildi: 0 Uyarılar: 1
George Lund

OP bir tarih almak istiyor den MySQL formatına ve dönüştürmek için aa / gg / yy H: M (AM / PM) .
toxalot 13:14

8

Bu, bir SQL sorgusundaki alanı biçimlendirmelidir:

SELECT DATE_FORMAT( `fieldname` , '%d-%m-%Y' ) FROM tablename

MySQL sorgusunu sadece SQL değil, belirtmeniz gerekir , çünkü bu tüm veritabanlarıyla çalışmayabilir. OP PHP çözümü isterken, bu OP'nin bilmediği iyi bir alternatif. Ancak, bu istenen formatı sağlamaz. OP formatını talep etmek için ihtiyacınız olacaktır '%m/%d/%y %h:%i %p'.
toxalot

7

Tarih fonksiyonunu kullanın :

<?php
    echo date("m/d/y g:i (A)", $DB_Date_Field);
?>

25
Date () işlevi, soruda belirtilen bir tarih saati yerine tamsayı bir zaman damgası beklemiyor mu?
Loftx

5

MySQL datetime yapılandırmanıza bağlı olarak. Genellikle: 2011-12-31 07:55:13 biçimi. Bu çok basit fonksiyon sihri yapmalıdır:

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

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

Ya da soruyu eşleştirmek için biraz daha ileri.

function datetime($date_string = false)
{
    if (!$date_string)
    {
        $date_string = time();
    }
    return date("Y-m-d H:i:s", strtotime($date_string));
}

1
Bu OP sorusuna cevap vermiyor. OP bir tarih almak istiyor den MySQL formatına ve dönüştürmek için aa / gg / yy H: M (AM / PM) . Ayrıca bu sadece geçerli saati biçimlendirir, belirli bir tarihi biçimlendirmez.
toxalot 13:14

5
SELECT 
 DATE_FORMAT(demo.dateFrom, '%e.%M.%Y') as dateFrom,
 DATE_FORMAT(demo.dateUntil, '%e.%M.%Y') as dateUntil
FROM demo

PHP kodunuzdaki her işlevi değiştirmek istemiyorsanız, beklenen tarih biçimini göstermek için, kaynağı veritabanınızda değiştirin.

Satırları as ile adlandırmak önemlidirYukarıdaki örnekte olduğu işleci (dateFrom, dateUntil olarak). Buraya yazdığınız isimler isimlerdir, sonuçlarınızdaki satırlar çağrılır.

Bu örneğin çıktısı

[Ayın günü, sayısal (0..31)]. [Ay adı (Ocak..Aralık)]. [Yıl, sayısal, dört basamak]

Örnek: 5.Ağustos.2015

İstediğiniz ayırıcıyla noktaları değiştirin ve daha fazla tarih biçimi için DATE_FORMAT (tarih, biçim) işlevini kontrol edin .


3

Ayrıca sorgunuzun saati Unix zaman damgası olarak döndürmesini de sağlayabilirsiniz. Bu strtotime(), PHP tarafında işleri biraz daha az yoğun hale getirmek ve yapmak ihtiyacından kurtulacaktı ...

select  UNIX_TIMESTAMP(timsstamp) as unixtime from the_table where id = 1234;

Sonra PHP'de sadece date()istediğiniz şekilde biçimlendirmek için işlevi kullanın.

<?php
  echo date('l jS \of F Y h:i:s A', $row->unixtime);
?>

veya

<?php
  echo date('F j, Y, g:i a', $row->unixtime);
?>

Ben kullanmanın aksine bu yaklaşım gibi MySQL 'in DATE_FORMATbu verileri kapmak için aynı sorguyu yeniden kullanıma izin veren ve PHP biçimlendirme değiştirmeye izin verir, çünkü işlevi.

Tarihin kullanıcı arayüzünde görünme şeklini değiştirmek için iki farklı sorguya sahip olmak can sıkıcı bir durum.


UNIX_TIMESTAMPİhtiyacı ortadan kaldırmak için kullanma fikrini seviyorum strtotime. Zamanı gerçekten OP biçiminde istenen biçimde biçimlendirmeye örnek verdiyse bu yanıt daha iyi olurdu.
toxalot

1

Unix Timestamp'ta iade edilmeyen tarihlerle ilgili sorun yaşayabilirsiniz, bu yüzden bu benim için çalışıyor ...

return date("F j, Y g:i a", strtotime(substr($datestring, 0, 15)))

1
Bu, tarihi OP tarafından istenen formata dönüştürmez.
toxalot

1

Bu çalışacak...

echo date('m/d/y H:i (A)',strtotime($data_from_mysql));

1
Bu biçim 24 saati AM / PM ile karıştırır. Aksi takdirde, 5+ yıl önce gönderilen kabul edilen cevapla aynıdır.
toxalot

0

PHP sürüm 4.4.9 ve MySQL 5.0 kullanarak, bu benim için çalıştı:

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

PubDateMySQL içindeki sütundur .


Bu tarih OP tarafından talep edilen formata dönüştürülmez
toxalot 13:14

0

Önerdiğim yaklaşım aşağıdaki gibi çalışır. İlk olarak, mysql biçimli bir dizeden temel bir datetime nesnesi oluşturun; ve sonra istediğiniz gibi biçimlendirirsiniz. Neyse ki, mysql datetime ISO8601 uyumludur, bu nedenle kodun kendisi oldukça basit ve zarif görünebilir. Bu datetimesütunda saat dilimi bilgisi bulunmadığını unutmayın , bu nedenle uygun şekilde dönüştürmeniz gerekir .

İşte kod:

(new ISO8601Formatted(
    new FromISO8601('2038-01-19 11:14:07'),
    'm/d/Y h:iA'
))
    ->value();

Çıktı 01/19/2038 11:14AM- umarım ne beklediğiniz.

Bu örnek beze kitaplığı kullanır. Eğer süslüyse biraz daha kontrol edebilirsiniz .


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

1
Bu OP sorusuna cevap vermiyor. OP bir tarih almak istiyor den MySQL formatına ve dönüştürmek için aa / gg / yy H: M (AM / PM) . Bu tam tersini yapar. Ayrıca veri tabanı yerine bir formdan girdi alır.
toxalot
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.