แปลงจาก MySQL datetime เป็นรูปแบบอื่นด้วย PHP


447

ฉันมีdatetimeคอลัมน์ใน MySQL

ฉันจะแปลงเป็นหน้าจอเป็นmm / dd / yy H: M (AM / PM)โดยใช้ PHP ได้อย่างไร


4
สิ่งที่เราต้องรู้ก็คือวิธีจัดเก็บวันที่ภายใน SQL มันคือการประทับเวลาหรือวันที่หรือเวลาหรือไม่?
Ólafur Waage

พวกเขาจะถูกเก็บไว้ไม่ได้ในเวลา unix เช่นเดียวกับวันที่ปกติ PHP เป็นหนึ่งที่จัดการกับมันเป็นวินาทีและสิ่ง ฉันอยากจะแนะนำให้คุณใช้OOPฟังก์ชั่นPHP datetime พวกเขาใช้งานง่ายมาก
Gucho Ca

2
ฉันสามารถแนะนำและทดแทนรูปแบบวันที่ของคุณได้หรือไม่? mm/dd/yyเป็นคนอเมริกันมากและพวกเราที่อาศัยอยู่ในส่วนอื่น ๆ ของโลกได้รับมากกว่าที่จะหงุดหงิดนิดหน่อยในการพยายามคาดเดาความหมายของ11-12-13มัน มาตรฐานสากลที่มากขึ้นคือyyyy-mm-ddและเป็นส่วนหนึ่งของมาตรฐาน ISO 8601 หากไม่เป็นเช่นนั้นคุณควรใช้ชื่อเดือนไม่ใช่ตัวเลข
Manngo

คำตอบ:


515

หากคุณกำลังมองหาวิธีที่จะทำให้เป็นมาตรฐานวันที่ในรูปแบบ MySQL ใช้ต่อไปนี้

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

บรรทัด$phpdate = strtotime( $mysqldate )ยอมรับสตริงและดำเนินการชุดของฮิวริสติกเพื่อเปลี่ยนสตริงนั้นเป็นเวลาประทับ unix

บรรทัด$mysqldate = date( 'Y-m-d H:i:s', $phpdate )ใช้การประทับเวลานั้นและdateฟังก์ชันของ PHP เพื่อเปลี่ยนการประทับเวลานั้นกลับไปเป็นรูปแบบวันที่มาตรฐานของ MySQL

( หมายเหตุบรรณาธิการ : คำตอบนี้อยู่ที่นี่เนื่องจากคำถามเดิมที่มีถ้อยคำสับสนและประโยชน์ทั่วไปของ Google คำตอบนี้ให้แม้ว่ามันจะไม่ได้ตอบคำถามที่มีอยู่ตอนนี้โดยตรง)


19
คำตอบนี้ทำให้เกิดความสับสนหัวข้อ
อเล็กซ์ K

5
@ 0xBAADF00D: โปรดอ่านคำถามอีกครั้ง ... ไม่มีใครถามเกี่ยวกับรูปแบบมาตรฐานของ MySQL
user7116

3
แน่นอน แต่เมื่อมาตรฐานมีอยู่ก็น่าจะดีที่จะทำตามมาตรฐาน (หลีกเลี่ยงอาการปวดหัวในภายหลังเมื่อ dev อื่นทำงานกับโค้ดของคุณ) xD
0xBAADF00D

4
คำถามจะขอให้ส่งออกในรูปแบบ mm / dd / yy H: M (AM / PM) ไม่ใช่ "Ymd H: i: s"
Rikki

6
does not workสำหรับผู้ที่? คำตอบที่ยอมรับจะใช้ได้ถ้าคุณต้องการแปลงจาก MySQL เป็นmm / dd / yy H: M (AM / PM)ตามที่ OP ร้องขอ เพียงเพราะคุณต้องการที่จะทำในสิ่งที่ตรงกันข้ามไม่ได้ทำให้คำตอบที่ยอมรับได้ผิด
toxalot

311

หากต้องการแปลงวันที่ที่ดึงข้อมูลจาก MySQL เป็นรูปแบบที่ร้องขอ ( 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

อ้างถึงตัวเลือกการจัดรูปแบบวันที่ PHPเพื่อปรับรูปแบบ


$rowวัตถุนี้ควรมาจากที่ไหน?
Mike

25
ฉันอาจจะผิด แต่ฉันคิดว่าคุณบางคนขาดประเด็น เขาต้องการให้ผลลัพธ์อยู่ในรูปแบบ "m / d / yg: i A" โดยดึงวันที่ดั้งเดิมออกจากเขตข้อมูล DATETIME ดังนั้นรหัสของเขาจึงใช้งานได้ @Mike $ row-> createdate เป็นเพียงคอลัมน์ datetime ของ Tim
การพัฒนาเพียง

4
@AsTeR คำตอบมีความสับสนหากคุณอ่านคำถามผิด OP ตอบคำถามของตัวเองและต้องการที่จะใช้วันที่จาก MySQL และส่งออกไปยังรูปแบบที่ร้องขอ: dd / mm / yy H: M (AM / PM)
toxalot

@TimBoland ผมคิดว่าคำตอบอาจจะดีขึ้นถ้าจากเน้นเช่นเดียวกับรูปแบบที่ร้องขอdd / mm / yy H: M (AM / PM) และอาจได้รับประโยชน์จากลิงก์ไปยังฟังก์ชันวันที่ ฉันพยายามแนะนำการแก้ไขแต่มันถูกปฏิเสธ
toxalot

1
ความจริงสนุก: คำตอบนี้เทียบเท่ากับคำตอบด้านล่าง (ซึ่งแทบจะไม่มี downvotes) แต่มันมีมากกว่า 40 downvotes เพราะมันตอบคำถามของ OP ซึ่งแตกต่างจากคนที่มาที่หน้านี้จริง ๆ
Clément

110

หากคุณใช้ PHP 5 คุณสามารถลอง

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

ตามที่ระบุไว้ข้างต้นในความคิดเห็นรูปแบบมาตรฐานคือ("Y-m-d H:i:s")
Yannickv

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

การอ้างอิง: http://php.net/manual/th/function.date.php


ฉันคิดว่าผู้คน downvote เพราะพวกเขาสับสนเกี่ยวกับคำถาม OP ส่วนใหญ่อ่านคำถามเพื่อให้ตรงข้ามกับสิ่งที่เป็นจริง ความเป็นไปได้อื่น ๆ คือมันคล้ายกับคำตอบที่ยอมรับซึ่งโพสต์เมื่อ 5+ ปีที่แล้ว
toxalot

1
ลิงค์ที่คุณอ้างอิงไม่ได้ชี้ไปที่ฟังก์ชั่นที่คุณใช้และไม่ได้อธิบายถึงรูปแบบ ฉันคิดว่าphp.net/function.date.phpน่าจะดีกว่า
toxalot

@toxalot คำตอบที่ยอมรับนั้นผิด มันแก้ไขหลังจากคำตอบของฉัน & เกี่ยวกับลิงค์ของฉันฉันแทนที่ลิงค์ของคุณ ขอบคุณ
Tony Stark

1
คำถาม & คำตอบทั้งหมดนี้มีประวัติไม่ดี คำตอบที่ยอมรับนั้นผิดระหว่าง 29 เมษายน 2013 และ 24 พฤษภาคม 2013 มันถูกต้องเมื่อคุณโพสต์คำตอบของคุณเป็นครั้งแรก คำตอบของคุณคือการที่ไม่ถูกต้องจนถึง 29 พฤษภาคม 2013 หลังจากที่มันกลายเป็นคล้ายกันมากกับคำตอบที่ได้รับการยอมรับ
toxalot

23

ในที่สุดทางออกที่ถูกต้องสำหรับ PHP 5.3 ขึ้นไป: (เพิ่มเขตเวลาเผื่อเลือกลงในตัวอย่างที่กล่าวถึงในความคิดเห็น)

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

ข้อผิดพลาดของมัน .. คลาส 'App \ Controller \ DateTime' ไม่พบ .. การใช้ php 6.4
aswzen

1
หากคุณกำลังทำงานในเนมสเปซอื่นคุณต้องเรียกมันด้วยแบ็กสแลชที่อยู่ข้างหน้า:\DateTime::createFromFormat('Y-m-d H:i:s', $mysql_source_date);
Hasenpriester

2
อย่าลืมระบุเขตเวลาเมื่อคุณสร้างวัตถุวันที่ของคุณ! มิฉะนั้นวันที่จัดรูปแบบของคุณอาจปิดหลายชั่วโมง datetimeคอลัมน์ของคุณควรเป็น UTF8 ดังนั้นส่งผ่านnew DateTimeZone('UTC')เป็นพารามิเตอร์ที่ 3 เพื่อให้แน่ใจว่า PHP รู้
Eric Seastrand

นี่คือคำตอบที่ถูกต้องที่แสดงผลลัพธ์ของรูปแบบที่ต้องการของ OP เพียงดูแลเขตเวลา
นักบัญชีเริ่ม

12

วิธีที่ง่ายกว่าคือการจัดรูปแบบวันที่โดยตรงในแบบสอบถาม MySQL แทนที่จะเป็น PHP ดูรายการคู่มือ MySQL สำหรับ DATE_FORMAT

หากคุณต้องการทำใน PHP คุณต้องใช้ฟังก์ชันวันที่แต่คุณจะต้องแปลงค่าฐานข้อมูลของคุณให้เป็นเวลาประทับก่อน


11
-1 เนื่องจากวันที่จัดรูปแบบใน DB ไม่ใช่แนวคิดที่ดี เว็บหลายภาษาต้องการรูปแบบวันที่แตกต่างกันและจากนั้นคุณต้องจัดรูปแบบวันที่ใน PHP (ภาษาทางธุรกิจตรรกะทั่วไป) เมื่อคุณเขียนเกี่ยวกับdateฟังก์ชั่นคุณควรเขียนเกี่ยวกับstrottimeฟังก์ชั่นเพื่อช่วยคนอื่นแทน "แต่คุณจะต้องแปลงค่าฐานข้อมูลของคุณให้เป็นบันทึกเวลาก่อน"
Boris Šuška


9

เมื่อต้องการจัดรูปแบบDateTimeวัตถุใน PHP อย่างถูกต้องสำหรับการจัดเก็บใน MySQL ให้ใช้รูปแบบมาตรฐานที่ MySQL ใช้ซึ่งก็คือISO 86018601

PHP มีรูปแบบนี้เก็บเป็นค่าคงที่ตั้งแต่เวอร์ชัน 5.1.1 และฉันขอแนะนำให้ใช้แทนการพิมพ์สตริงด้วยตนเองทุกครั้ง

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

นี่และรายการของค่าคงที่ PHP DateTime อื่น ๆ สามารถดูได้ที่http://php.net/manual/en/class.datetime.php#datetime.constants.types


MySQL ไม่ได้ใช้รูปแบบนี้จริงและ MySQL จะสร้างคำเตือนหากคุณรวมตัวกำหนดเขตเวลา "+ xxxx" ที่สร้างขึ้นโดยมัน อัปเดต X SET Y = '2014-03-31T15: 00: 00 + 0100' โดยที่ Z; ข้อความค้นหาตกลง, ได้รับผลกระทบ 0 แถว, 1 คำเตือน (0.06 วินาที) แถวที่ตรงกัน: 1 เปลี่ยน: 0 คำเตือน: 1
George Lund

OP ต้องการที่จะใช้วันที่จากรูปแบบ MySQL และแปลงไป dd / mm / yy H: M (AM / PM)
toxalot

8

สิ่งนี้ควรจัดรูปแบบเขตข้อมูลในแบบสอบถาม SQL:

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

คุณควรระบุการสืบค้นMySQLไม่ใช่แค่ SQL เพราะนั่นไม่จำเป็นสำหรับฐานข้อมูลทั้งหมด ในขณะที่ OP ขอโซลูชัน PHP นี่เป็นทางเลือกที่ดีที่ OP อาจไม่ทราบ อย่างไรก็ตามสิ่งนี้จะไม่ให้รูปแบบที่ร้องขอ ที่จะได้รับ OP '%m/%d/%y %h:%i %p'รูปแบบตามที่ขอคุณจะต้อง
toxalot

7

ใช้ฟังก์ชั่นวันที่ :

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

25
ฟังก์ชัน date () ไม่คาดหวังว่าจะมีการประทับเวลาจำนวนเต็มแทนที่จะเป็นวันที่และเวลาที่ระบุไว้ในคำถามหรือไม่
Loftx

5

ขึ้นอยู่กับการกำหนดค่า MySQL datetime ของคุณ โดยทั่วไปแล้ว: 2011-12-31 07:55:13รูปแบบ ฟังก์ชั่นที่ง่ายมาก ๆ นี้ควรจะใช้เวทย์มนตร์:

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

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

หรือเพิ่มอีกเล็กน้อยเพื่อให้ตรงกับคำถาม

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

1
นี่ไม่ได้ตอบคำถาม OP OP ต้องการที่จะใช้วันที่จากรูปแบบ MySQL และแปลงไป dd / mm / yy H: M (AM / PM) นอกจากนี้สิ่งนี้จะจัดรูปแบบเวลาปัจจุบันไม่ใช่วันที่เฉพาะเจาะจง
toxalot

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

หากคุณไม่ต้องการที่จะเปลี่ยนทุกฟังก์ชั่นในรหัส PHP ของคุณเพื่อแสดงรูปแบบวันที่ที่คาดหวังให้เปลี่ยนที่แหล่งที่มา - ฐานข้อมูลของคุณ

มันเป็นสิ่งสำคัญที่จะตั้งชื่อแถวที่มีฐานะผู้ประกอบการในตัวอย่างข้างต้น (ตาม dateFrom เป็น dateUntil) ชื่อที่คุณเขียนมีชื่อแถวจะถูกเรียกในผลลัพธ์ของคุณ

ผลลัพธ์ของตัวอย่างนี้จะเป็น

[วันของเดือนเป็นตัวเลข (0..31)]. [ชื่อเดือน (มกราคม.. ธันวาคม. ธันวาคม)]. [ปีตัวเลขสี่หลัก]

ตัวอย่าง: 5.August.2015

เปลี่ยนจุดด้วยตัวคั่นที่เลือกและตรวจสอบฟังก์ชันDATE_FORMAT (วันที่, รูปแบบ)สำหรับรูปแบบวันที่เพิ่มเติม


3

คุณสามารถให้คิวรีส่งคืนเวลาเป็น Unix timestamp ที่จะกำจัดความต้องการที่จะโทรstrtotime()และทำให้สิ่งต่าง ๆ น้อยเข้มข้นในด้าน PHP ...

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

จากนั้นใน PHP เพียงใช้date()ฟังก์ชั่นเพื่อจัดรูปแบบตามที่คุณต้องการ

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

หรือ

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

ฉันชอบวิธีนี้เมื่อเทียบกับการใช้ฟังก์ชั่นของMySQLDATE_FORMATเพราะมันช่วยให้คุณสามารถใช้แบบสอบถามซ้ำเพื่อดึงข้อมูลและช่วยให้คุณสามารถเปลี่ยนการจัดรูปแบบใน PHP

เป็นเรื่องน่ารำคาญที่มีข้อความค้นหาสองแบบเพื่อเปลี่ยนวิธีการดูวันที่ใน UI


ผมชอบความคิดของการใช้เพื่อขจัดความจำเป็นในการUNIX_TIMESTAMP strtotimeคำตอบนี้จะดีกว่าถ้ามันเป็นตัวอย่างของการจัดรูปแบบเวลาในรูปแบบ OP ขอจริง
toxalot

1

คุณสามารถมีปัญหากับวันที่ไม่ได้ส่งคืนใน Unix Timestamp ดังนั้นการทำงานนี้สำหรับฉัน ...

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

1
สิ่งนี้ไม่แปลงวันที่เป็นรูปแบบที่ร้องขอโดย OP
toxalot

1

มันจะทำงาน ...

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

1
รูปแบบนั้นผสม 24 ครั้งกับ AM / PM มิฉะนั้นจะเป็นเช่นเดียวกับคำตอบที่ยอมรับซึ่งโพสต์เมื่อ 5+ ปีที่แล้ว
toxalot

0

การใช้ PHP เวอร์ชัน 4.4.9 และ MySQL 5.0 นี่ใช้งานได้สำหรับฉัน:

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

PubDateคอลัมน์ในMySQL


สิ่งนี้ไม่แปลงวันที่เป็นรูปแบบที่ร้องขอโดย OP
toxalot

0

วิธีที่ฉันแนะนำให้ใช้ทำงานได้ดังต่อไปนี้ ขั้นแรกให้คุณสร้างวัตถุ datetime ขั้นพื้นฐานจากสตริงที่จัดรูปแบบ mysql จากนั้นคุณจัดรูปแบบตามที่คุณต้องการ โชคดีที่ mysql datetime นั้นสอดคล้องกับมาตรฐาน ISO8601 ดังนั้นตัวรหัสเองจึงดูเรียบง่ายและสวยงาม เก็บไว้ในใจว่าที่datetimeคอลัมน์ไม่มีข้อมูลเขตเวลาดังนั้นคุณจะต้องแปลงได้อย่างเหมาะสม

นี่คือรหัส:

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

มันออกมา01/19/2038 11:14AM- หวังว่าสิ่งที่คุณคาดหวัง

ตัวอย่างนี้ใช้ไลบรารีเมอแรงค์ คุณสามารถดูข้อมูลเพิ่มเติมได้หากคุณต้องการ


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

1
นี่ไม่ได้ตอบคำถาม OP OP ต้องการที่จะใช้วันที่จากรูปแบบ MySQL และแปลงไป dd / mm / yy H: M (AM / PM) สิ่งนี้ตรงกันข้าม รวมทั้งรับข้อมูลจากแบบฟอร์มมากกว่าฐานข้อมูล
toxalot
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.