Định dạng ngày () của PHP khi chèn vào datetime trong MySQL


324

Định dạng đúng để truyền cho date()hàm trong PHP là gì nếu tôi muốn chèn kết quả vào datetimecột kiểu MySQL ?

Tôi đã cố gắng date("Y-M-D G:i:s")nhưng chỉ cần chèn "0000-00-00 00:00:00" mọi lúc.


3
vì bạn không cung cấp một tham số cho đến nay, bạn có thực sự muốn ghi lại thời gian hiện tại không?
Đánh dấu Elliot

Câu trả lời:


680

Vấn đề là bạn đang sử dụng 'M''D', là một biểu diễn văn bản, MySQL đang mong đợi một biểu diễn số của định dạng2010-02-06 19:30:13

Hãy thử: date("Y-m-d H:i:s")trong đó sử dụng tương đương số.

chỉnh sửa: chuyển Gđến H, mặc dù nó có thể không có tác động, có thể bạn muốn sử dụng định dạng 24 giờ với leading 0s.


28
đây phải là một trong những định dạng datetime phổ biến nhất mà bất kỳ ai cũng cần. nên được xây dựng trong php toàn cầu hoặc một phần của hàm ngày (ví dụ: 'c', 'r')
billynoah

33
Tại sao đây không phải là trường hợp tôi không biết. Tôi phải tham khảo stack overflow every. Độc thân. chức năng. thời gian.
Mazatec

11
Đến đây nhanh hơn, tìm kiếm trong mã của tôi để sử dụng như thế này.
MRodrigues

64
Chỉ cần nghĩ về một người dễ nhớ để nhớ định dạng: " Y our m y d at not not His ". hoạt động trên nhiều cấp độ :)
IzzEps

2
Cần có một tốc ký php cho điều này vì có ISO 8601 và RFC 2822
billynoah

105

Từ các bình luận của date()trang hướng dẫn của php :

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

Bạn đã có 'Y' chính xác - đó là một năm đầy đủ, nhưng 'M' là một tháng có ba ký tự, trong khi 'm' là một tháng có hai chữ số. Vấn đề tương tự với 'D' thay vì 'd'. 'G' là giờ 1 hoặc 2 chữ số, trong đó 'H' luôn có số 0 đứng đầu khi cần.


1
Cảm ơn @Pekka - Tôi nhớ khi bạn và tôi có cùng một đại diện - bạn đã khá tích cực.
Tim Lyussy

1
vâng, tôi đang làm việc rất nhiều ngay bây giờ và SO là trò tiêu khiển yêu thích của tôi ở giữa :) điều đó sẽ thay đổi một lần nữa.
Pekka

41

Đây là một giải pháp thay thế: nếu bạn có ngày trong PHP dưới dạng dấu thời gian, hãy bỏ qua việc xử lý nó với PHP và để DB đảm nhiệm việc chuyển đổi nó bằng cách sử dụng FROM_UNIXTIMEhàm.

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 |
+---------------------+

Đây là một giải pháp tao nhã
Xin cảm ơn

2
@trejder, Ai nói với bạn rằng làm điều đó trong mysql nhanh hơn làm bằng php? Làm điều đó trong PHP là tốt hơn bởi vì DB thường là nút cổ chai và bạn muốn vào và ra càng sớm càng tốt .
Pacerier

1
@Pacerier DB là nút cổ chai nếu bạn có DB được xây dựng kém hoặc đang chạy quá nhiều truy vấn nhỏ thay vì truy vấn đơn hiệu quả mạnh hơn hoặc trong nhiều trường hợp nếu bạn dựa vào ORM để quản lý cơ sở dữ liệu. SQL rắn với cơ sở dữ liệu quan hệ được lập chỉ mục tốt là không chậm.
mopsyd 1/5/2015

2
@mopsyd, DB là nút cổ chai vì việc nhân rộng nó theo chiều ngang đòi hỏi sự phức tạp. So sánh điều đó với máy chủ web có thể được nhân đôi trên toàn cầu mà không có bất kỳ thay đổi mã nào.
Pacerier

1
Nếu truy vấn không thành công, được ghi lại ở đâu đó và bạn phải gỡ lỗi nó, thì dấu thời gian khó đọc hơn nhiều so với chuỗi ngày được định dạng được mô tả bởi @ tim-lyicate.
humbads

27

Tôi sử dụng mã PHP sau đây để tạo một biến mà tôi chèn vào cột MySQL DATETIME.

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

Điều này sẽ giữ Ngày và Giờ hiện tại của máy chủ.


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
Mặc dù mã này có thể trả lời câu hỏi, cung cấp ngữ cảnh bổ sung về lý do tại sao và / hoặc cách nó trả lời câu hỏi sẽ cải thiện đáng kể giá trị lâu dài của nó. Vui lòng chỉnh sửa câu trả lời của bạn để thêm một số giải thích và để khắc phục các vấn đề định dạng của bạn.
Toby Speight

9

Định dạng dấu thời gian vào cột MySQL DATETIME:

strftime('%Y-%m-%d %H:%M:%S',$timestamp);

8

Định dạng datetime MySQL với PHP

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

8

Tôi sử dụng chức năng này (PHP 7)

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

Các phiên bản cũ hơn của PHP (PHP <7)

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

Tôi đã bỏ phiếu cho câu trả lời của bạn vì nó hoạt động sau khi tôi chỉnh sửa dòng đầu tiên; function getDateForDatabase(string $date) : string {đến function getDateForDatabase($date) {Tại sao các khai báo kiểu đưa ra một lỗi tôi không biết đủ PHP để nói.
Chris Pink

"Đối số 1 được truyền cho getDateForDatabase () phải là một thể hiện của chuỗi, chuỗi đã cho", - đầu vào của tôi là một chuỗi,
Chris Pink

7

Không cần sử dụng phương thức date () từ PHP nếu bạn không sử dụng dấu thời gian. Nếu datepostedlà cột datetime, bạn có thể chèn ngày hiện tại như thế này:

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

2
Cảm ơn đã chia sẻ phương pháp này. Đó là phương pháp dễ nhất tôi thấy cho đến bây giờ.
Shondeslitch

2

Điều này đã khiến tôi phát điên khi tìm kiếm một câu trả lời đơn giản. Cuối cùng tôi đã thực hiện chức năng này có vẻ như bắt tất cả đầu vào và đưa ra một chuỗi SQL tốt, chính xác hoặc ít nhất là hợp lệ và có thể kiểm tra được. Nếu đó là 1999-12-31 thì có lẽ sai nhưng sẽ không gây ra lỗi xấu trong 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

Sử dụng DateTimelớp trong 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

Một phụ lục nhỏ cho câu trả lời được chấp nhận: Nếu cơ sở dữ liệu datetimeđược lưu trữ dưới dạng UTC (những gì tôi luôn làm), bạn nên sử dụng gmdate("Y-m-d H:i:s")thay vì date("Y-m-d H:i:s").

Hoặc, nếu bạn muốn để MySQL xử lý mọi thứ, như một số câu trả lời gợi ý, tôi sẽ chèn MySQL UTC_TIMESTAMP, với kết quả tương tự.

Lưu ý: Tôi hiểu câu hỏi đề cập đến thời điểm hiện tại.


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.