Chuyển đổi định dạng ngày trong PHP


489

Tôi cố gắng để chuyển đổi một ngày từ yyyy-mm-ddđến dd-mm-yyyy(nhưng không phải trong SQL); tuy nhiên tôi không biết hàm ngày yêu cầu dấu thời gian như thế nào và tôi không thể lấy dấu thời gian từ chuỗi này.

Sao có thể như thế được?


21
dd-mm-yyyy là định dạng chuẩn ở (hầu hết) Châu Âu ít nhất là khi bạn cần trình bày dữ liệu cho người dùng.
Matteo Riva

7
dd-mm-yyyy ở Úc và New Zealand cũng vậy
Jonathan Day

2
mm-dd-yyyy ở Mỹ. @stesch: trước đây là tiêu chuẩn trong SQL. Tôi không chắc nó là tiêu chuẩn ở bất kỳ nước nào. :)
Herbert

10
Trên thực tế, tiêu chuẩn là yyyy-mm-dd theo ISO 8601 .
Jezen Thomas

7
"Tiêu chuẩn" toàn cầu là yyyy-mm-dd và phải luôn được sử dụng bởi các hệ thống bất cứ khi nào có thể. Ngày, tháng, năm được sử dụng bởi mọi người ở hầu hết các nơi trên thế giới (trừ Hoa Kỳ), nhưng thường có dấu gạch chéo, không phải dấu gạch nối. Để tránh nhầm lẫn, tôi chỉ tách YYYY-MM-DD bằng dấu gạch nối. Bất kỳ định dạng ngày khác tôi sẽ tách bằng dấu gạch chéo. Điều này giữ cho mọi thứ nhất quán.
rjmunro

Câu trả lời:


1056

Sử dụng strtotime()date():

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

(Xem strtotimengày tài liệu trên trang web PHP.)

Lưu ý rằng đây là một giải pháp nhanh chóng cho câu hỏi ban đầu. Để chuyển đổi rộng rãi hơn, bạn thực sự nên sử dụng DateTimelớp để phân tích và định dạng :-)


14
Điều gì xảy ra nếu tôi nhận được ngày này 0000-00-00 từ mySQL? nó trả về một ngày sai như 31/12/1969 ...
Enrique

3
@Enrique: Nếu bạn nhận được 000-00-00 từ MySQL, bạn nên kiểm tra lại FIRST đó trước khi đưa nó qua chuyển đổi. Đơn giản.
ShadowStorm

1
@SobinAugustine et al: strtotime () sẽ chuyển đổi chuỗi ngày thành "dấu thời gian Unix (số giây kể từ ngày 1 tháng 1 năm 1970 00:00:00 UTC)", ngày định dạng () có thể hiểu và sau đó chuyển đổi từ. Vì vậy, điều này sẽ không hoạt động với dấu thời gian trước năm 1970.
Samuel Lindblom

1
@SamuelLindblom không, không phải như vậy, nó sẽ hoạt động trước năm 1970.
Sobin Augustine

1
@SobinAugustine: Bạn nói đúng. Tuy nhiên, nó sẽ không hoạt động trước 1901-12-14 vì vậy vẫn áp dụng cho lý do tại sao các ngày được liệt kê ở trên không hoạt động.
Samuel Lindblom

271

Nếu bạn muốn tránh chuyển đổi strtotime (ví dụ: strtotime không thể phân tích cú pháp đầu vào của bạn), bạn có thể sử dụng,

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

Hoặc, tương đương:

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

Trước tiên, bạn cho nó định dạng $ dateString. Sau đó, bạn đang nói với nó định dạng mà bạn muốn $ newDateString ở trong đó.

Hoặc nếu định dạng nguồn luôn là "Ymd" (yyyy-mm-dd), thì chỉ cần sử dụng 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
Cảm ơn bạn vì DateTime::createFromFormat()- nó thực sự hữu ích hơnstrtotime()
Gtx

2
NB: PHP 5.3+ cần thiết cho hai phương thức đầu tiên.
Salman von Abbas

Cảm ơn bạn đã tùy chọn DateTime mới. Điều đó đã làm việc và là một lựa chọn rất sạch sẽ.
Nina Morena

1
strtotime()hữu ích để chuyển đổi định dạng loại thực (Ymd) sang các định dạng khác, nhưng DateTime::createFromFormat()là phổ biến. Giống như STR_TO_DATEtrong MySQL
Taron Saribekyan

Cái này chỉ thực sự hiệu quả với tôi Thay vì Bullshitstrtotime()
Code Cooker

72

Sử dụng:

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

Nếu không có chi phí chuyển đổi ngày, tôi không chắc nó sẽ quan trọng lắm.


Vâng, trả lời khi bạn gửi của bạn, tôi tin. Tất nhiên việc kiểm tra lỗi được tìm thấy trong strtotime có thể là một cái gì đó hữu ích.
Tim Lyussy

2
Rất hữu ích cho tôi khi chuyển đổi định dạng ngày không phải của người Mỹ ... dd-mm-yyyy => yyyy-mm-dd Xem php.net/manual/en/datetime.formats.date.php
Chris Jacob

5
Đừng hiểu tại sao câu trả lời này có ít phiếu hơn. Nó nên được bình chọn hàng đầu câu trả lời. Nó giải quyết vấn đề chỉ đơn giản và nhanh chóng mà không có bất kỳ vấn đề. Cảm ơn
Naeem Ul Wahhab

2
Bạn thậm chí có thể gọi lại nếu bạn cần đảo ngược định dạng ngày về dạng ban đầu. Câu trả lời tốt nhất thực sự. :)
Pedro Araujo Jorge

1
điều này nên được thay đổi như câu trả lời được chấp nhận, nó giải quyết tất cả các vấn đề về thời gian sử dụng định dạng ngày và ngày.
Matteo Bononi 'đồng nghiệp'

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

Mã này hoạt động cho mọi định dạng ngày.

Bạn có thể thay đổi thứ tự của các biến thay thế như $ 3- $ 1- $ 2 do định dạng ngày cũ của bạn.


Cảm ơn bạn rất nhiều!
Lê Văn Chiến

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

Để biết thêm, xem tài liệu chostrtotime .

Hoặc thậm chí ngắn hơn:

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

27

Ngoài ra một khả năng tối nghĩa khác:

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

Tôi không biết nếu tôi sẽ sử dụng nó nhưng vẫn :)


1
Tôi đã kết thúc bằng cách sử dụng điều này bởi vì trong ứng dụng của chúng tôi, mọi người sẽ nhập "99" nếu một trong các trường (ngày, tháng, năm) không xác định. Cách tiếp cận tốt nếu bạn có bất kỳ ngày "giả" nào trong dữ liệu của mình.
Voodoo

18

Lưu ý : Vì câu trả lời của bài đăng này đôi khi được nêu lên, tôi đã quay lại đây để vui lòng yêu cầu mọi người không nêu lên nó nữa. Câu trả lời của tôi là cổ xưa, không đúng về mặt kỹ thuật, và có một số cách tiếp cận tốt hơn ngay tại đây. Tôi chỉ giữ nó ở đây cho mục đích lịch sử.

Mặc dù tài liệu mô tả kém về chức năng strtotime, @rjmunro đã giải quyết chính xác vấn đề trong nhận xét của mình: đó là định dạng ISO ngày "YYYY-MM-DD".

Ngoài ra, mặc dù chức năng Date_Converter của tôi vẫn có thể hoạt động, tôi muốn cảnh báo rằng có thể có các tuyên bố không chính xác bên dưới, vì vậy vui lòng bỏ qua chúng.

Câu trả lời được bình chọn nhiều nhất là thực sự không chính xác!

Hướng dẫn sử dụng chuỗi thời gian PHP ở đây nói rằng "Hàm dự kiến ​​sẽ được cung cấp một chuỗi chứa định dạng ngày tiếng Anh". Điều thực sự có nghĩa là nó mong đợi một định dạng ngày ở Mỹ, chẳng hạn như "mdY" hoặc "m / d / Y".

Điều đó có nghĩa là một ngày được cung cấp là "Ymd" có thể bị hiểu sai bởi strtotime. Bạn nên cung cấp ngày ở định dạng dự kiến.

Tôi đã viết một chức năng nhỏ để trả về ngày ở một số định dạng. Sử dụng và sửa đổi theo ý muốn. Nếu bất cứ ai biến điều đó thành một lớp học, tôi sẽ rất vui nếu điều đó được chia sẻ.

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
Đọc trên, tôi thích Ceiroa sửa chữa nó. Đó là cách dễ dàng hơn để nổ / nổ ngày.
Igor Donin

3
Câu trả lời hàng đầu không phải là không chính xác. PHP thực hiện đúng với ngày định dạng ISO "YYYY-MM-DD". Nó không thể hiểu sai nó là một ngày ở Hoa Kỳ, vì nó có 4 chữ số khi bắt đầu và nó sử dụng - không phải / như một dấu phân cách. Ngày ISO được thiết kế cẩn thận để không bị nhầm lẫn với các định dạng khác.
rjmunro

14

Có hai cách để thực hiện điều này:

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

Sử dụng chức năng này để chuyển đổi từ bất kỳ định dạng sang định dạng bất kỳ

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

Dưới đây là mã PHP để tạo ngày mai bằng cách sử dụng mktime()và thay đổi định dạng của nó thành định dạng dd / mm / yyyy và sau đó in nó bằng cách sử dụng 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
Đối với Mysql, định dạng ngày là Ymd như "2014-04-26"
AbdulBasit

2

Bạn có thể thay đổi định dạng bằng cách sử dụng date () và strtotime ().

$ ngày = '9/18/2019';

ngày lặp lại ('dm-y', strtotime ($ date));

Kết quả:

18-09-19

Chúng ta có thể thay đổi định dạng bằng cách thay đổi (dmy).


1

Đối với chuyển đổi cụ thể này, chúng tôi cũng có thể sử dụng một chuỗi định dạng.

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

Rõ ràng điều này sẽ không hoạt động đối với nhiều chuyển đổi định dạng ngày khác, nhưng vì chúng ta chỉ sắp xếp lại các chuỗi con trong trường hợp này, đây là một cách khả thi khác để thực hiện.


Làm cách nào để chuyển đổi 2019-10-28T17: 02: 49Z sang dấu thời gian?
Bogdan Bogdanov

1
Sử dụng strtotime(). :-)
Đừng hoảng sợ

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

Cách đơn giản Sử dụng strtotime()date():

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

Với thời gian

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

0

Sử dụng date_createdate_format

Thử cái này.

function formatDate($input, $output){
  $inputdate = date_create($input);
  $output = date_format($inputdate, $output);
  return $output;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.