Формат дати () PHP під час вставки в дату в MySQL


324

Який правильний формат для передачі date()функції в PHP, якщо я хочу вставити результат у datetimeстовпець типу MySQL ?

Я намагався, date("Y-M-D G:i:s")але це просто вставляє "0000-00-00 00:00:00" кожного разу.


3
оскільки ви не надаєте параметр на сьогоднішній день, чи справді ви хочете записати поточний час?
Марк Елліот

Відповіді:


680

Проблема полягає в тому, що ви використовуєте 'M'і 'D', які є текстуальні уявлення, MySQL очікує числове уявлення формату2010-02-06 19:30:13

Спробуйте: date("Y-m-d H:i:s")який використовує числові еквіваленти.

редагувати: перемкнено Gна H, хоча це може не мати впливу, можливо, ви хочете використовувати 24-годинний формат із провідними 0.


28
це має бути одним із найпоширеніших форматів дати, кому-небудь коли-небудь знадобиться. має бути вбудованим у php global або частиною самої функції дати (наприклад, 'c', 'r')
billynoah

33
Чому це не так, я не знаю. Я повинен посилатися на переповнення стека кожен. неодружений функціонування. час.
Мазатек

11
Швидше приїхати сюди, ніж шукати в моєму коді таке використання.
MRodrigues

64
Якраз подумав про милу мнемоніку для запам’ятовування формату: „ Y our m y d d a ee Not His ”. працює на стільки рівнів :)
IzzEps

2
Для цього має бути стенограма php, як це стосується ISO 8601 та RFC 2822
billynoah

105

З коментарів php's date() сторінки керівництва :

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

У вас було правильне значення "Y" - це повний рік, але "M" - це тризначний місяць, тоді як "m" - двозначний місяць. Те саме питання з "D" замість "d". 'G' - це 1 або 2 цифри години, де 'H' завжди має провідний 0, коли це необхідно.


1
Дякую @Pekka - я пам'ятаю, коли ми з вами мали приблизно однаковий представник - ви були досить активними.
Тім Літлл

1
так, я зараз багато працюю, і тому моє улюблене проведення часу між ними :), що зміниться знову.
Pekka

41

Ось альтернативне рішення: якщо у вас є дата в PHP як часова мітка, обійдіть її обробкою з PHP і дозвольте БД подбати про її перетворення за допомогою 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 |
+---------------------+

Це елегантне рішення.
Дякую

2
@trejder, Хто вам сказав, що робити це в mysql швидше, ніж робити це в php? Робити це в PHP краще, тому що БД, як правило, є вузьким місцем, і ви хочете якнайшвидше потрапити і вийти .
Pacerier

1
@Pacerier БД є вузьким місцем, якщо у вас погано вбудована БД, або у вас надто багато невеликих запитів замість більш надійного ефективного запиту, або у багатьох випадках, якщо ви покладаєтесь на ORM для управління базою даних. Суцільний SQL з добре індексованою реляційною базою даних не є повільним.
мопсид

2
@mopsyd, БД є вузьким місцем, оскільки масштабування його по горизонталі вимагає складності. Порівняйте це з веб-серверами, які можна дублювати по всьому світу без змін коду.
Pacerier

1
Якщо запит не вдається, десь входить у систему, і вам доведеться його налагоджувати, то часову позначку читати набагато важче, ніж відформатований рядок дати, описаний @ tim-lytle.
хабади

27

Я використовую наступний код PHP для створення змінної, яку я вставляю в колонку DATETIME MySQL.

$datetime = date_create()->format('Y-m-d H:i:s');

Це дозволить утримувати поточну дату та час на сервері.


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
Хоча цей код може відповісти на питання, надаючи додатковий контекст щодо того, чому та / або як він відповідає на питання, значно покращить його довгострокове значення. Будь ласка , змініть свій відповідь , щоб додати якийсь - то пояснення, і , щоб виправити ваші проблеми форматування.
Toby Speight


8

Відформатуйте дату MySQL за допомогою PHP

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

8

Я використовую цю функцію (PHP 7)

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

Старіші версії 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 {до function getDateForDatabase($date) {Чому декларації типу видають помилку, я не знаю достатньо PHP.
Кріс Пінк

"Аргумент 1 переданий до getDateForDatabase () повинен бути екземпляром рядка, дано рядок", - мій вхід був рядком,
Кріс Пінк

7

Якщо ви не використовуєте часову позначку, не потрібно використовувати метод date () від PHP. Якщо datepostedстовпець дати, ви можете вставити поточну дату так:

$db->query("INSERT INTO table (dateposted) VALUES (now())");

2
Дякуємо, що поділилися цим підходом. Це найпростіший метод, який я бачив досі.
Shondeslitch

2

Це зводило мене з розуму, шукаючи просту відповідь. Нарешті я зробив цю функцію, яка, схоже, вловлює весь вхід і дає хороший рядок SQL, який є правильним або, принаймні, дійсним і перевіряється. Якщо це 1999-12-31, це, мабуть, неправильно, але не призведе до помилки в 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

Використання DateTimeкласу в 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

Невеликий додаток до прийнятої відповіді: Якщо база даних datetimeзберігається як UTC (що я завжди роблю), ви повинні використовувати gmdate("Y-m-d H:i:s")замість цього date("Y-m-d H:i:s").

Або, якщо ви вважаєте за краще дозволити MySQL впоратись із усім, як підказують деякі відповіді, я б вставив MySQL UTC_TIMESTAMP з таким же результатом.

Примітка. Я зрозумів питання, що стосується поточного часу.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.