Konversi format tanggal dalam PHP


489

Saya mencoba mengonversi tanggal dari yyyy-mm-dd menjadi dd-mm-yyyy(tetapi tidak dalam SQL); namun saya tidak tahu bagaimana fungsi tanggal membutuhkan cap waktu, dan saya tidak bisa mendapatkan cap waktu dari string ini.

Bagaimana ini mungkin?


21
dd-mm-yyyy adalah format standar di (sebagian besar) Eropa setidaknya ketika Anda perlu menyajikan data kepada pengguna.
Matteo Riva

7
dd-mm-yyyy di Australia dan Selandia Baru juga
Hari Jonathan

2
mm-hh-tttt di Amerika Serikat. @stesch: yang pertama adalah standar dalam SQL. Saya tidak yakin itu standar di negara mana pun. :)
Herbert

10
Sebenarnya, standarnya adalah yyyy-mm-dd sesuai dengan ISO 8601 .
Jezen Thomas

7
"Standar" global adalah yyyy-mm-dd, dan harus selalu digunakan oleh sistem sedapat mungkin. Hari pesanan, bulan, tahun digunakan oleh orang-orang di sebagian besar dunia (kecuali AS), tetapi biasanya dengan garis miring, bukan tanda hubung. Untuk menghindari kebingungan, saya hanya memisahkan YYYY-MM-DD dengan tanda hubung. Format tanggal lain yang akan saya pisahkan dengan garis miring. Ini membuat semuanya konsisten.
rjmunro

Jawaban:


1057

Gunakan strtotime()dan date():

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

(Lihat dokumentasi strtotime dan tanggal di situs PHP.)

Perhatikan bahwa ini adalah solusi cepat untuk pertanyaan awal. Untuk konversi yang lebih luas, Anda harus benar-benar menggunakan DateTimekelas untuk mem-parsing dan memformat :-)


14
Bagaimana jika saya mendapatkan tanggal ini 0000-00-00 dari mySQL? mengembalikan tanggal yang salah seperti 31/12/1969 ...
Enrique

3
@ Enrique: Jika Anda mendapatkan 000-00-00 dari MySQL, Anda harus mengujinya terlebih dahulu sebelum memasukkannya melalui konversi. Sederhana.
ShadowStorm

1
@SobinAugustine et al: strtotime () akan mengubah string tanggal menjadi "Cap waktu Unix (jumlah detik sejak 1 Januari 1970 00:00:00 UTC)", format tanggal () dapat memahami dan kemudian mengkonversi dari. Jadi ini tidak akan bekerja dengan cap waktu sebelum 1970.
Samuel Lindblom

1
@SamuelLindblom tidak, tidak seperti itu, ini akan berfungsi sebelum tahun 1970.
Sobin Augustine

1
@ SobinAugustine: Anda benar. Namun itu tidak akan berfungsi sebelum 1901-12-14 sehingga masih berlaku mengapa tanggal yang tercantum di atas tidak berfungsi.
Samuel Lindblom

271

Jika Anda ingin menghindari konversi strtotime (misalnya, strtotime tidak dapat mem-parsing input Anda), Anda dapat menggunakan,

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

Atau, yang setara:

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

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

Atau jika sumber-format selalu "Ymd" (yyyy-mm-dd), maka cukup gunakan DateTime :

<?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
Terima kasih atas DateTime::createFromFormat()- ini benar-benar lebih berguna daripadastrtotime()
Gtx

2
NB: PHP 5.3+ diperlukan untuk dua metode pertama.
Salman von Abbas

Terima kasih atas opsi DateTime yang baru. Itu bekerja dan merupakan pilihan yang sangat bersih.
Nina Morena

1
strtotime()berguna untuk mengubah format tipe benar (Ymd) ke format lain, tetapi DateTime::createFromFormat()bersifat universal. Ini seperti STR_TO_DATEdi MySQL
Taron Saribekyan

Yang ini benar-benar bekerja untuk saya Alih-alih Omong kosongstrtotime()
Code Cooker

72

Menggunakan:

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

Tanpa tanggal konversi overhead, saya tidak yakin itu akan berarti banyak.


Ya, dijawab saat Anda mengirimkan milik Anda, saya percaya. Tentu saja pengecekan kesalahan yang ditemukan di strtotime mungkin sesuatu yang bermanfaat.
Tim Lytle

2
Bermanfaat bagi saya dalam mengonversi format tanggal non-Amerika ... dd-mm-yyyy => yyyy-mm-dd Lihat php.net/manual/en/datetime.formats.date.php
Chris Jacob

5
Jangan Memahami mengapa jawaban ini memiliki lebih sedikit suara. Itu harus jawaban pilihan teratas. Ini memecahkan masalah dengan sederhana dan cepat tanpa masalah. Terima kasih
Naeem Ul Wahhab

2
Anda bahkan dapat memanggilnya lagi jika Anda perlu membalik format tanggal ke bentuk aslinya. Jawaban terbaik memang. :)
Pedro Araujo Jorge

1
ini harus diubah sebagai jawaban yang diterima, itu menyelesaikan semua masalah tanggal-waktu menggunakan format tanggal dan tanggal.
Matteo Bononi 'peorthyr'

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

Kode ini berfungsi untuk setiap format tanggal.

Anda dapat mengubah urutan variabel pengganti seperti $ 3- $ 1- $ 2 karena format tanggal lama Anda.


Terima kasih banyak!
Lê Văn Chiến

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

Untuk lebih lanjut, lihat dokumentasi untukstrtotime .

Atau bahkan lebih pendek:

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

27

Juga kemungkinan lain yang tidak jelas:

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

Saya tidak tahu apakah saya akan menggunakannya tetapi masih :)


1
Saya akhirnya menggunakan ini karena dalam aplikasi kami, orang akan memasukkan "99" jika salah satu bidang (hari, bulan, tahun) tidak diketahui. Pendekatan yang baik jika Anda memiliki tanggal "palsu" di data Anda.
Voodoo

18

Catatan : Karena jawaban posting ini kadang-kadang dibatalkan, saya kembali ke sini untuk meminta orang-orang untuk tidak meningkatkan lagi. Jawaban saya kuno, tidak benar secara teknis, dan ada beberapa pendekatan yang lebih baik di sini. Saya hanya menyimpannya di sini untuk tujuan sejarah.

Meskipun dokumentasi dengan buruk menggambarkan fungsi strtotime, @rjmunro dengan benar membahas masalah ini dalam komentarnya: ini dalam format tanggal ISO "YYYY-MM-DD".

Juga, meskipun fungsi Date_Converter saya mungkin masih berfungsi, saya ingin memperingatkan bahwa mungkin ada pernyataan tidak tepat di bawah ini, jadi harap abaikan saja.

Jawaban yang paling banyak dipilih sebenarnya salah!

Manual strtotime PHP di sini menyatakan bahwa "Fungsi ini diharapkan akan diberikan string yang berisi format tanggal bahasa Inggris". Apa yang sebenarnya dimaksud adalah bahwa ia mengharapkan format tanggal Amerika AS, seperti "mdY" atau "m / d / Y".

Itu berarti bahwa tanggal yang disediakan sebagai "Ymd" dapat disalahartikan oleh strtotime . Anda harus memberikan tanggal dalam format yang diharapkan.

Saya menulis sedikit fungsi untuk mengembalikan tanggal dalam beberapa format. Gunakan dan modifikasi sesuka hati. Jika ada yang mengubahnya menjadi kelas, saya akan senang jika itu akan dibagikan.

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
Membaca, saya suka Ceiroa memperbaikinya. Itu jauh lebih mudah daripada meledak / meledak tanggal.
Igor Donin

3
Jawaban teratas tidak salah. PHP melakukan hal yang benar dengan tanggal format ISO "YYYY-MM-DD". Ini tidak dapat salah menafsirkannya sebagai tanggal AS, karena memiliki 4 digit di awal, dan menggunakan - bukan / sebagai pemisah. Tanggal ISO dirancang dengan hati-hati agar tidak membingungkan dengan format lain.
rjmunro

14

Ada dua cara untuk mengimplementasikan ini:

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

Gunakan fungsi ini untuk mengkonversi dari format apa saja ke format apa pun

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

Diberikan di bawah ini adalah kode PHP untuk menghasilkan tanggal besok menggunakan mktime()dan mengubah formatnya ke format dd / mm / yyyy dan kemudian mencetaknya menggunakan 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
Untuk Mysql format tanggal adalah Ymd seperti "2014-04-26"
AbdulBasit

2

Anda dapat mengubah format menggunakan tanggal () dan strtotime ().

$ date = '9/18/2019';

tanggal gema ('dm-y', strtotime ($ date));

Hasil:

18-09-19

Kita dapat mengubah format dengan mengubah (dmy).


1

Untuk konversi khusus ini, kami juga dapat menggunakan string format.

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

Jelas ini tidak akan berfungsi untuk banyak konversi format tanggal lainnya, tetapi karena kami hanya mengatur ulang substring dalam kasus ini, ini adalah cara lain yang mungkin untuk melakukannya.


bagaimana cara mengubah 2019-10-28T17: 02: 49Z ke timestamp?
Bogdan Bogdanov

1
Gunakan strtotime(). :-)
Don't Panic

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

Cara sederhana Gunakan strtotime()dan date():

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

Bersama waktu

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

0

Menggunakan date_create dandate_format

Coba ini.

function formatDate($input, $output){
  $inputdate = date_create($input);
  $output = date_format($inputdate, $output);
  return $output;
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.