Chuyển đổi từ datetime MySQL sang định dạng khác với PHP


447

Tôi có một datetimecột trong MySQL.

Làm cách nào tôi có thể chuyển đổi nó sang màn hình dưới dạng mm / dd / yy H: M (AM / PM) bằng PHP?


4
Những gì chúng ta cần biết là ngày được lưu trữ trong SQL. Đó là Timestamp hay Datetime hay unixtime?
Chờ đợi Ólafur

Chúng được lưu trữ không trong thời gian unix, giống như một ngày bình thường, PHP là một ứng dụng xử lý nó dưới dạng giây và thứ. Tôi khuyên bạn nên sử dụng các OOPhàm datetime của PHP , chúng rất dễ sử dụng.
Gucho Ca

2
Tôi có thể giới thiệu và thay thế cho định dạng ngày của bạn? mm/dd/yylà người Mỹ và những người trong chúng ta sống ở các nơi khác trên thế giới nhận được nhiều hơn một chút cáu kỉnh khi cố gắng đoán thứ hai nghĩa là gì 11-12-13. Tiêu chuẩn phổ quát hơn là yyyy-mm-ddvà là một phần của tiêu chuẩn ISO 8601. Không, bạn nên sử dụng tên tháng , không phải số.
Manngo

Câu trả lời:


515

Nếu bạn đang tìm cách bình thường hóa một ngày thành định dạng MySQL, hãy sử dụng cách sau

$phpdate = strtotime( $mysqldate );
$mysqldate = date( 'Y-m-d H:i:s', $phpdate );

Dòng $phpdate = strtotime( $mysqldate )chấp nhận một chuỗi và thực hiện một loạt các heuristic để biến chuỗi đó thành dấu thời gian unix.

Dòng này $mysqldate = date( 'Y-m-d H:i:s', $phpdate )sử dụng dấu thời gian đó và datechức năng của PHP để biến dấu thời gian đó trở lại định dạng ngày chuẩn của MySQL.

( Lưu ý của biên tập viên : Câu trả lời này có ở đây vì một câu hỏi ban đầu với từ ngữ khó hiểu và tính hữu ích chung của Google câu trả lời này được cung cấp ngay cả khi nó không 'trả lời trực tiếp câu hỏi hiện có)


19
câu trả lời này gây nhầm lẫn cho chủ đề
Alex K

5
@ 0xBAADF00D: vui lòng đọc lại câu hỏi ... không ai hỏi về định dạng chuẩn của MySQL.
dùng7116

3
tất nhiên, nhưng, khi tiêu chuẩn tồn tại, có thể tốt hơn để tuân theo tiêu chuẩn (nó tránh đau đầu sau này khi một nhà phát triển khác làm việc với mã của bạn) xD
0xBAADF00D

4
Câu hỏi yêu cầu xuất ra ở định dạng mm / dd / yy H: M (AM / PM), không phải "Ymd H: i: s".
Rikki

6
does not workcho ai? Câu trả lời được chấp nhận sẽ hoạt động nếu bạn muốn chuyển đổi từ MySQL thành mm / dd / yy H: M (AM / PM) theo yêu cầu của OP. Chỉ vì bạn muốn làm ngược lại không làm cho câu trả lời được chấp nhận sai.
toxalot

311

Để chuyển đổi một ngày lấy từ MySQL sang định dạng được yêu cầu ( mm/dd/yy H:M (AM/PM)):

// $datetime is something like: 2014-01-31 13:05:59
$time = strtotime($datetimeFromMysql);
$myFormatForView = date("m/d/y g:i A", $time);
// $myFormatForView is something like: 01/31/14 1:05 PM

Tham khảo các tùy chọn định dạng ngày PHP để điều chỉnh định dạng.


$rowĐối tượng này được cho là từ đâu?
Mike

25
Tôi có thể sai, nhưng tôi nghĩ rằng một số bạn đang thiếu điểm. Anh ta muốn đầu ra ở định dạng "m / d / yg: i A", lấy ngày ban đầu từ trường DATETIME. Vì vậy, mã của ông hoạt động. @Mike $ row-> createdate chỉ là cột thời gian của Tim.
Phát triển đơn

4
Câu trả lời @AsTeR chỉ gây nhầm lẫn nếu bạn đọc sai câu hỏi. OP đã trả lời câu hỏi của riêng mình và muốn lấy một ngày từ MySQL và xuất ra định dạng được yêu cầu: mm / dd / yy H: M (AM / PM) .
độc tố

@TimBoland Tôi nghĩ rằng câu trả lời có thể được cải thiện nếu từ được nhấn mạnh cũng như định dạng được yêu cầu mm / dd / yy H: M (AM / PM) . Và nó có thể được hưởng lợi từ một liên kết đến chức năng ngày. Tôi đã cố gắng đề xuất một chỉnh sửa , nhưng nó đã bị từ chối.
độc tố

1
Sự thật thú vị: câu trả lời này gần tương đương với câu hỏi ngay bên dưới (hầu như không có downvote), nhưng nó có> 40 lượt tải xuống vì nó trả lời câu hỏi của OP, khác với câu hỏi mà những người đến trang này thực sự có.
Clément

110

Nếu bạn đang sử dụng PHP 5, bạn cũng có thể thử

$oDate = new DateTime($row->createdate);
$sDate = $oDate->format("Y-m-d H:i:s");

Như đã nêu ở trên trong các bình luận, định dạng chuẩn là("Y-m-d H:i:s")
Yannickv

45
$valid_date = date( 'm/d/y g:i A', strtotime($date));

Tham khảo: http://php.net/manual/en/feft.date.php


Tôi nghĩ mọi người downvote vì họ bối rối về câu hỏi OP. Hầu hết đọc câu hỏi để ngược lại với những gì nó thực sự là. Khả năng khác là điều này rất giống với câu trả lời được chấp nhận đã được đăng cách đây hơn 5 năm.
độc tố

1
Liên kết bạn tham chiếu không trỏ đến chức năng bạn đang sử dụng và cũng không giải thích định dạng. Tôi nghĩ php.net/feft.date.php sẽ tốt hơn.
độc tố

@toxalot Câu trả lời được chấp nhận là sai. Nó được chỉnh sửa sau câu trả lời của tôi và về liên kết của tôi, tôi thay thế liên kết của bạn. Cảm ơn
Tony Stark

1
Toàn bộ Q & A này có một lịch sử bẩn thỉu. Câu trả lời được chấp nhận sai từ ngày 29 tháng 4 năm 2013 đến ngày 24 tháng 5 năm 2013. Đó là chính xác khi bạn lần đầu tiên đăng câu trả lời của mình. Câu trả lời của bạn đã sai cho đến ngày 29 tháng 5 năm 2013, sau đó nó trở nên rất giống với câu trả lời được chấp nhận.
toxalot

23

Cuối cùng, giải pháp phù hợp cho PHP 5.3 trở lên: (đã thêm múi giờ tùy chọn vào ví dụ như được đề cập trong các bình luận)

$date = \DateTime::createFromFormat('Y-m-d H:i:s', $mysql_source_date, new \DateTimeZone('UTC'));
$date->setTimezone(new \DateTimeZone('Europe/Berlin')); // optional
echo $date->format('m/d/y h:i a');

lỗi của nó .. Không tìm thấy lớp 'Ứng dụng \ Trình điều khiển \ DateTime' .. sử dụng php 6.4
vào

1
Nếu bạn đang làm việc trong một không gian tên khác, bạn phải gọi nó bằng dấu gạch chéo ngược phía trước nó:\DateTime::createFromFormat('Y-m-d H:i:s', $mysql_source_date);
Hasenpriester

2
Đừng quên chỉ định múi giờ khi bạn tạo đối tượng ngày của mình! Nếu không, ngày định dạng của bạn có thể được nghỉ vài giờ. Các datetimecột của bạn phải là UTF8, vì vậy hãy chuyển qua new DateTimeZone('UTC')tham số thứ 3 để đảm bảo PHP biết.
Eric Seastrand

Đây là câu trả lời chính xác cho ra định dạng mong muốn của OP, chỉ cần chăm sóc các múi giờ
Kế toán م

12

Một cách dễ dàng hơn là định dạng ngày trực tiếp trong truy vấn MySQL, thay vì PHP. Xem mục hướng dẫn sử dụng MySQL cho DATE_FORMAT .

Nếu bạn muốn làm điều đó hơn trong PHP, thì bạn cần hàm ngày , nhưng trước tiên bạn sẽ phải chuyển đổi giá trị cơ sở dữ liệu của mình thành dấu thời gian.


11
-1 vì định dạng ngày trong DB không phải là ý tưởng tốt. Web đa ngôn ngữ cần các định dạng ngày khác nhau và sau đó bạn phải định dạng ngày trong PHP (ngôn ngữ logic nghiệp vụ chung). Khi bạn viết về datechức năng, sau đó bạn cũng nên viết về strottimechức năng để giúp ai đó thay vì "nhưng trước tiên bạn sẽ phải chuyển đổi giá trị cơ sở dữ liệu của mình thành dấu thời gian".
Boris uška

10

Quên tất cả. Chỉ dùng:

$date = date("Y-m-d H:i:s",strtotime(str_replace('/','-',$date)))

9

Để định dạng chính xác một DateTimeđối tượng trong PHP để lưu trữ trong MySQL, hãy sử dụng định dạng chuẩn mà MySQL sử dụng, đó là ISO 8601 .

PHP đã có định dạng này được lưu trữ dưới dạng hằng số kể từ phiên bản 5.1.1 và tôi khuyên bạn nên sử dụng nó thay vì nhập chuỗi thủ công mỗi lần.

$dtNow = new DateTime();
$mysqlDateTime = $dtNow->format(DateTime::ISO8601);

Cái này và một danh sách các hằng số DateTime PHP khác có sẵn tại http://php.net/manual/en/ class.datetime.php # datatetime.constants.types


MySQL không thực sự sử dụng định dạng này và MySQL tạo cảnh báo nếu bạn bao gồm trình chỉ định múi giờ "+ xxxx" được tạo bởi nó. CẬP NHẬT X SET Y = '2014-03-31T15: 00: 00 + 0100' trong đó Z; Truy vấn OK, 0 hàng bị ảnh hưởng, 1 cảnh báo (0,06 giây) Hàng phù hợp: 1 Thay đổi: 0 Cảnh báo: 1
George Lund

OP muốn lấy một ngày từ định dạng MySQL và chuyển đổi sang mm / dd / yy H: M (AM / PM) .
toxalot

8

Điều này sẽ định dạng một trường trong một truy vấn SQL:

SELECT DATE_FORMAT( `fieldname` , '%d-%m-%Y' ) FROM tablename

Bạn nên chỉ định truy vấn MySQL , không chỉ SQL, vì điều đó không nhất thiết phải hoạt động với tất cả các cơ sở dữ liệu. Trong khi OP yêu cầu giải pháp PHP, đây là một giải pháp thay thế tốt mà OP có thể chưa biết đến. Tuy nhiên, điều này sẽ không cung cấp định dạng được yêu cầu. Để có được định dạng OP yêu cầu, bạn cần '%m/%d/%y %h:%i %p'.
toxalot

7

Sử dụng chức năng ngày :

<?php
    echo date("m/d/y g:i (A)", $DB_Date_Field);
?>

25
Hàm date () có mong đợi dấu thời gian nguyên hơn là thời gian được chỉ định trong câu hỏi không?
Gác xép

5

Tùy thuộc vào cấu hình datetime MySQL của bạn. Thông thường: định dạng 2011-12-31 07:55:13 . Chức năng rất đơn giản này sẽ làm nên điều kỳ diệu:

function datetime()
{
    return date( 'Y-m-d H:i:s', time());
}

echo datetime(); // display example: 2011-12-31 07:55:13

Hoặc thêm một chút để phù hợp với câu hỏi.

function datetime($date_string = false)
{
    if (!$date_string)
    {
        $date_string = time();
    }
    return date("Y-m-d H:i:s", strtotime($date_string));
}

1
Điều này không trả lời câu hỏi OP. OP muốn lấy một ngày từ định dạng MySQL và chuyển đổi sang mm / dd / yy H: M (AM / PM) . Thêm vào đó, đây sẽ chỉ là định dạng thời gian hiện tại, không phải là một ngày cụ thể.
toxalot

5
SELECT 
 DATE_FORMAT(demo.dateFrom, '%e.%M.%Y') as dateFrom,
 DATE_FORMAT(demo.dateUntil, '%e.%M.%Y') as dateUntil
FROM demo

Nếu bạn không muốn thay đổi mọi chức năng trong mã PHP của mình, để hiển thị định dạng ngày dự kiến, hãy thay đổi nó tại nguồn - cơ sở dữ liệu của bạn.

Điều quan trọng là đặt tên hàng với như nhà điều hành như trong ví dụ trên (như dateFrom, như dateUntil). Tên bạn viết có tên, các hàng sẽ được gọi trong kết quả của bạn.

Đầu ra của ví dụ này sẽ là

[Ngày trong tháng, số (0..31)]. [Tên tháng (Tháng 1 .. Tháng 12)]. [Năm, số, bốn chữ số]

Ví dụ: 5.August.2015

Thay đổi dấu chấm bằng dấu phân cách lựa chọn và kiểm tra chức năng DATE_FORMAT (ngày, định dạng) để biết thêm các định dạng ngày.


3

Bạn cũng có thể yêu cầu truy vấn của bạn trả về thời gian dưới dạng dấu thời gian Unix. Điều đó sẽ thoát khỏi nhu cầu gọi strtotime()và làm cho mọi thứ trở nên ít chuyên sâu hơn về phía PHP ...

select  UNIX_TIMESTAMP(timsstamp) as unixtime from the_table where id = 1234;

Sau đó, trong PHP chỉ cần sử dụng date()hàm để định dạng nó theo bất kỳ cách nào bạn muốn.

<?php
  echo date('l jS \of F Y h:i:s A', $row->unixtime);
?>

hoặc là

<?php
  echo date('F j, Y, g:i a', $row->unixtime);
?>

Tôi thích cách tiếp cận này như trái ngược với sử dụng MySQL 'sDATE_FORMAT chức năng , bởi vì nó cho phép bạn sử dụng lại cùng một truy vấn để lấy dữ liệu và cho phép bạn thay đổi định dạng trong PHP.

Thật khó chịu khi có hai truy vấn khác nhau chỉ để thay đổi giao diện ngày trong giao diện người dùng.


Tôi thích ý tưởng sử dụng UNIX_TIMESTAMPđể loại bỏ sự cần thiết cho strtotime. Câu trả lời này sẽ tốt hơn nếu nó đưa ra một ví dụ về định dạng thời gian theo định dạng OP thực sự yêu cầu.
độc tố

1

Bạn có thể gặp rắc rối với ngày không được trả lại trong Unix Timestamp, vì vậy điều này hiệu quả với tôi ...

return date("F j, Y g:i a", strtotime(substr($datestring, 0, 15)))

1
Điều này không chuyển đổi ngày thành định dạng theo yêu cầu của OP.
toxalot

1

Điều này sẽ làm việc ...

echo date('m/d/y H:i (A)',strtotime($data_from_mysql));

1
Định dạng đó trộn 24 lần với AM / PM. Mặt khác, nó giống như câu trả lời được chấp nhận đã được đăng hơn 5 năm trước.
độc tố

0

Sử dụng phiên bản PHP 4.4.9 & MySQL 5.0, điều này hiệu quả với tôi:

$oDate = strtotime($row['PubDate']);
$sDate = date("m/d/y",$oDate);
echo $sDate

PubDatelà cột trong MySQL .


Điều này không chuyển đổi ngày thành định dạng theo yêu cầu của OP
toxalot

0

Cách tiếp cận tôi đề nghị làm việc như sau. Đầu tiên, bạn tạo một đối tượng datetime cơ bản từ một chuỗi có định dạng mysql; và sau đó bạn định dạng nó theo cách bạn muốn. May mắn thay, mysql datetime tuân thủ ISO8601, vì vậy bản thân mã có thể trông khá đơn giản và thanh lịch. Hãy ghi nhớ mặc dù datetimecột đó không có thông tin múi giờ, vì vậy bạn cần chuyển đổi nó một cách thích hợp .

Đây là mã:

(new ISO8601Formatted(
    new FromISO8601('2038-01-19 11:14:07'),
    'm/d/Y h:iA'
))
    ->value();

Nó đầu ra 01/19/2038 11:14AM- hy vọng những gì bạn mong đợi.

Ví dụ này sử dụng thư viện meringue. Bạn có thể kiểm tra thêm một số nếu bạn thích.


-1
$date = "'".date('Y-m-d H:i:s', strtotime(str_replace('-', '/', $_POST['date'])))."'";

1
Điều này không trả lời câu hỏi OP. OP muốn lấy một ngày từ định dạng MySQL và chuyển đổi sang mm / dd / yy H: M (AM / PM) . Điều này làm ngược lại. Thêm vào đó, nó nhận đầu vào từ một hình thức chứ không phải cơ sở dữ liệu.
độc tố
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.