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


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.


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.


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

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.


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

8

Sformatuj datetime MySQL za pomocą PHP

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

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

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())");

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

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

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.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.