PHP date () формат при вставке в datetime в 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")который использует числовые эквиваленты.

edit: переключено Gна H, хотя это может не иметь влияния, вы, вероятно, захотите использовать 24-часовой формат с ведущими нулями.


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

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

11
Это быстрее прийти сюда, чем искать в моем коде такое использование.
MRodrigues

64
Просто подумал , что мило мнемонические для запоминания формат: « У нашего м у д ел не Его ». работает на многих уровнях :)
IzzEps

2
Для этого должен быть сокращенный
текст

105

Из комментариев на date()странице руководства php :

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

Вы правильно указали букву «Y» - это полный год, но «M» - это трехзначный месяц, а «m» - двузначный месяц. Та же проблема с «D» вместо «d». «G» - это час с 1 или 2 цифрами, где «H» всегда имеет ведущий 0, когда это необходимо.


1
Спасибо @Pekka - я помню, когда у нас с тобой был примерно один и тот же представитель - ты был довольно активным.
Тим Литл

1
да, я сейчас много работаю, и ТАК мое любимое времяпрепровождение :), которое снова изменится.
Пекка

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 DB является узким местом, если у вас плохо построенная БД или вы выполняете слишком много небольших запросов вместо более надежного эффективного отдельного запроса, или во многих случаях, если вы используете ORM для управления базой данных. Твердый SQL с хорошо проиндексированной реляционной базой данных не медленный.
mopsyd

2
@mopsyd, БД является узким местом, потому что масштабирование по горизонтали требует сложности. Сравните это с веб-серверами, которые можно дублировать по всему миру без каких-либо изменений кода.
Pacerier

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

27

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

$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
Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, почему и / или как он отвечает на вопрос, значительно улучшит его долгосрочную ценность. Пожалуйста, отредактируйте свой ответ, чтобы добавить пояснения и исправить проблемы с форматированием.
Тоби Спейт


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.