2010-02-07 60 views
226

Định dạng đúng để chuyển cho hàm date() trong PHP là gì nếu tôi muốn chèn kết quả vào cột loại datetime của MySQL?Định dạng ngày tháng() khi chèn vào datetime trong MySQL

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

+3

vì bạn không cung cấp thông số cho đến nay bạn có thực sự muốn ghi lại thời gian hiện tại không? –

Trả lời

489

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

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

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

+15

điều này phải là một trong những định dạng ngày giờ phổ biến nhất mà mọi người sẽ cần. nên được xây dựng trong php toàn cầu hoặc một phần của chính hàm ngày (ví dụ: 'c', 'r') – billynoah

+16

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 ngăn xếp tràn mỗi. Độc thân. hoạt động. thời gian. – Ash

+5

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

94

Từ ý kiến ​​của php của date() manual page:

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

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

+1

+1 cho giải thích mở rộng nhất và liên kết thủ công :) –

+1

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

+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 :) sẽ thay đổi một lần nữa. –

36

Đây là giải pháp thay thế: nếu bạn có ngày trong PHP làm dấu thời gian, hãy bỏ qua xử lý bằng PHP và để cho DB xử lý việc chuyển đổi bằng cách sử dụng hàm 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 | 
+---------------------+ 
+0

Đây là một giải pháp thanh lịch. Cảm ơn :) – kta

+0

Đó là tùy chọn tốt nhất, nếu bạn có thể làm việc trên dấu thời gian. Hãy để siêu nhanh DB làm tất cả mọi thứ, nó có thể, thay vì chờ đợi cho siêu chậm PHP! – trejder

+2

@trejder, Ai nói với bạn rằng làm điều đó trong mysql là nhanh hơn làm nó trong 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 ** nhận được vào và ra càng sớm càng tốt **. – Pacerier

19

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

$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ủ.

7

Format MySQL datetime với PHP

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

thời gian Format tem để cột MySQL DATETIME:

strftime('%Y-%m-%d %H:%M:%S',$timestamp); 
7
$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 liên quan đến _why_ và/hoặc _how_ nó trả lời câu hỏi sẽ cải thiện đáng kể giá trị dài hạn của nó. Vui lòng [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 sự cố định dạng của bạn. –

5

Không cần không sử dụng phương pháp ngày() từ PHP nếu bạn don không sử dụng dấu thời gian. Nếu dateposted là một 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 bạn đã chia sẻ phương pháp này. Đó là phương pháp dễ nhất mà tôi đã thấy cho đến bây giờ. – Shondeslitch

4

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

phiên bản cũ của PHP (PHP < 7)

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

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 (chuỗi $ date): string {' to 'function getDateForDatabase ($ date) {' Tại sao các kiểu khai báo đưa ra một lỗi, tôi không biết đủ PHP để nói. –

+0

"Đối số 1 được chuyển đến 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, –

+0

Cảm ơn! Tôi đã tự hỏi nếu đó là nó. –

0

Đ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 dường như bắt tất cả đầu vào và đưa ra một chuỗi SQL tốt, đúng hoặc ít nhất là hợp lệ và có thể kiểm tra được. Nếu nó là 1999-12-31 nó có thể sai nhưng sẽ không ném một 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)); 
    } 
} 
Các vấn đề liên quan