Chuyển đổi định dạng một ngày thành một định dạng khác trong PHP


336

Có cách nào đơn giản để chuyển đổi định dạng một ngày thành định dạng ngày khác trong PHP không?

Tôi có cái này:

$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

Nhưng tất nhiên tôi muốn nó trở lại một ngày hiện tại thay vì bình minh. Tôi đang làm gì sai?



Câu trả lời:


293

Tham số thứ hai date()cần phải là dấu thời gian thích hợp (giây kể từ ngày 1 tháng 1 năm 1970). Bạn đang truyền một chuỗi, ngày nào () không thể nhận ra.

Bạn có thể sử dụng strtotime () để chuyển đổi chuỗi ngày thành dấu thời gian. Tuy nhiên, ngay cả strtotime () cũng không nhận y-m-d-h-i-sdạng được định dạng.

PHP 5.3 trở lên

Sử dụng DateTime::createFromFormat. Nó cho phép bạn chỉ định một mặt nạ chính xác - sử dụng date()cú pháp - để phân tích ngày chuỗi đến.

PHP 5.2 trở xuống

Bạn sẽ phải phân tích các yếu tố (năm, tháng, ngày, giờ, phút, giây) bằng cách sử dụng thủ công substr()và đưa kết quả cho mktime () sẽ tạo cho bạn dấu thời gian.

Nhưng đó là rất nhiều công việc! Tôi khuyên bạn nên sử dụng một định dạng khác mà strftime () có thể hiểu. strftime () hiểu bất kỳ ngày đầu vào ngắn the next time joe will slip on the ice. ví dụ, điều này hoạt động:

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

Cảm ơn Pekka, chỉ cần chỉnh sửa câu hỏi của tôi, đã thử nhưng nó dường như không hoạt động.
Tom

Tôi đã chỉnh sửa câu trả lời trong khi bạn chấp nhận nó :) Tôi đã thêm một số ví dụ và tài liệu tham khảo.
Pekka

Gotcha, đó thực sự là vấn đề. Đó là một tên tệp cố định tôi cần chuyển đổi lại thành một ngày (phải ở định dạng đó), vì vậy tôi sẽ tìm ra cách giải quyết.
Tom

Lưu ý: Theo php.net DateTimetồn tại kể từ PHP 5.2 trong lõi PHP và hỗ trợ thử nghiệm DateTimecó thể được bật cho PHP 5.1 khi biên dịch. safe.php.net/manual/en/datetime.installation.php
Charlotte Dunois

108

Cách dễ nhất để làm điều này là

$myDateTime = DateTime::createFromFormat('Y-m-d', $dateString);
$newDateString = $myDateTime->format('m/d/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 đó.

Điều này cũng tránh việc sử dụng strtotime, đôi khi có thể khó làm việc.

Nếu bạn không chuyển đổi từ định dạng ngày này sang định dạng khác, nhưng chỉ muốn ngày hiện tại (hoặc datetime) ở định dạng cụ thể thì điều đó thậm chí còn dễ dàng hơn:

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

Câu hỏi khác này cũng đề cập đến cùng một chủ đề: Chuyển đổi định dạng ngày yyyy-mm-dd => dd-mm-yyyy .


Và nó là một bản sao như thế nào nếu tôi đặt câu hỏi trước câu hỏi mà bạn đang đề cập đến?
Tom

1
Tôi đã chỉnh sửa câu trả lời. Tôi chỉ muốn chỉ ra rằng hai câu hỏi này nên được liên kết bằng cách nào đó.
ceiroa

có sẵn trong php 5.3+
Zorox

$timestring = $now->format('Y-m-d h:i:s');chắc chắn mtrong nhiều tháng, itrong vài phút
Mark Baker

@madlopt ~ phương thức tĩnh: safe.php.net/manual/en/lingu.oop5.static.php
ceiroa

53

Những thứ cơ bản

Cách đơn giản để chuyển đổi định dạng ngày này sang định dạng khác là sử dụng strtotime()với date(). strtotime()sẽ chuyển đổi ngày thành Dấu thời gian Unix . Unix Timestamp sau đó có thể được chuyển qua date()để chuyển đổi nó sang định dạng mới.

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

Hoặc như một lớp lót:

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

Hãy nhớ rằng strtotime()ngày yêu cầu phải ở định dạng hợp lệ . Việc không cung cấp định dạng hợp lệ sẽ dẫn đến strtotime()trả về sai, điều này sẽ khiến ngày của bạn là 1969-12-31.

Sử dụng DateTime()

Kể từ PHP 5.2, PHP đã cung cấp DateTime()lớp cung cấp cho chúng tôi các công cụ mạnh hơn để làm việc với ngày (và thời gian). Chúng ta có thể viết lại đoạn mã trên bằng cách sử dụng DateTime():

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

Làm việc với dấu thời gian Unix

date() lấy một bộ đếm thời gian Unix làm tham số thứ hai của nó và trả về một ngày được định dạng cho bạn:

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

DateTime () hoạt động với dấu thời gian Unix bằng cách thêm dấu @trước dấu thời gian:

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

Nếu dấu thời gian bạn có là tính bằng mili giây (có thể kết thúc bằng 000và / hoặc dấu thời gian dài mười ba ký tự), bạn sẽ cần chuyển đổi nó thành giây trước khi bạn có thể chuyển đổi nó sang định dạng khác. Có hai cách để làm điều này:

  • Cắt bớt ba chữ số cuối bằng cách sử dụng substr()

Việc cắt xén ba chữ số cuối có thể được thực hiện bằng nhiều cách, nhưng sử dụng substr()là cách dễ nhất:

$timestamp = substr('1234567899000', -3);
  • Chia lớp nền cho 1000

Bạn cũng có thể chuyển đổi dấu thời gian thành giây bằng cách chia cho 1000. Vì dấu thời gian quá lớn đối với các hệ thống 32 bit để làm toán nên bạn sẽ cần sử dụng thư viện BCMath để thực hiện phép toán dưới dạng chuỗi:

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

Để có được Dấu thời gian Unix, bạn có thể sử dụng strtotime()trả về Dấu thời gian Unix:

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

Với DateTime () bạn có thể sử dụng DateTime::getTimestamp()

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

Nếu bạn đang chạy PHP 5.2, bạn có thể sử dụng Utùy chọn định dạng thay thế:

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

Làm việc với các định dạng ngày không chuẩn và mơ hồ

Thật không may, không phải tất cả các ngày mà nhà phát triển phải làm việc đều ở định dạng chuẩn. May mắn thay, PHP 5.3 đã cung cấp cho chúng tôi một giải pháp cho điều đó. DateTime::createFromFormat()cho phép chúng tôi nói với PHP định dạng của chuỗi ngày để nó có thể được phân tách thành công thành đối tượng DateTime để thao tác thêm.

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

Trong PHP 5.4, chúng tôi đã đạt được khả năng truy cập thành viên lớp khi khởi tạo đã được thêm vào, cho phép chúng tôi biến DateTime()mã của mình thành một lớp lót:

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

27

Thử cái này:

$old_date = date('y-m-d-h-i-s');
$new_date = date('Y-m-d H:i:s', strtotime($old_date));

Không hoạt động, strtotime () không nhận dạng định dạng. Vừa thử.
Pekka

đồng ý, tôi chỉ cần đặt mã định dạng từ người hỏi, nên có định dạng đúng được chỉ định.
Sarfraz

Nó làm việc cho tôi. $ Old_date của tôi là một cái gì đó như thế này 2012-05-22T19: 16: 37 + 01: 00. Cảm ơn nhân tiện!
VishwaKumar

15

Để chuyển đổi $datetừ dd-mm-yyyy hh:mm:ssmột datetime MySQL thích hợp, tôi thực hiện như sau:

$date = DateTime::createFromFormat('d-m-Y H:i:s',$date)->format('Y-m-d H:i:s');

4
Bạn không nên xâu chuỗi các phương thức này trừ khi bạn chắc chắn 110% $ date là một ngày hợp lệ và phù hợp với định dạng. Như đã nói, một ngày không hợp lệ không khớp chính xác với định dạng sẽ trả về : Fatal error: Call to a member function format() on a non-object. Chỉ cần một cái đầu lên!
Một nửa điên cuồng

Đúng, một giải pháp tốt hơn là thực hiện trong 3 bước với kiểm tra null là bước giữa.
Jelle de Fries

11

Sau đây là một phương pháp dễ dàng để chuyển đổi ngày sang các định dạng khác nhau.

// 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";

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

bạn đang làm sai ở đây, điều này nên

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

dấu phân cách thời gian là ':'


Tôi nghĩ rằng điều này sẽ giúp ...

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

HOẶC LÀ


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

Vâng, chắc chắn cảm ơn, đó là tên tệp GUID mà tôi muốn chuyển đổi lại thành định dạng ngày thích hợp.
Tom

8

Cách riêng này sẽ giúp chuyển đổi bất kỳ định dạng đầu vào nào sang định dạng mong muốn.

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

7

Bạn cần chuyển đổi $ old_date trở lại dấu thời gian, vì hàm ngày yêu cầu dấu thời gian làm đối số thứ hai của nó.


7

strtotime sẽ làm việc đó ra. ngày tháng không giống nhau và tất cả đều ở định dạng chúng tôi.

<?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";
?>

5

Thử cái này:

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

5

Điều này giải quyết cho tôi,

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

Đầu ra: 2018-04-18


2

Đây là cách khác để bạn có thể chuyển đổi định dạng ngày

 <?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'; ?>

1

Chỉ cần sử dụng chuỗi, đối với tôi là một giải pháp tốt, ít vấn đề hơn với mysql. Phát hiện định dạng hiện tại và thay đổi nó nếu cần thiết, giải pháp này chỉ dành cho định dạng tiếng Tây Ban Nha / tiếng Pháp và định dạng tiếng Anh, không sử dụng chức năng datetime 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;
 }

SỬ DỤNG

dateTranslator::translate($date, 'en')

1

Tôi biết điều này đã cũ, nhưng, khi chạy vào một nhà cung cấp sử dụng không nhất quán 5 định dạng ngày khác nhau trong API của họ (và các máy chủ thử nghiệm với nhiều phiên bản PHP từ 5 đến 7 mới nhất), tôi đã quyết định viết một trình chuyển đổi phổ quát hoạt động với vô số phiên bản PHP.

Bộ chuyển đổi này sẽ lấy hầu như mọi đầu vào, bao gồm mọi định dạng thời gian chuẩn (bao gồm có hoặc không có mili giây) bất kỳ biểu diễn Thời gian Epoch nào (bao gồm có hoặc không có mili giây) và chuyển đổi nó sang hầu như bất kỳ định dạng nào khác.

Để gọi nó:

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

Gửi null cho định dạng sẽ làm cho hàm trả về datetime trong Epoch / Unix Time. Mặt khác, gửi bất kỳ chuỗi định dạng nào mà ngày () hỗ trợ, cũng như với ".u" trong mili giây (tôi cũng xử lý mili giây, ngay cả khi ngày () trả về số không).

Đây là mã:

        <?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;    
        }
    ?>

Đây là một số cuộc gọi mẫu - bạn sẽ lưu ý rằng nó cũng xử lý bất kỳ dữ liệu múi giờ nào (mặc dù như đã lưu ý ở trên, mọi thời gian không GMT được trả lại trong múi giờ của bạn).

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

Đây là đầu ra:

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

Điều duy nhất không có trong phiên bản này là khả năng chọn múi giờ mà bạn muốn có thời gian được trả về. Ban đầu, tôi đã viết điều này để thay đổi bất kỳ thời gian nào thành Giờ thời gian, vì vậy, tôi không cần hỗ trợ múi giờ. Nó là tầm thường để thêm mặc dù.

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.