Strtotime () tidak berfungsi dengan format dd / mm / YYYY

167

Saya sangat suka strtotime()fungsinya, tetapi panduan pengguna tidak memberikan deskripsi lengkap tentang format tanggal yang didukung. strtotime('dd/mm/YYYY')tidak berfungsi, hanya berfungsi dengan mm/dd/YYYYformat.

Jika saya memiliki tanggal dalam dd/mm/YYYYformat, bagaimana saya bisa mengubahnya YYYY-mm-dd? Saya dapat melakukannya dengan menggunakan explode()fungsi, tetapi saya pikir ada solusi yang lebih baik.

Simon
sumber
7
Anda sebenarnya tidak perlu mengonversinya ke format "YYYY-mm-dd" untuk menguraikannya - Anda hanya perlu mengubahnya ke "dd-mm-YYYY", yang dapat dilakukan denganstr_replace('/', '-', $date);
Gavin Coates

Jawaban:

399

Inilah solusi yang disederhanakan:

$date = '25/05/2010';
$date = str_replace('/', '-', $date);
echo date('Y-m-d', strtotime($date));

Hasil:

2010-05-25

The strtotimedokumentasi berbunyi:

Tanggal dalam format m / d / y atau dmy disatukan dengan melihat pemisah antara berbagai komponen: jika pemisah adalah garis miring ( / ), maka m / d / y Amerika diasumsikan; sedangkan jika pemisah adalah tanda hubung ( - ) atau titik ( . ), maka format dmy Eropa diasumsikan.

Trigonometri
sumber
2
@ Web Logika saya tidak dapat dan memahami format standar fungsi strtotime (), jika saya menulis strtotimr ('01 -01-2010 '), apakah ia memahaminya sebagai format dd-mm-YYYY atau mm-dd-YYYY?
Simon
3
Jika Anda mengujinya dengan: echo date('Y-m-l', strtotime('01-01-2010'));Hasilnya adalah 2010-01-Friday. Jadi hari yang akan datang di akhir, tergantung pada bagaimana Anda menentukan format tanggal untuk datefungsi.
1
Meskipun yang Anda poskan di sini benar dan menjawab pertanyaan pengguna - ini adalah cara yang tidak langsung untuk menyelesaikan masalah yang sebenarnya. Agar strtotime () mem-parsing tanggal dengan benar dalam format "dd / mm / yy", Anda perlu mengganti "/" dengan "-". Karena itu, Anda hanya perlu dua baris pertama jawaban: $date = '25/05/2010'; $date = str_replace('/', '-', $date); Baris tambahan tidak diperlukan untuk menyelesaikan masalah Anda.
Gavin Coates
Ini hanya benar jika hari itu> 12: $ date = '1/2/34'; // Tanggal 1 Februari 2034 tanggal gema ('d M Y', strtotime ($ date)); // 02 Jan 2034
kurdtpage
Terima kasih kawan Benar-benar membuat hari saya.
BEingprabhU
64

Anda dapat mem-parsing tanggal dari format khusus (pada PHP 5.3) dengan DateTime :: createFromFormat

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

(Selain: !Digunakan untuk mereset nilai yang tidak ditentukan ke cap waktu Unix, mis. Waktu akan menjadi tengah malam.)


Jika Anda tidak ingin (atau tidak bisa) menggunakan PHP 5.3, maka daftar lengkap format tanggal / waktu yang tersedia yang diterima strtotime tercantum pada halaman manual Format Tanggal . Halaman itu lebih teliti menjelaskan fakta yang m/d/Ydisimpulkan d/m/Y(tetapi Anda bisa, seperti disebutkan dalam jawaban di sini, menggunakan d-m-Y, d.m.Yatau d\tm\tY).


Di masa lalu, saya juga menggunakan quicky yang str_replacedisebutkan dalam jawaban lain, serta mengurai sendiri string tanggal ke dalam format lain seperti

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

Ini adalah solusi yang bagus untuk banyak masalah:

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

}
Jonathan Roy
sumber
16

Dari Langgan STRTOTIME Catatan:

Tanggal dalam format m / d / y atau dmy tidak jelas dengan melihat pemisah antara berbagai komponen: jika pemisah adalah garis miring (/), maka m / d / y Amerika diasumsikan; sedangkan jika pemisah adalah tanda hubung (-) atau titik (.), maka format dmy Eropa diasumsikan.

Sesederhana itu.

L. Smit
sumber
Kita bisa menerapkannya karena mereka tidak akan memberikan kesalahan tetapi ketika saya memeriksa $tdan $t1menunjukkan hasil yang berbeda. Saya memeriksa seperti ini. $t=strtotime(date('d-m-Y'));dan $t1=strtotime(date('m/d/Y'));
vusan
3

tercepat mungkin seharusnya

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

ini akan menghasilkan false jika formatnya tidak seperti yang seharusnya, tetapi tidak akan memeriksa apakah tanggalnya valid

tengkorak tengkorak
sumber
2

Saya belum menemukan solusi yang lebih baik. Anda dapat menggunakan explode(), preg_match_all(), dll

Saya memiliki fungsi pembantu statis seperti ini

class Date {

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

    }

}

Mungkin ada nama yang lebih baik untuk itu, tetapi saya menggunakan ausStrToTime()karena itu bekerja dengan tanggal Australia (yang saya sering berurusan dengan, menjadi orang Australia). Nama yang lebih baik mungkin akan menjadi nama standar, tapi saya tidak yakin apa itu.

alex
sumber
2

Saya mencoba mengubah format ddmmyy ke date("Y-m-d"format tetapi tidak berfungsi ketika saya langsung lulusddmmyy =date('dmy')

kemudian menyadari itu harus dalam format yyyy-mm-dd begitu. substring digunakan untuk mengatur

$strParam = '20'.substr($_GET['date'], 4, 2).'-'.substr($_GET['date'], 2, 2).'-'.substr($_GET['date'], 0, 2);  

lalu diteruskan ke date("Y-m-d",strtotime($strParam));

itu berhasil!

smakintel.com
sumber
2

$srchDate = date_format(date_create_from_format('d/m/Y', $srchDate), 'Y/m/d');

Ini akan bekerja untuk Anda. Anda mengonversi String menjadi format tanggal khusus tempat Anda dapat menentukan ke PHP apa format asli dari String tersebut yang telah diberikan kepadanya. Sekarang format tanggal, Anda bisa mengonversinya ke format tanggal default PHP, yang sama dengan yang digunakan oleh MySQL.

Fi Horan
sumber
solusi terbersih dan terbaik
Marco Marsala
1

Apakah Anda mendapatkan nilai ini dari database? Jika demikian, pertimbangkan untuk memformatnya di database (gunakan date_formatdi mysql, misalnya). Jika tidak, meledak nilainya mungkin merupakan taruhan terbaik, karena strtotime sepertinya tidak menghargai nilai dd / mm / yyyy.

Joseph Mastey
sumber
1

Jika Anda tahu itu dalam dd / mm / YYYY, Anda dapat melakukan:

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

Ini akan cocok dengan tanggal dalam bentuk d / m / YY atau dd / mm / YYYY (atau kombinasi keduanya) ...

Jika Anda ingin mendukung lebih banyak pemisah dari sekadar /, Anda dapat mengubah regex menjadi:

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

Dan kemudian tambahkan karakter yang Anda inginkan ke dalam [/-]bit (Catatan, - karakter harus yang terakhir)

ircmaxell
sumber
Tentunya regex Anda harus digunakan \duntuk digit desimal daripada [/d]untuk karakter garis miring atau d .
salathe
1

Solusi ini lebih sederhana dan lebih elegan daripada meledak:

$my_date = str_replace("/", ".", $my_date);
$my_date = strtotime($my_date);
$my_date = date("Y-m-d", $my_date);

Anda tidak perlu tahu format apa yang Anda dapatkan tanggalnya, tetapi jika disertai dengan garis miring, mereka diganti dengan berhenti penuh dan diperlakukan sebagai Eropa oleh strtotime.

pengguna2623027
sumber
0

Solusi paling sederhana adalah ini:

$date    = '07/28/2010';
$newdate = date('Y-m-d', strtotime($date));
secara sederhana_jhen
sumber
3
Ini salah. Pertanyaannya secara eksplisit terkait dengan input hh / mm / tttt.
Matt Fletcher
0

Ini solusinya saya menggunakan bahkan jika nol terkemuka ada di sana.

<?php
 $date = '05/05/2017';
 $date = str_replace('/', '-', $date);
 $date = date('Y-m-d', strtotime($date));

 echo $date;
?>
Nandhini
sumber
0

$ date_info = '20 / 02/2019 '; tanggal gema ('Ym-d', strtotime (str_replace ('/', '-', $ date_info)));

nazmulhaqued
sumber
0

Sesederhana ini

date('Y-m-d H:i:s', strtotime( str_replace('/', '-', $from_date ) ) );
Prajwol KC
sumber