Какой правильный формат для передачи date()
функции в PHP, если я хочу вставить результат в datetime
столбец типа MySQL ?
Я пытался, date("Y-M-D G:i:s")
но это просто вставляет "0000-00-00 00:00:00" каждый раз.
Какой правильный формат для передачи date()
функции в PHP, если я хочу вставить результат в datetime
столбец типа MySQL ?
Я пытался, date("Y-M-D G:i:s")
но это просто вставляет "0000-00-00 00:00:00" каждый раз.
Ответы:
Проблема в том, что вы используете 'M'
и 'D'
, которые являются текстовыми представлениями, MySQL ожидает числовое представление формата2010-02-06 19:30:13
Попробуйте: date("Y-m-d H:i:s")
который использует числовые эквиваленты.
edit: переключено G
на H
, хотя это может не иметь влияния, вы, вероятно, захотите использовать 24-часовой формат с ведущими нулями.
Из комментариев на date()
странице руководства php :
<?php $mysqltime = date ("Y-m-d H:i:s", $phptime); ?>
Вы правильно указали букву «Y» - это полный год, но «M» - это трехзначный месяц, а «m» - двузначный месяц. Та же проблема с «D» вместо «d». «G» - это час с 1 или 2 цифрами, где «H» всегда имеет ведущий 0, когда это необходимо.
Вот альтернативное решение: если у вас есть дата в 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 |
+---------------------+
Я использую следующий код PHP для создания переменной, которую я вставляю в столбец MySQL DATETIME.
$datetime = date_create()->format('Y-m-d H:i:s');
Это будет содержать текущую дату и время сервера.
$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`
Отформатируйте метку времени в столбце DATAETIME MySQL:
strftime('%Y-%m-%d %H:%M:%S',$timestamp);
Я использую эту функцию (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.
Нет необходимости использовать метод date () из PHP, если вы не используете метку времени. Если dateposted
это столбец даты и времени, вы можете вставить текущую дату следующим образом:
$db->query("INSERT INTO table (dateposted) VALUES (now())");
Это сводило меня с ума в поисках простого ответа. Наконец я сделал эту функцию, которая, кажется, перехватывает весь ввод и дает хорошую строку 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));
}
}
Использование 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");
}
Небольшое дополнение к принятому ответу: если база данных datetime
хранится как UTC (что я всегда делаю), вы должны использовать gmdate("Y-m-d H:i:s")
вместо date("Y-m-d H:i:s")
.
Или, если вы предпочитаете, чтобы MySQL обрабатывал все, как предлагают некоторые ответы, я бы вставил MySQL UTC_TIMESTAMP
с тем же результатом.
Примечание: я понял вопрос, относящийся к текущему времени.
Это более точный способ сделать это. Он ставит десятичные дроби за секундами, давая большую точность.
$now = date('Y-m-d\TH:i:s.uP', time());
Обратите внимание .uP
.
Дополнительная информация: https://stackoverflow.com/a/6153162/8662476