Strtotime () gg / aa / YYYY biçiminde çalışmıyor

9 Cevap

Gerçekten strtotime() fonksiyonu, ancak kılavuzdaki gibi desteklenen tarih biçimleri tam bir açıklama vermez. Strtotime ('gg / aa / YYYY') it aa / gg / YYYY biçiminde yalnızca çalışır çalışmaz.

If I have date in dd/mm/YYYY format, how can I convert it to YYYY-mm-dd? I can do it by using explode() function, but I think there are better solutions.

9 Cevap

Sen DateTime::createFromFormat ile (PHP 5.3 gibi) özel bir biçiminden tarihleri ​​ayrıştırmak

$timestamp = DateTime::createFromFormat('!d/m/Y', '23/05/2010')->getTimestamp();

(Aside: The !, Unix zaman damgası, yani olmayan belirtilen değerleri sıfırlamak için kullanılır. zaman gece yarısı olacaktır.)


Eğer istemediğiniz (ya da değil) PHP 5.3, Date Formats manual page. That page more thoroughly describes the fact that m/d/Y üzerine olayla {[listelenen strtotime kabul mevcut tarih / saat biçimleri sonra tam bir listesini kullanırsanız (2)]} (ama, cevapları burada belirtildiği gibi, [(3)]} {d.m.Y veya d\tm\tY kullanabilirsiniz).


Geçmişte, ben de quicky str_replace başka bir yanıt belirtildiği gibi başvurdu ettik kendini ayrıştırma gibi başka bir biçime tarih dizesi

$subject   = '23/05/2010';
$formatted = vsprintf('%3$04d/%2$02d/%1$02d', sscanf($subject,'%02d/%02d/%04d'));
$timestamp = strtotime($formatted);

From the STRTOTIME writeup Note:

Ayırıcı bir çizgi (/) ise, o zaman, Amerikan m / d / y varsayılır;: m Tarih / d / y ya da dmy biçimleri, çeşitli bileşenler arasındaki ayırıcı bakarak belirsizlikler giderilmelidir edilir (-) (). ayırıcı bir çizgi ise, ya da bir nokta ise, daha sonra, Avrupa dmy biçiminde kabul edilir.

Bu kadar basit.

Muhtemelen hızlı olmalıdır

false!== ($date !== $date=preg_replace(';[0-2]{2}/[0-2]{2}/[0-2]{2};','$3-$2-$1',$date))

biçimi uygun gibi görünmüyor eğer bu yanlış dönecektir, ancak tarih geçerlidir wether alışkanlık kontrol

Ben daha iyi bir çözüm bulamadı. Bu explode(), preg_match_all(), vb kullanabilir

Ben böyle bir statik yardımcı işlevi var

class Date {

    public static function ausStrToTime($str) {
        $dateTokens = explode('/', $str);
        return strtotime($dateTokens[1] . '/' . $dateTokens[0] . '/' . $dateTokens[2]); 

    }

}

Orada bunun için daha iyi bir isim muhtemelen, ama (ben sık sık uğraşmak, bir Avustralyalı olma) Avustralya tarihleri ​​ile çalışır çünkü ausStrToTime() kullanın. Daha iyi bir isim muhtemelen standart bir isim olurdu, ama ben ne olduğunu emin değilim.

Bir veritabanından bu değeri alıyor musunuz? Eğer öyleyse, veritabanında biçimlendirme düşünün (örneğin mysql kullanımı date_format,). Değilse strtotime sadece gg / aa / yyyy değerlerini takdir görünmüyor çünkü, değeri patlayan, en iyi bahis olabilir.

Eğer gg / aa / YYYY biliyorum varsa, bunu yapabilirsiniz:

    $regex = '#([/d]{1,2})/([/d]{1,2})/([/d]{2,4})#';
    $match = array();
    if (preg_match($regex, $date, $match)) {
        if (strlen($match[3]) == 2) {
            $match[3] = '20' . $match[3];
        }
        return mktime(0, 0, 0, $match[2], $match[1], $match[3]);
    }
    return strtotime($date);

Bu formu d / m / YY veya gg / aa / YYYY (veya iki herhangi bir kombinasyonu) tarihleri ​​maç olacak ...

Sadece / daha ayırıcılar desteklemek istiyorsanız, size regex değiştirebilirsiniz:

    $regex = '#([\d]{1,2})[/-]([\d]{1,2})[/-]([\d]{2,4})#';

Ve sonra [/-] bit (- karakteri son olması gerekir Not) sizi içine istediğiniz herhangi bir karakter eklemek

Bu pek çok sorun için iyi bir çözümdür:

function datetotime ($date, $format = 'YYYY-MM-DD') {

if ($format == 'YYYY-MM-DD') list($year, $month, $day) = explode('-', $date);
if ($format == 'YYYY/MM/DD') list($year, $month, $day) = explode('/', $date);
if ($format == 'YYYY.MM.DD') list($year, $month, $day) = explode('.', $date);

if ($format == 'DD-MM-YYYY') list($day, $month, $year) = explode('-', $date);
if ($format == 'DD/MM/YYYY') list($day, $month, $year) = explode('/', $date);
if ($format == 'DD.MM.YYYY') list($day, $month, $year) = explode('.', $date);

if ($format == 'MM-DD-YYYY') list($month, $day, $year) = explode('-', $date);
if ($format == 'MM/DD/YYYY') list($month, $day, $year) = explode('/', $date);
if ($format == 'MM.DD.YYYY') list($month, $day, $year) = explode('.', $date);

return mktime(0, 0, 0, $month, $day, $year);

}

Basit çözüm şudur:

$date    = '07/28/2010';
$newdate = date('Y-m-d', strtotime($date));