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.