Konversi satu format tanggal ke format lain dalam PHP

336

Apakah ada cara sederhana untuk mengubah satu format tanggal menjadi format tanggal lain di PHP?

Aku punya ini:

$old_date = date('y-m-d-h-i-s');            // works

$middle = strtotime($old_date);             // returns bool(false)

$new_date = date('Y-m-d H:i:s', $middle);   // returns 1970-01-01 00:00:00

Tapi tentu saja saya lebih suka mengembalikan tanggal saat ini daripada celah fajar. Apa yang saya lakukan salah?

Tom
sumber

Jawaban:

293

Parameter kedua date()harus berupa cap waktu yang tepat (detik sejak 1 Januari 1970). Anda melewatkan string, yang tanggal () tidak dapat dikenali.

Anda dapat menggunakan strtotime () untuk mengubah string tanggal menjadi stempel waktu. Namun, bahkan strtotime () tidak mengenali y-m-d-h-i-sformat.

PHP 5.3 dan lebih tinggi

Gunakan DateTime::createFromFormat. Ini memungkinkan Anda untuk menentukan mask yang tepat - menggunakan date()sintaks - untuk mengurai tanggal string masuk dengan.

PHP 5.2 dan lebih rendah

Anda harus mengurai elemen (tahun, bulan, hari, jam, menit, detik) secara manual menggunakan substr()dan menyerahkan hasilnya ke mktime () yang akan membuat Anda cap waktu.

Tapi itu banyak pekerjaan! Saya sarankan menggunakan format berbeda yang dapat dimengerti strftime (). strftime () memahami setiap tanggal pendek masukan dari the next time joe will slip on the ice. misalnya, ini berfungsi:

$old_date = date('l, F d y h:i:s');              // returns Saturday, January 30 10 02:06:34
$old_date_timestamp = strtotime($old_date);
$new_date = date('Y-m-d H:i:s', $old_date_timestamp);   
Pekka
sumber
Terima kasih Pekka, baru saja mengedit pertanyaan saya, mencobanya tetapi sepertinya tidak berhasil.
Tom
Saya mengedit jawabannya ketika Anda menerimanya :) Saya menambahkan beberapa contoh dan referensi.
Pekka
Gotcha, memang itulah masalahnya. Itu nama file tetap yang harus saya konversi kembali menjadi tanggal (harus dalam format itu), jadi saya akan mencari solusinya.
Tom
Catatan: Menurut php.net DateTimeada sejak PHP 5.2 dalam inti PHP dan dukungan eksperimental untuk DateTimedapat diaktifkan untuk PHP 5.1 saat dikompilasi. secure.php.net/manual/en/datetime.installation.php
Charlotte Dunois
108

Cara termudah untuk melakukannya adalah

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

Anda pertama kali memberinya format $ dateString. Kemudian Anda mengatakan format yang Anda inginkan $ newDateString.

Ini juga menghindari penggunaan strtotime, yang kadang-kadang sulit diatasi.

Jika Anda tidak mengubah dari satu format tanggal ke yang lain, tetapi hanya ingin tanggal saat ini (atau datetime) dalam format tertentu maka itu bahkan lebih mudah:

$now = new DateTime();
$timestring = $now->format('Y-m-d h:i:s');

Pertanyaan lain ini juga merujuk ke topik yang sama: Konversi format tanggal yyyy-mm-dd => dd-mm-yyyy .

ceiroa
sumber
Dan bagaimana itu duplikat jika saya mengajukan pertanyaan sebelum yang Anda maksud?
Tom
1
Saya sudah mengedit responsnya. Saya hanya ingin menunjukkan bahwa kedua pertanyaan ini harus dihubungkan entah bagaimana.
ceiroa
tersedia di dalam php 5.3+
Zorox
$timestring = $now->format('Y-m-d h:i:s');pasti? mselama berbulan-bulan, iselama beberapa menit
Mark Baker
@madlopt ~ metode statis: secure.php.net/manual/en/language.oop5.static.php
ceiroa
53

Dasar

Cara simplist untuk mengkonversi satu format tanggal ke yang lain adalah dengan menggunakan strtotime()dengan date(). strtotime()akan mengubah tanggal menjadi Cap Waktu Unix . Stempel Waktu Unix itu kemudian dapat diteruskan ke date()untuk mengubahnya menjadi format baru.

$timestamp = strtotime('2008-07-01T22:35:17.02');
$new_date_format = date('Y-m-d H:i:s', $timestamp);

Atau sebagai one-liner:

$new_date_format = date('Y-m-d H:i:s', strtotime('2008-07-01T22:35:17.02'));

Ingatlah bahwa strtotime()tanggal harus dalam format yang valid . Kegagalan untuk memberikan format yang valid akan menghasilkan strtotime()false kembali yang akan menyebabkan tanggal Anda menjadi 1969-12-31.

Menggunakan DateTime()

Pada PHP 5.2, PHP menawarkan DateTime()kelas yang menawarkan alat yang lebih kuat untuk bekerja dengan tanggal (dan waktu). Kami dapat menulis ulang kode di atas menggunakan DateTime():

$date = new DateTime('2008-07-01T22:35:17.02');
$new_date_format = $date->format('Y-m-d H:i:s');

Bekerja dengan cap waktu Unix

date() mengambil timeatamp Unix sebagai parameter kedua dan mengembalikan tanggal yang diformat untuk Anda:

$new_date_format = date('Y-m-d H:i:s', '1234567890');

DateTime () berfungsi dengan cap waktu Unix dengan menambahkan @sebelum cap waktu:

$date = new DateTime('@1234567890');
$new_date_format = $date->format('Y-m-d H:i:s');

Jika cap waktu yang Anda miliki dalam milidetik (mungkin berakhir pada 000dan / atau cap waktu tiga belas karakter) Anda harus mengonversinya menjadi detik sebelum Anda dapat mengubahnya ke format lain. Ada dua cara untuk melakukan ini:

  • Potong tiga angka terakhir menggunakan substr()

Memotong tiga digit terakhir dapat dicapai dengan beberapa cara, tetapi menggunakan substr()adalah yang paling mudah:

$timestamp = substr('1234567899000', -3);
  • Bagi bidang dengan 1000

Anda juga dapat mengubah timestamp menjadi detik dengan membaginya dengan 1000. Karena timestamp terlalu besar untuk sistem 32 bit untuk mengerjakan matematika, Anda perlu menggunakan perpustakaan BCMath untuk melakukan matematika sebagai string:

$timestamp = bcdiv('1234567899000', '1000');

Untuk mendapatkan Cap Waktu Unix Anda dapat menggunakan strtotime()yang mengembalikan Cap Waktu Unix:

$timestamp = strtotime('1973-04-18');

Dengan DateTime () Anda dapat menggunakan DateTime::getTimestamp()

$date = new DateTime('2008-07-01T22:35:17.02');
$timestamp = $date->getTimestamp();

Jika Anda menjalankan PHP 5.2, Anda dapat menggunakan Uopsi pemformatan:

$date = new DateTime('2008-07-01T22:35:17.02');
$timestamp = $date->format('U');

Bekerja dengan format tanggal yang tidak standar dan ambigu

Sayangnya tidak semua tanggal yang harus dikerjakan pengembang dalam format standar. Untungnya PHP 5.3 memberi kami solusi untuk itu. DateTime::createFromFormat()memungkinkan kita memberi tahu PHP apa format string tanggal sehingga dapat dengan mudah diuraikan menjadi objek DateTime untuk manipulasi lebih lanjut.

$date = DateTime::createFromFormat('F-d-Y h:i A', 'April-18-1973 9:48 AM');
$new_date_format = $date->format('Y-m-d H:i:s');

Di PHP 5.4 kami memperoleh kemampuan untuk melakukan akses anggota kelas di instantiation telah ditambahkan yang memungkinkan kami untuk mengubah DateTime()kode kami menjadi satu-baris:

$new_date_format = (new DateTime('2008-07-01T22:35:17.02'))->format('Y-m-d H:i:s');

$new_date_format = DateTime::createFromFormat('F-d-Y h:i A', 'April-18-1973 9:48 AM')->format('Y-m-d H:i:s');
John Conde
sumber
27

Coba ini:

$old_date = date('y-m-d-h-i-s');
$new_date = date('Y-m-d H:i:s', strtotime($old_date));
Sarfraz
sumber
Tidak akan berfungsi, strtotime () tidak mengenali format. Baru mencoba.
Pekka
setuju, saya hanya memasukkan kode format dari penanya, harus ada format yang tepat ditentukan.
Sarfraz
Ini berhasil untuk saya. $ Old_date saya kira-kira seperti ini 2012-05-22T19: 16: 37 + 01: 00. Ngomong-ngomong, terima kasih!
VishwaKumar
15

Untuk mengkonversi $datedari dd-mm-yyyy hh:mm:sske datetime MySQL yang tepat saya pergi seperti ini:

$date = DateTime::createFromFormat('d-m-Y H:i:s',$date)->format('Y-m-d H:i:s');
Jelle de Fries
sumber
4
Anda tidak boleh menggunakan metode ini kecuali 110% yakin $ date adalah tanggal yang valid dan sesuai dengan format. Dengan itu dikatakan, tanggal yang tidak valid yang tidak sama persis dengan format akan kembali: Fatal error: Call to a member function format() on a non-object. Hanya kepala!
Setengah Crazed
Benar, solusi yang lebih baik adalah melakukannya dalam 3 langkah dengan cek nol sebagai langkah tengah.
Jelle de Fries
11

Berikut ini adalah metode mudah untuk mengonversi tanggal ke format yang berbeda.

// Create a new DateTime object
$date = DateTime::createFromFormat('Y-m-d', '2016-03-25');

// Output the date in different formats
echo $date->format('Y-m-d')."\n";
echo $date->format('d-m-Y')."\n";
echo $date->format('m-d-Y')."\n";
Peter
sumber
10
$old_date = date('y-m-d-h-i-s');       // works

Anda melakukan kesalahan di sini, ini seharusnya

$old_date = date('y-m-d h:i:s');       // works

pemisah waktu adalah ':'


Saya pikir ini akan membantu ...

$old_date = date('y-m-d-h-i-s');              // works

preg_match_all('/(\d+)-(\d+)-(\d+)-(\d+)-(\d+)-(\d+)/', $old_date, $out, PREG_SET_ORDER);
$out = $out[0];
$time = mktime($out[4], $out[5], $out[6], $out[2], $out[3], $out[1]);

$new_date = date('Y-m-d H:i:s', $time); 

ATAU


$old_date = date('y-m-d-h-i-s');              // works

$out = explode('-', $old_date);
$time = mktime($out[3], $out[4], $out[5], $out[1], $out[2], $out[0]);

$new_date = date('Y-m-d H:i:s', $time); 
Rifat
sumber
Ya, tentu terima kasih, ini adalah nama file GUID yang ingin saya konversi kembali ke format tanggal yang tepat.
Tom
8

Cara asli ini akan membantu mengonversi format apa pun yang dimasukkan ke format yang diinginkan.

$formatInput = 'd-m-Y'; //Give any format here, this would be converted into your format
$dateInput = '01-02-2018'; //date in above format

$formatOut = 'Y-m-d'; // Your format
$dateOut = DateTime::createFromFormat($formatInput, $dateInput)->format($formatOut);
Nishad Up
sumber
7

Anda perlu mengubah $ old_date kembali menjadi stempel waktu, karena fungsi tanggal memerlukan stempel waktu sebagai argumen kedua.

John Parker
sumber
7

strtotime akan menyelesaikannya. tanggalnya tidak sama dan semuanya dalam format-us.

<?php
$e1 = strtotime("2013-07-22T12:00:03Z");
echo date('y.m.d H:i', $e1);
echo "2013-07-22T12:00:03Z";

$e2 = strtotime("2013-07-23T18:18:15Z");
echo date ('y.m.d H:i', $e2);
echo "2013-07-23T18:18:15Z";

$e1 = strtotime("2013-07-21T23:57:04Z");
echo date ('y.m.d H:i', $e2);
echo "2013-07-21T23:57:04Z";
?>
de_nuit
sumber
5

Coba ini:

$tempDate = explode('-','03-23-15');
$date = '20'.$tempDate[2].'-'.$tempDate[0].'-'.$tempDate[1];
anggur
sumber
5

Ini dipecahkan untuk saya,

$old = '18-04-2018';
$new = date('Y-m-d', strtotime($old));
echo $new;

Output: 2018-04-18

Ashokkumar C
sumber
2

Ini adalah cara lain Anda dapat mengonversi format tanggal

 <?php
$pastDate = "Tuesday 11th October, 2016";
$pastDate = str_replace(",","",$pastDate);

$date = new DateTime($pastDate);
$new_date_format = $date->format('Y-m-d');

echo $new_date_format.' 23:59:59'; ?>
Varun Malhotra
sumber
1

Hanya menggunakan string, bagi saya adalah solusi yang bagus, lebih sedikit masalah dengan mysql. Mendeteksi format saat ini dan mengubahnya jika perlu, solusi ini hanya untuk format Spanyol / Perancis dan format bahasa Inggris, tanpa menggunakan fungsi waktu dat php.

class dateTranslator {

 public static function translate($date, $lang) {
      $divider = '';

      if (empty($date)){
           return null;   
      }
      if (strpos($date, '-') !== false) {
           $divider = '-';
      } else if (strpos($date, '/') !== false) {
           $divider = '/';
      }
      //spanish format DD/MM/YYYY hh:mm
      if (strcmp($lang, 'es') == 0) {

           $type = explode($divider, $date)[0];
           if (strlen($type) == 4) {
                $date = self::reverseDate($date,$divider);
           } 
           if (strcmp($divider, '-') == 0) {
                $date = str_replace("-", "/", $date);
           }
      //english format YYYY-MM-DD hh:mm
      } else {

           $type = explode($divider, $date)[0];
           if (strlen($type) == 2) {

                $date = self::reverseDate($date,$divider);
           } 
           if (strcmp($divider, '/') == 0) {
                $date = str_replace("/", "-", $date);

           }   
      }
      return $date;
 }

 public static function reverseDate($date) {
      $date2 = explode(' ', $date);
      if (count($date2) == 2) {
           $date = implode("-", array_reverse(preg_split("/\D/", $date2[0]))) . ' ' . $date2[1];
      } else {
           $date = implode("-", array_reverse(preg_split("/\D/", $date)));
      }

      return $date;
 }

MENGGUNAKAN

dateTranslator::translate($date, 'en')
Alejandro Aranda
sumber
1

Saya tahu ini sudah tua, tetapi, ketika bertemu dengan vendor yang secara tidak konsisten menggunakan 5 format tanggal yang berbeda di API mereka (dan menguji server dengan berbagai versi PHP mulai dari 5 hingga 7 terbaru), saya memutuskan untuk menulis konverter universal yang bekerja dengan berbagai versi PHP.

Konverter ini akan mengambil hampir semua input, termasuk format datetime standar apa pun (termasuk dengan atau tanpa milidetik) dan representasi Epoch Time (termasuk dengan atau tanpa milidetik) dan mengubahnya menjadi hampir semua format lain.

Untuk menyebutnya:

$TheDateTimeIWant=convertAnyDateTome_toMyDateTime([thedateIhave],[theformatIwant]);

Mengirim null untuk format akan membuat fungsi mengembalikan datetime dalam Epoch / Unix Time. Kalau tidak, kirim string format apa pun yang didukung date (), juga dengan ".u" selama milidetik (saya juga menangani milidetik, meskipun date () mengembalikan nol).

Ini kodenya:

        <?php   
        function convertAnyDateTime_toMyDateTime($dttm,$dtFormat)
        {
            if (!isset($dttm))
            {
                return "";
            }
            $timepieces = array();
            if (is_numeric($dttm))
            {
                $rettime=$dttm;
            }
            else
            {
                $rettime=strtotime($dttm);
                if (strpos($dttm,".")>0 and strpos($dttm,"-",strpos($dttm,"."))>0)
                {
                    $rettime=$rettime.substr($dttm,strpos($dttm,"."),strpos($dttm,"-",strpos($dttm,"."))-strpos($dttm,"."));
                    $timepieces[1]="";
                }
                else if (strpos($dttm,".")>0 and strpos($dttm,"-",strpos($dttm,"."))==0)
                {               
                    preg_match('/([0-9]+)([^0-9]+)/',substr($dttm,strpos($dttm,"."))." ",$timepieces);
                    $rettime=$rettime.".".$timepieces[1];
                }
            }

            if (isset($dtFormat))
            {
                // RETURN as ANY date format sent
                if (strpos($dtFormat,".u")>0)       // Deal with milliseconds
                {
                    $rettime=date($dtFormat,$rettime);              
                    $rettime=substr($rettime,0,strripos($rettime,".")+1).$timepieces[1];                
                }
                else                                // NO milliseconds wanted
                {
                    $rettime=date($dtFormat,$rettime);
                }
            }
            else
            {
                // RETURN Epoch Time (do nothing, we already built Epoch Time)          
            }
            return $rettime;    
        }
    ?>

Berikut ini beberapa contoh panggilan - Anda akan mencatatnya juga menangani data zona waktu apa pun (meskipun seperti yang disebutkan di atas, setiap waktu non GMT dikembalikan di zona waktu Anda).

        $utctime1="2018-10-30T06:10:11.2185007-07:00";
        $utctime2="2018-10-30T06:10:11.2185007";
        $utctime3="2018-10-30T06:10:11.2185007 PDT";
        $utctime4="2018-10-30T13:10:11.2185007Z";
        $utctime5="2018-10-30T13:10:11Z";
        $dttm="10/30/2018 09:10:11 AM EST";

        echo "<pre>";
        echo "<b>Epoch Time to a standard format</b><br>";
        echo "<br>Epoch Tm: 1540905011    to STD DateTime     ----RESULT: ".convertAnyDateTime_toMyDateTime("1540905011","Y-m-d H:i:s")."<hr>";
        echo "<br>Epoch Tm: 1540905011          to UTC        ----RESULT: ".convertAnyDateTime_toMyDateTime("1540905011","c");
        echo "<br>Epoch Tm: 1540905011.2185007  to UTC        ----RESULT: ".convertAnyDateTime_toMyDateTime("1540905011.2185007","c")."<hr>";
        echo "<b>Returned as Epoch Time (the number of seconds that have elapsed since 00:00:00 Thursday, 1 January 1970, Coordinated Universal Time (UTC), minus leap seconds.)";
        echo "</b><br>";
        echo "<br>UTCTime1: ".$utctime1." ----RESULT: ".convertAnyDateTime_toMyDateTime($utctime1,null);
        echo "<br>UTCTime2: ".$utctime2."       ----RESULT: ".convertAnyDateTime_toMyDateTime($utctime2,null);
        echo "<br>UTCTime3: ".$utctime3."   ----RESULT: ".convertAnyDateTime_toMyDateTime($utctime3,null);
        echo "<br>UTCTime4: ".$utctime4."      ----RESULT: ".convertAnyDateTime_toMyDateTime($utctime4,null);
        echo "<br>UTCTime5: ".$utctime5."              ----RESULT: ".convertAnyDateTime_toMyDateTime($utctime5,null);
        echo "<br>NO MILIS: ".$dttm."        ----RESULT: ".convertAnyDateTime_toMyDateTime($dttm,null);
        echo "<hr>";
        echo "<hr>";
        echo "<b>Returned as whatever datetime format one desires</b>";
        echo "<br>UTCTime1: ".$utctime1." ----RESULT: ".convertAnyDateTime_toMyDateTime($utctime1,"Y-m-d H:i:s")."              Y-m-d H:i:s";
        echo "<br>UTCTime2: ".$utctime2."       ----RESULT: ".convertAnyDateTime_toMyDateTime($utctime2,"Y-m-d H:i:s.u")."      Y-m-d H:i:s.u";
        echo "<br>UTCTime3: ".$utctime3."   ----RESULT: ".convertAnyDateTime_toMyDateTime($utctime3,"Y-m-d H:i:s.u")."      Y-m-d H:i:s.u";
        echo "<p><b>Returned as ISO8601</b>";
        echo "<br>UTCTime3: ".$utctime3."   ----RESULT: ".convertAnyDateTime_toMyDateTime($utctime3,"c")."        ISO8601";
        echo "</pre>";

Inilah hasilnya:

Epoch Tm: 1540905011                        ----RESULT: 2018-10-30 09:10:11

Epoch Tm: 1540905011          to UTC        ----RESULT: 2018-10-30T09:10:11-04:00
Epoch Tm: 1540905011.2185007  to UTC        ----RESULT: 2018-10-30T09:10:11-04:00
Returned as Epoch Time (the number of seconds that have elapsed since 00:00:00 Thursday, 1 January 1970, Coordinated Universal Time (UTC), minus leap seconds.)

UTCTime1: 2018-10-30T06:10:11.2185007-07:00 ----RESULT: 1540905011.2185007
UTCTime2: 2018-10-30T06:10:11.2185007       ----RESULT: 1540894211.2185007
UTCTime3: 2018-10-30T06:10:11.2185007 PDT   ----RESULT: 1540905011.2185007
UTCTime4: 2018-10-30T13:10:11.2185007Z      ----RESULT: 1540905011.2185007
UTCTime5: 2018-10-30T13:10:11Z              ----RESULT: 1540905011
NO MILIS: 10/30/2018 09:10:11 AM EST        ----RESULT: 1540908611
Returned as whatever datetime format one desires
UTCTime1: 2018-10-30T06:10:11.2185007-07:00 ----RESULT: 2018-10-30 09:10:11              Y-m-d H:i:s
UTCTime2: 2018-10-30T06:10:11.2185007       ----RESULT: 2018-10-30 06:10:11.2185007      Y-m-d H:i:s.u
UTCTime3: 2018-10-30T06:10:11.2185007 PDT   ----RESULT: 2018-10-30 09:10:11.2185007      Y-m-d H:i:s.u
Returned as ISO8601
UTCTime3: 2018-10-30T06:10:11.2185007 PDT   ----RESULT: 2018-10-30T09:10:11-04:00        ISO8601

Satu-satunya hal yang tidak ada dalam versi ini adalah kemampuan untuk memilih zona waktu yang Anda inginkan dalam datetime yang dikembalikan. Awalnya, saya menulis ini untuk mengubah datetime apa pun menjadi Epoch Time, jadi, saya tidak memerlukan dukungan zona waktu. Sepele untuk ditambahkan.

Robert Mauro
sumber