PHP'de tarih biçimini dönüştürme


489

Ben bir tarih dönüştürmek için çalışıyorum yyyy-mm-ddiçin dd-mm-yyyy(ancak SQL); Ancak nasıl tarih işlevi bir zaman damgası gerektirir bilmiyorum ve bu dize bir zaman damgası alınamıyor.

Bu nasıl mümkün olabilir?


21
gg-aa-yyyy, en azından kullanıcılara veri sunmanız gerektiğinde (çoğu) Avrupa'daki standart biçimdir.
Matteo Riva

7
gg-aa-yyyy de Avustralya ve Yeni Zelanda'da
Jonathan Day

2
aa-gg-yyyy ABD'de. @stesch: İlki SQL'de standarttır. Hiçbir ülkede standart olduğundan emin değilim . :)
Herbert

10
Aslında, ISO 8601'e göre standart yyyy-aa- gg'dir .
Jezen Thomas

7
Global "Standart" yyyy-aa-gg'dir ve her zaman mümkün olan yerlerde sistemler tarafından kullanılmalıdır. Sipariş günü, ay, yıl, dünyanın çoğu yerinde (ABD hariç), ancak genellikle eğik çizgilerle, tire ile değil, insanlar tarafından kullanılır. Karışıklığı önlemek için, sadece YYYY-AA-GG'yi kısa çizgilerle ayırırım. Eğik çizgilerle ayıracağım diğer tarih formatları. Bu işleri tutarlı tutar.
rjmunro

Yanıtlar:


1055

Kullanın strtotime()ve date():

$originalDate = "2010-03-21";
$newDate = date("d-m-Y", strtotime($originalDate));

( PHP sitesindeki strtotime ve tarih belgelerine bakın .)

Bunun orijinal soruya hızlı bir çözüm olduğunu unutmayın. Daha kapsamlı dönüşümler için DateTimesınıfı gerçekten ayrıştırmak ve biçimlendirmek için kullanıyor olmanız gerekir :-)


14
MySQL'den bu tarihi 0000-00-00 alırsam ne olur? 31/12/1969 gibi yanlış bir tarih döndürüyor ...
Enrique

3
@Enrique: MySQL'den 000-00-00 alırsanız, dönüşümden önce bunu İLK ile test etmelisiniz. Sade.
ShadowStorm

1
@SobinAugustine ve diğerleri: strtotime (), tarih dizesini "Unix zaman damgasına (1 Ocak 1970 00:00:00 UTC'den bu yana geçen saniye sayısı)" dönüştürür; biçim tarihini () anlayabilir ve sonra dönüştürebilirsiniz. Yani bu 1970'ten önce bir zaman damgası ile çalışmaz.
Samuel Lindblom

1
@SamuelLindblom hayır, öyle değil, 1970'ten önce çalışacak.
Sobin Augustine

1
@SobinAugustine: Haklısın. Ancak, 1901-12-14'ten önce çalışmaz, bu nedenle yukarıda listelenen tarihlerin neden çalışmadığı için de geçerlidir.
Samuel Lindblom

271

Strtotime dönüşümünden kaçınmak istiyorsanız (örneğin, strtotime girdinizi ayrıştıramıyorsa),

$myDateTime = DateTime::createFromFormat('Y-m-d', $dateString);
$newDateString = $myDateTime->format('d-m-Y');

Veya eşdeğer olarak:

$newDateString = date_format(date_create_from_format('Y-m-d', $dateString), 'd-m-Y');

İlk olarak $ dateString'in içinde olduğu formatı veriyorsunuz. O zaman $ newDateString'in olmasını istediğiniz formatı söylüyorsunuz.

Veya kaynak biçimi her zaman "Ymd" (yyyy-aa-gg) ise, DateTime öğesini kullanın :

<?php
    $source = '2012-07-31';
    $date = new DateTime($source);
    echo $date->format('d.m.Y'); // 31.07.2012
    echo $date->format('d-m-Y'); // 31-07-2012
?>

17
İçin teşekkür ederim DateTime::createFromFormat()- gerçekten daha yararlıstrtotime()
Gtx

2
Not: İlk iki yöntem için PHP 5.3+ gereklidir.
Salman von Abbas

Yeni DateTime seçeneği için teşekkür ederiz. Bu çalıştı ve çok temiz bir seçenek oldu.
Nina Morena

1
strtotime()true yazım biçimini (Ymd) diğer biçimlere dönüştürmek için kullanışlıdır , ancak DateTime::createFromFormat()evrenseldir. Sanki STR_TO_DATEMySQL
Taron Saribekyan

Bu benim için gerçekten işe yaradı Bullshit yerinestrtotime()
Code Cooker

72

kullanın:

implode('-', array_reverse(explode('-', $date)));

Tarih dönüşüm yükü olmadan, çok önemli olacağından emin değilim.


Evet, sizinkini gönderirken cevap verdim. Elbette strtotime'da bulunan hata kontrolü yararlı olabilir.
Tim Lytle

2
Amerikan olmayan tarih biçimini dönüştürmede benim için yararlı oldu ... gg-aa-yyyy => yyyy-aa-gg Bkz. Php.net/manual/en/datetime.formats.date.php
Chris Jacob

5
Bu cevabın neden daha az oy aldığını anlamayın. En çok oy alan cevap olmalı. Sorunu herhangi bir sorun olmadan basit ve hızlı bir şekilde çözer. Teşekkürler
Naeem Ul Wahhab

2
Tarih biçimini orijinal biçimine çevirmeniz gerekirse yeniden arayabilirsiniz. Gerçekten en iyi cevap. :)
Pedro Araujo Jorge

1
bu kabul edilen cevap olarak değiştirilmelidir, tarih ve tarih formatlarını kullanarak tüm tarih-saat sorununu çözer.
Matteo Bononi 'peorthyr'

38
$newDate = preg_replace("/(\d+)\D+(\d+)\D+(\d+)/","$3-$2-$1",$originalDate);

Bu kod her tarih biçimi için çalışır.

Eski tarih biçiminiz nedeniyle $ 3- $ 1- $ 2 gibi değiştirme değişkenlerinin sırasını değiştirebilirsiniz.


Çok teşekkürler!
Lê Văn Chiến

28
$timestamp = strtotime(your date variable); 
$new_date = date('d-m-Y', $timestamp);

Daha fazla bilgi için,strtotime .

Veya daha da kısa:

$new_date = date('d-m-Y', strtotime(your date variable));

27

Ayrıca başka bir belirsiz olasılık:

$oldDate = '2010-03-20'
$arr = explode('-', $oldDate);
$newDate = $arr[2].'-'.$arr[1].'-'.$arr[0];

Kullanıp kullanamayacağımı bilmiyorum ama yine de :)


1
Ben bunu kullanarak sona erdi çünkü bizim uygulamada, alanlardan biri (gün, ay, yıl) bilinmeyen insanlar "99" girecekti. Verilerinizde "sahte" tarihler varsa iyi bir yaklaşım.
Voodoo

18

Not : Bu yazının cevabı bazen iptal edildiğinden, buraya geri dönüp insanlardan artık oy kullanmamalarını rica ediyorum. Cevabım antik, teknik olarak doğru değil ve tam burada birkaç iyi yaklaşım var. Burada sadece tarihi amaçlar için saklıyorum.

Belgeler strtotime işlevini kötü tanımlasa da, @rjmunro yorumunda sorunu doğru bir şekilde ele aldı: ISO biçiminde "YYYY-AA-GG".

Ayrıca, benim Date_Converter işlevi hala çalışıyor olsa da, ben aşağıda kesin ifadeler olabileceği konusunda uyarmak istiyorum, bu yüzden onları dikkate almayın lütfen.

En çok oy verilen cevap aslında yanlış!

PHP strtotime kılavuzu burada "fonksiyonu beklediği bir İngiliz tarih biçimini içeren bir dize verilecek" belirtmektedir. Bunun anlamı, "mdY" veya "m / d / Y" gibi bir Amerikan ABD tarih biçimi beklemesidir.

Bu, "Ymd" olarak verilen bir tarihin yanlış yorumlanabileceği anlamına gelir strtotime. Tarihi beklenen biçimde sağlamalısınız.

Çeşitli biçimlerde tarihleri ​​döndürmek için küçük bir işlev yazdım. İstediğiniz zaman kullanın ve değiştirin. Eğer birisi bunu bir sınıfa dönüştürürse, paylaşılırsa çok sevinirim.

function Date_Converter($date, $locale = "br") {

    # Exception
    if (is_null($date))
        $date = date("m/d/Y H:i:s");

    # Let's go ahead and get a string date in case we've
    # been given a Unix Time Stamp
    if ($locale == "unix")
        $date = date("m/d/Y H:i:s", $date);

    # Separate Date from Time
    $date = explode(" ", $date);

    if ($locale == "br") {
        # Separate d/m/Y from Date
        $date[0] = explode("/", $date[0]);
        # Rearrange Date into m/d/Y
        $date[0] = $date[0][1] . "/" . $date[0][0] . "/" . $date[0][2];
    }

    # Return date in all formats
        # US
        $Return["datetime"]["us"] = implode(" ", $date);
        $Return["date"]["us"]     = $date[0];

        # Universal
        $Return["time"]           = $date[1];
        $Return["unix_datetime"]  = strtotime($Return["datetime"]["us"]);
        $Return["unix_date"]      = strtotime($Return["date"]["us"]);
        $Return["getdate"]        = getdate($Return["unix_datetime"]);

        # BR
        $Return["datetime"]["br"] = date("d/m/Y H:i:s", $Return["unix_datetime"]);
        $Return["date"]["br"]     = date("d/m/Y", $Return["unix_date"]);

    # Return
    return $Return;

} # End Function

2
Okuma, Ceiroa'nın düzeltilmesini seviyorum. Bu, tarihi patlatmak / yerleştirmekten çok daha kolay.
Igor Donin

3
En iyi cevap yanlış. PHP, "YYYY-AA-GG" ISO biçiminde doğru olanı yapar. Bir ABD tarihi olarak yanlış yorumlayamaz, çünkü başlangıçta 4 hane vardır ve ayırıcı olarak / değil kullanır. ISO tarihleri, diğer formatlarla karıştırılmayacak şekilde dikkatle tasarlanmıştır.
rjmunro

14

Bunu uygulamanın iki yolu vardır:

1.

    $date = strtotime(date);
    $new_date = date('d-m-Y', $date);

2.

    $cls_date = new DateTime($date);
    echo $cls_date->format('d-m-Y');


8

Herhangi bir formattan herhangi bir formata dönüştürmek için bu işlevi kullanın

function reformatDate($date, $from_format = 'd/m/Y', $to_format = 'Y-m-d') {
    $date_aux = date_create_from_format($from_format, $date);
    return date_format($date_aux,$to_format);
}

7

Aşağıda, yarının tarihini kullanarak oluşturmak mktime()ve biçimini gg / aa / yyyy biçimine değiştirmek ve daha sonra kullanarak yazdırmak için PHP kodu verilmiştir echo.

$tomorrow = mktime(0, 0, 0, date("m"), date("d") + 1, date("Y"));
echo date("d", $tomorrow) . "/" . date("m", $tomorrow). "/" . date("Y", $tomorrow);

5
date('m/d/Y h:i:s a',strtotime($val['EventDateTime']));

1
Mysql için tarih biçimi Ymd şeklindedir "2014-04-26"
AbdulBasit

2

Biçimi, date () ve strtotime () öğelerini kullanarak değiştirebilirsiniz.

$ date = '18.09.2019';

yankı tarihi ('dm-y', strtotime ($ date));

Sonuç:

18-09-19

Biçimi (dmy) değiştirerek değiştirebiliriz.


1

Bu özel dönüşüm için bir biçim dizesi de kullanabiliriz.

$new = vsprintf('%3$s-%2$s-%1$s', explode('-', $old));

Açıkçası bu, diğer birçok tarih biçimi dönüşümü için işe yaramayacak, ancak bu durumda yalnızca alt dizeleri yeniden düzenlediğimiz için, bunu yapmanın başka bir yolu da var.


Nasıl 2019-10-28T17: 02: 49Z zaman damgası dönüştürmek için?
Bogdan Bogdanov

1
Kullanın strtotime(). :-)
Panik Yapma

1
    function dateFormat($date) {
        $m = preg_replace('/[^0-9]/', '', $date);
        if (preg_match_all('/\d{2}+/', $m, $r)) {
        $r = reset($r);
            if ($r[2] <= 12 && $r[3] <= 31) return "$r[0]$r[1]-$r[2]-$r[3]";// Y-m-d
            if ($r[0] <= 31 && $r[1] != 0 && $r[1] <= 12) return "$r[2]$r[3]-$r[1]-$r[0]";// d-m-Y
            if ($r[0] <= 12 && $r[1] <= 31) return "$r[2]$r[3]-$r[0]-$r[1]";// m-d-Y
            if ($r[2] <= 31 && $r[3] <= 12) return "$r[0]$r[1]-$r[3]-$r[2]";//Y-m-d
        }
    }

var_dump(dateFormat('31/01/2000')); // return 2000-01-31
var_dump(dateFormat('01-31-2000')); // return 2000-01-31
var_dump(dateFormat('2000-31-01')); // return 2000-01-31
var_dump(dateFormat('20003101')); // return 2000-01-31

0

Basit bir şekilde Kullanın strtotime()ve date():

$original_dateTime = "2019-05-11 17:02:07"; #This may be database datetime
$newDate = date("d-m-Y", strtotime($original_dateTime));

Zamanla

$newDate = date("d-m-Y h:i:s a", strtotime($original_dateTime));

0

Kullan date_createvedate_format

Bunu dene.

function formatDate($input, $output){
  $inputdate = date_create($input);
  $output = date_format($inputdate, $output);
  return $output;
}
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.