Format daty () PHP przy wstawianiu do datetime w MySQL

324

Jaki format należy przekazać do date()funkcji w PHP, jeśli chcę wstawić wynik do datetimekolumny typu MySQL ?

Próbowałem, date("Y-M-D G:i:s")ale za każdym razem wstawiam „0000-00-00 00:00:00”.

Alex
źródło
3
skoro nie podałeś do tej pory parametru, czy naprawdę chcesz zapisać bieżącą godzinę?
Mark Elliot,

Odpowiedzi:

680

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 Gna H, chociaż może to nie mieć wpływu, prawdopodobnie chcesz użyć formatu 24-godzinnego z wiodącymi zerami.

Mark Elliot
źródło
28
musi to być jeden z najpopularniejszych formatów daty i godziny, jakich kiedykolwiek potrzebowałby ktoś. powinien być wbudowanym globalnym php lub częścią samej funkcji daty (np. „c”, „r”)
billynoah
33
Dlaczego tak nie jest, nie wiem. Muszę odnosić się do każdego przepełnienia stosu. pojedynczy. funkcjonowanie. czas.
Mazatec
11
Szybciej tu przychodzę, niż szukać w moim kodzie takiego użycia.
MRodrigues
64
Pomyślałem cute mnemoników za pamięć w formacie: „ Y nasz m y d nie jedli Jego ”. działa na tak wielu poziomach :)
IzzEps,
2
Powinno być do tego skrócenie php, ponieważ jest to dla ISO 8601 i RFC 2822
billynoah
105

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.

Tim Lytle
źródło
1
Dzięki @Pekka - pamiętam, kiedy ty i ja mieliśmy mniej więcej tego samego przedstawiciela - byłeś dość aktywny.
Tim Lytle,
1
tak, teraz dużo pracuję, a SO to moja ulubiona rozrywka pomiędzy :), która znów się zmieni.
Pekka
41

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_UNIXTIMEfunkcji.

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 |
+---------------------+
JAL
źródło
To eleganckie rozwiązanie. Dzięki :)
kta
2
@trejder, Kto ci powiedział, że robienie tego w mysql jest szybsze niż robienie w php? Robienie tego w PHP jest lepsze, ponieważ DB zazwyczaj stanowi wąskie gardło i chcesz jak najszybciej wejść i wyjść .
Pacerier
1
@Pacerier DB to wąskie gardło, jeśli masz źle zbudowaną bazę danych lub uruchamiasz zbyt wiele małych zapytań zamiast bardziej niezawodnego pojedynczego zapytania lub w wielu przypadkach, jeśli zarządzasz bazą danych przy użyciu ORM. Solid SQL z dobrze zindeksowaną relacyjną bazą danych nie jest wolny.
mopsyd
2
@mopsyd, DB jest wąskim gardłem, ponieważ skalowanie go w poziomie wymaga złożoności. Porównaj to z serwerami WWW, które można powielać na całym świecie bez żadnych zmian w kodzie.
Pacerier
1
Jeśli zapytanie nie powiedzie się, zostanie gdzieś zarejestrowane i trzeba je debugować, znacznik czasu jest znacznie trudniejszy do odczytania niż sformatowany ciąg daty opisany przez @ tim-lytle.
humbads
27

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.

Steffan Clent Davies
źródło
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`
Ali Umair
źródło
2
Chociaż ten kod może odpowiedzieć na pytanie, dostarczenie dodatkowego kontekstu dotyczącego tego, dlaczego i / lub jak odpowiada na pytanie, znacznie poprawiłoby jego długoterminową wartość. Proszę edytować swoją odpowiedź dodać kilka wyjaśnień i naprawić problemy z formatowaniem.
Toby Speight
9

Sformatuj znacznik czasu w kolumnie DATETIME MySQL:

strftime('%Y-%m-%d %H:%M:%S',$timestamp);
Ahmed Sabre
źródło
8

Sformatuj datetime MySQL za pomocą PHP

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

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;
}
SandroMarques
źródło
Głosowałem za odpowiedzią, ponieważ zadziałało po zredagowaniu pierwszego wiersza; function getDateForDatabase(string $date) : string {aby function getDateForDatabase($date) {Dlaczego deklaracje typu rzucać błąd nie wiem wystarczająco dużo PHP do opowiedzenia.
Chris Pink
„Argument 1 przekazany do getDateForDatabase () musi być instancją ciągu, podano ciąg znaków” - mój wpis był ciągiem,
Chris Pink
7

Nie musisz używać metody date () z PHP, jeśli nie używasz znacznika czasu. Jeśli datepostedjest kolumna daty i godziny, możesz wstawić bieżącą datę w następujący sposób:

$db->query("INSERT INTO table (dateposted) VALUES (now())");
Adam
źródło
2
Dzięki za podzielenie się tym podejściem. To najłatwiejsza metoda, jaką do tej pory widziałem.
Shondeslitch,
2

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));
    }
}
Brian Jones
źródło
1

Korzystanie z DateTimeklasy 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");
}
Nino Škopac
źródło
1

Mały dodatek do zaakceptowanej odpowiedzi: Jeśli baza danych datetimejest 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_TIMESTAMPz tym samym rezultatem.

Uwaga: zrozumiałem pytanie dotyczące aktualnego czasu.

Bruno
źródło
0

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

Maurici Abad
źródło