PHP date () формат при вставке в datetime в MySQL

224

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

Я пытаюсь date("Y-M-D G:i:s"), но это просто вставляет "0000-00-00 00:00:00" каждый раз.

  • 3
    так как вы не предоставляете параметр на дату, вы действительно хотите записать текущее время?
Теги:

10 ответов

445
Лучший ответ

Проблема в том, что вы используете 'M' и 'D', которые являются текстовыми представлениями, MySQL ожидает числовое представление формата 2010-02-06 19:30:13

Попробуйте: date("Y-m-d H:i:s"), который использует числовые эквиваленты.

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

  • 21
    это должен быть один из самых распространенных форматов даты и времени, который когда-либо понадобится. должен быть встроенным в php global или частью самой функции date (например, 'c', 'r')
  • 24
    Почему это не так, я не знаю. Я должен ссылаться на переполнение стека каждый. не замужем. функционирование. время.
Показать ещё 5 комментариев
97

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

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

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

  • 1
    +1 за самое обширное объяснение и ссылку на руководство :)
  • 1
    Спасибо @Pekka - я помню, когда у нас с тобой был примерно один и тот же представитель - ты был довольно активным.
Показать ещё 1 комментарий
35

Здесь альтернативное решение: если у вас есть дата в 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 |
+---------------------+
  • 0
    Это элегантное решение. Спасибо :)
  • 0
    Это лучший вариант, если вы можете работать с метками времени. Пусть супер-быстрая БД сделает все, что может, вместо того, чтобы ждать супер-медленного PHP!
Показать ещё 4 комментария
16

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

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

Это будет содержать текущую дату и время сервера.

7

Отметьте метку времени для столбца MySQL DATETIME:

strftime('%Y-%m-%d %H:%M:%S',$timestamp);
6
$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
    Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, почему и / или как он отвечает на вопрос, значительно улучшит его долгосрочную ценность. Пожалуйста, отредактируйте свой ответ, чтобы добавить пояснения и исправить проблемы с форматированием.
6

Формат MySQL datetime с PHP

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

Нет необходимости использовать метод date() из PHP, если вы не используете временную метку. Если dateposted - столбец datetime, вы можете вставить текущую дату следующим образом:

$db->query("INSERT INTO table (dateposted) VALUES (now())");
  • 2
    Спасибо за то, что поделились этим подходом. Это самый простой метод, который я видел до сих пор.
2

Я использую эту функцию (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;
}
  • 0
    Я проголосовал за ваш ответ, потому что он сработал после того, как я отредактировал первую строку; function getDateForDatabase(string $date) : string { to function getDateForDatabase($date) { Почему объявления типов function getDateForDatabase($date) { ошибку, я не знаю достаточно PHP, чтобы сказать.
  • 0
    «Аргумент 1, переданный в getDateForDatabase (), должен быть экземпляром строки, заданной строки» - мой ввод был строкой,
Показать ещё 1 комментарий
-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));
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню