รูปแบบวันที่ PHP () เมื่อแทรกเข้าสู่ datetime ใน MySQL


324

รูปแบบที่ถูกต้องในการส่งผ่านไปยังdate()ฟังก์ชันใน PHP คืออะไรถ้าฉันต้องการแทรกผลลัพธ์ลงในdatetimeคอลัมน์ประเภทMySQL ?

ฉันพยายามแล้วdate("Y-M-D G:i:s")แต่ก็แค่แทรก "0000-00-00 00:00:00" ทุกครั้ง


3
เนื่องจากคุณไม่ได้ระบุพารามิเตอร์จนถึงปัจจุบันคุณต้องการบันทึกเวลาปัจจุบันจริงหรือไม่
Mark Elliot

คำตอบ:


680

ปัญหาคือว่าคุณกำลังใช้'M'และ'D'ซึ่งเป็นตัวแทนข้อความต้นฉบับ, MySQL คาดว่าจะเป็นตัวแทนของรูปแบบตัวเลข2010-02-06 19:30:13

ลอง: date("Y-m-d H:i:s")ซึ่งใช้การเทียบเท่าตัวเลข

แก้ไข: เปลี่ยนGเป็นHแม้ว่ามันอาจจะไม่มีผลกระทบ แต่คุณอาจต้องการใช้รูปแบบ 24 ชั่วโมงกับ 0 ส่วนนำ


28
สิ่งนี้จะต้องเป็นหนึ่งในรูปแบบ datetime ที่พบบ่อยที่สุดที่ทุกคนต้องการ ควรสร้างใน php global หรือเป็นส่วนหนึ่งของฟังก์ชัน date (เช่น 'c', 'r')
billynoah

33
ทำไมนี่ไม่ใช่กรณีที่ฉันไม่ทราบ ฉันต้องอ้างถึง stack overflow ทุกครั้ง เดียว การทำงาน เวลา.
Mazatec

11
มันมาเร็วกว่าการค้นหาในรหัสของฉันสำหรับการใช้งานแบบนี้
MRodrigues

64
แค่คิดว่าเป็นตัวช่วยจำที่น่ารักสำหรับการจดจำรูปแบบ: " Y y m m y dของเราไม่ใช่ของเขา " ผลงานในหลายระดับดังนั้น :)
IzzEps

2
ควรมีชวเลข php สำหรับสิ่งนี้เนื่องจากมี ISO 8601 และ RFC 2822
billynoah

105

จากความคิดเห็นของdate()หน้าคู่มือของ php :

<?php $mysqltime = date ("Y-m-d H:i:s", $phptime); ?>

คุณได้คำว่า 'Y' ถูกต้อง - นั่นคือตลอดทั้งปี แต่ 'M' คือเดือนสามตัวอักษรในขณะที่ 'm' คือเดือนสองหลัก ปัญหาเดียวกันกับ 'D' แทนที่จะเป็น 'd' 'G' คือ 1 หรือ 2 หลักชั่วโมงโดยที่ 'H' จะมี 0 นำหน้าเสมอเมื่อต้องการ


1
ขอบคุณ @Pekka - ฉันจำได้ว่าเมื่อคุณและฉันมีตัวแทนเดียวกัน - คุณค่อนข้างกระตือรือร้น
Tim Lytle

1
ใช่ฉันทำงานมากตอนนี้และเป็นงานอดิเรกที่ฉันโปรดปรานในระหว่าง :) ที่จะเปลี่ยนอีกครั้ง
Pekka

41

ต่อไปนี้เป็นทางเลือกอื่น: หากคุณมีวันที่ใน PHP เป็น timestamp ให้ข้ามการจัดการกับ PHP และปล่อยให้ DB ดูแลการแปลงโดยใช้FROM_UNIXTIMEฟังก์ชัน

mysql> insert into a_table values(FROM_UNIXTIME(1231634282));
Query OK, 1 row affected (0.00 sec)

mysql> select * from a_table;

+---------------------+
| a_date              |
+---------------------+
| 2009-01-10 18:38:02 |
+---------------------+

นี่เป็นทางออกที่สง่างาม
ขอบคุณ

2
@trejder ใครบอกคุณว่าการทำใน mysql นั้นเร็วกว่าการทำใน php? ทำมันใน PHP จะดีกว่าเพราะฐานข้อมูลมักจะเป็นคอขวดและคุณต้องการที่จะได้รับในและออกโดยเร็ว
Pacerier

1
@Pacerier DB เป็นคอขวดหากคุณมีฐานข้อมูลที่สร้างขึ้นไม่ดีหรือกำลังเรียกใช้คิวรีขนาดเล็กมากเกินไปแทนที่จะเป็นคิวรีเดี่ยวที่มีประสิทธิภาพมากกว่าหรือในหลายกรณีหากคุณใช้ ORM เพื่อจัดการฐานข้อมูล Solid SQL ที่มีฐานข้อมูลเชิงสัมพันธ์ที่จัดทำดัชนีไว้ไม่ช้า
mopsyd

2
@opsyd, DB เป็นคอขวดเนื่องจากการปรับขนาดในแนวนอนต้องการความซับซ้อน เปรียบเทียบกับ webservers ที่สามารถทำซ้ำได้ทั่วโลกโดยไม่มีการเปลี่ยนแปลงรหัสใด ๆ
Pacerier

1
หากการสืบค้นล้มเหลวจะถูกบันทึกไว้ที่ใดที่หนึ่งและคุณต้องทำการดีบักดังนั้นการประทับเวลาจะอ่านได้ยากกว่าสตริงวันที่จัดรูปแบบที่อธิบายโดย @ tim-lytle
humbads

27

ฉันใช้โค้ด PHP ต่อไปนี้เพื่อสร้างตัวแปรที่ฉันใส่ลงในคอลัมน์ MySQL DATETIME

$datetime = date_create()->format('Y-m-d H:i:s');

สิ่งนี้จะเก็บวันที่และเวลาปัจจุบันของเซิร์ฟเวอร์


12
$date_old = '23-5-2016 23:15:23'; 
//Date for database
$date_for_database = date ("Y-m-d H:i:s", strtotime($date_old));

//Format should be like 'Y-m-d H:i:s'`enter code here`

2
แม้ว่ารหัสนี้อาจตอบคำถาม แต่การให้บริบทเพิ่มเติมเกี่ยวกับสาเหตุและ / หรือวิธีการตอบคำถามนั้นจะช่วยปรับปรุงมูลค่าระยะยาวได้อย่างมีนัยสำคัญ โปรดแก้ไขคำตอบของคุณเพื่อเพิ่มคำอธิบายและแก้ไขปัญหาการจัดรูปแบบของคุณ
Toby Speight



8

ฉันใช้ฟังก์ชั่นนี้ (PHP 7)

function getDateForDatabase(string $date): string {
    $timestamp = strtotime($date);
    $date_formated = date('Y-m-d H:i:s', $timestamp);
    return $date_formated;
}

PHP เวอร์ชันเก่ากว่า (PHP <7)

function getDateForDatabase($date) {
    $timestamp = strtotime($date);
    $date_formated = date('Y-m-d H:i:s', $timestamp);
    return $date_formated;
}

ฉันโหวตคำตอบของคุณเพราะมันทำงานหลังจากที่ฉันแก้ไขบรรทัดแรก function getDateForDatabase(string $date) : string {ไปfunction getDateForDatabase($date) {ทำไมการประกาศประเภทโยนความผิดพลาดผมไม่ทราบว่าพอจะบอก PHP
Chris Pink

"อาร์กิวเมนต์ 1 ส่งผ่านไปยัง getDateForDatabase () ต้องเป็นตัวอย่างของสตริงสตริงที่กำหนด" - อินพุตของฉันเป็นสตริง
Chris Pink

7

ไม่จำเป็นต้องใช้เมธอด date () จาก PHP หากคุณไม่ได้ใช้การประทับเวลา หากdatepostedเป็นคอลัมน์วันที่และเวลาคุณสามารถแทรกวันที่ปัจจุบันดังนี้

$db->query("INSERT INTO table (dateposted) VALUES (now())");

2
ขอบคุณที่แบ่งปันวิธีการนี้ มันเป็นวิธีที่ง่ายที่สุดที่ฉันเคยเห็นมาจนถึงตอนนี้
Shondeslitch

2

นี่ทำให้ฉันคลั่งไคล้หาคำตอบง่ายๆ ในที่สุดฉันก็ทำฟังก์ชั่นนี้ซึ่งดูเหมือนว่าจะจับอินพุตทั้งหมดและให้สตริง SQL ที่ดีที่ถูกต้องหรืออย่างน้อยก็ใช้ได้และตรวจสอบได้ ถ้ามันคือ 1999-12-31 มันอาจจะผิด แต่จะไม่เกิดข้อผิดพลาดใน MySQL

function MakeSQLDate($date) {
    if (is_null($date)) {
        //use 1999-12-31 as a valid date or as an alert
        return date('Y-m-d', strtotime('1999-12-31'));
    }

    if (($t = strtotime($date)) === false) {
        //use 1999-12-31 as a valid date or as an alert
        return date('Y-m-d', strtotime('1999-12-31'));
    } else {
        return date('Y-m-d H:i:s', strtotime($date));
    }
}

1

ใช้DateTimeคลาสใน PHP7 +:

function getMysqlDatetimeFromDate(int $day, int $month, int $year): string {
    $dt = new DateTime();
    $dt->setTimezone(new DateTimeZone('UTC'));
    $dt->setDate($year, $month, $day);
    $dt->setTime(0, 0, 0, 0); // set tine to midnight

    return $dt->format("Y-m-d H:i:s");
}

1

ภาคผนวกขนาดเล็กที่จะได้รับการยอมรับคำตอบ: ถ้าฐานข้อมูลdatetimeจะถูกเก็บเป็น UTC (สิ่งที่ฉันเคยทำ) คุณควรใช้แทนgmdate("Y-m-d H:i:s")date("Y-m-d H:i:s")

หรือถ้าคุณต้องการให้ MySQL จัดการทุกอย่างตามที่คำตอบบางข้อเสนอแนะฉันจะแทรก MySQL UTC_TIMESTAMPด้วยผลลัพธ์เดียวกัน

หมายเหตุ: ฉันเข้าใจคำถามที่อ้างถึงเวลาปัจจุบัน


0

นี่เป็นวิธีที่แม่นยำกว่าในการทำ มันวางทศนิยมหลังวินาทีให้ความแม่นยำมากขึ้น

$now = date('Y-m-d\TH:i:s.uP', time());

.uPแจ้งให้ทราบล่วงหน้า

ข้อมูลเพิ่มเติม: https://stackoverflow.com/a/6153162/8662476

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.