Jaki format należy przekazać do date()
funkcji w PHP, jeśli chcę wstawić wynik do datetime
kolumny typu MySQL ?
Próbowałem, date("Y-M-D G:i:s")
ale za każdym razem wstawiam „0000-00-00 00:00:00”.
Jaki format należy przekazać do date()
funkcji w PHP, jeśli chcę wstawić wynik do datetime
kolumny typu MySQL ?
Próbowałem, date("Y-M-D G:i:s")
ale za każdym razem wstawiam „0000-00-00 00:00:00”.
Odpowiedzi:
Problem polega na tym, że używasz 'M'
i 'D'
, które są reprezentacjami tekstowymi, MySQL oczekuje numerycznej reprezentacji formatu2010-02-06 19:30:13
Spróbuj: date("Y-m-d H:i:s")
który używa liczbowych odpowiedników.
edit: zmieniono G
na H
, chociaż może to nie mieć wpływu, prawdopodobnie chcesz użyć formatu 24-godzinnego z wiodącymi zerami.
Z komentarzy date()
strony podręcznika php :
<?php $mysqltime = date ("Y-m-d H:i:s", $phptime); ?>
Miałeś poprawne „Y” - to pełny rok, ale „M” to miesiąc trzech znaków, a „m” to miesiąc dwóch cyfr. Ten sam problem z „D” zamiast „d”. „G” jest 1 lub 2 cyfrową godziną, gdzie „H” zawsze ma początkowe zero, gdy jest potrzebne.
Oto alternatywne rozwiązanie: jeśli masz datę w PHP jako znacznik czasu, pomiń jej obsługę za pomocą PHP i pozwól DB zająć się jej przekształceniem za pomocą FROM_UNIXTIME
funkcji.
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 |
+---------------------+
Korzystam z następującego kodu PHP, aby utworzyć zmienną, którą wstawiam do kolumny DATETIME MySQL.
$datetime = date_create()->format('Y-m-d H:i:s');
Spowoduje to przechowywanie aktualnej daty i godziny serwera.
$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`
Sformatuj znacznik czasu w kolumnie DATETIME MySQL:
strftime('%Y-%m-%d %H:%M:%S',$timestamp);
Korzystam z tej funkcji (PHP 7)
function getDateForDatabase(string $date): string {
$timestamp = strtotime($date);
$date_formated = date('Y-m-d H:i:s', $timestamp);
return $date_formated;
}
Starsze wersje 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 {
aby function getDateForDatabase($date) {
Dlaczego deklaracje typu rzucać błąd nie wiem wystarczająco dużo PHP do opowiedzenia.
Nie musisz używać metody date () z PHP, jeśli nie używasz znacznika czasu. Jeśli dateposted
jest kolumna daty i godziny, możesz wstawić bieżącą datę w następujący sposób:
$db->query("INSERT INTO table (dateposted) VALUES (now())");
Doprowadziło mnie to do szaleństwa, szukając prostej odpowiedzi. W końcu stworzyłem tę funkcję, która wydaje się przechwytywać wszystkie dane wejściowe i dawać dobry ciąg SQL, który jest poprawny lub przynajmniej poprawny i możliwy do sprawdzenia. Jeśli jest to 1999-12-31, to prawdopodobnie źle, ale nie zgłasza złego błędu w 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));
}
}
Korzystanie z DateTime
klasy w 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");
}
Mały dodatek do zaakceptowanej odpowiedzi: Jeśli baza danych datetime
jest przechowywana jako UTC (co zawsze robię), powinieneś użyć gmdate("Y-m-d H:i:s")
zamiast date("Y-m-d H:i:s")
.
Lub, jeśli wolisz, aby MySQL obsługiwał wszystko, jak sugerują niektóre odpowiedzi, wstawiłbym MySQL UTC_TIMESTAMP
z tym samym rezultatem.
Uwaga: zrozumiałem pytanie dotyczące aktualnego czasu.
Jest to dokładniejszy sposób na zrobienie tego. Umieszcza ułamki dziesiętne za sekundami, zapewniając większą precyzję.
$now = date('Y-m-d\TH:i:s.uP', time());
Zwróć uwagę na .uP
.
Więcej informacji: https://stackoverflow.com/a/6153162/8662476