Почему это преобразование даты и времени в PHP не работает? - PullRequest
0 голосов
/ 01 января 2019

Я хочу конвертировать этот формат даты и времени "31-12-2018 19:30 hs."из Аргентины с меткой времени UTC, я использую следующий код:

$clean_date = substr($date, 0, -4);
$dt = new DateTime($clean_date, new DateTimeZone('America/Argentina/Buenos_Aires'));
$dt->setTimeZone(new DateTimeZone('UTC'));
$timestamp = $dt->getTimestamp();

Но это не работает, в базе данных запись «0000-00-00 00:00:00», ноесли я выведу $ dt, пока он не заработает отлично и покажет время в UTC.

Может кто-нибудь помочь мне?Спасибо.

1 Ответ

0 голосов
/ 01 января 2019

Это не имеет ничего общего с PHP.Вы просто используете неправильный формат литерала даты в MySQL.А для документов :

MySQL распознает значения DATETIME и TIMESTAMP в следующих форматах:

  • в виде строки вили 'YYYY-MM-DD HH:MM:SS' или 'YY-MM-DD HH:MM:SS' формат.Здесь также разрешен «смягченный» синтаксис: любой символ пунктуации может использоваться в качестве разделителя между частями даты или временем.

  • В виде строки без разделителей в 'YYYYMMDDHHMMSS'или 'YYMMDDHHMMSS' формат, при условии, что строка имеет смысл как дата.

  • как число в формате YYYYMMDDHHMMSS или YYMMDDHHMMSS, при условии, что число имеет смысл какdate.

1546335960 может быть последним случаем, но числа не имеют смысла в качестве даты, потому что год 1546 не имел 33 месяцев.

ToХуже того, многие MySQL-серверы по умолчанию настроены так, что допускаются ошибки такого типа:

mysql> CREATE TABLE test (
    ->     foo TIMESTAMP
    -> );
Query OK, 0 rows affected (0.74 sec)

mysql> SET @@SESSION.sql_mode = '';
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO test (foo) VALUES (1546335960);
Query OK, 1 row affected, 1 warning (0.39 sec)

mysql> SHOW WARNINGS;
+---------+------+------------------------------------------+
| Level   | Code | Message                                  |
+---------+------+------------------------------------------+
| Warning | 1265 | Data truncated for column 'foo' at row 1 |
+---------+------+------------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT * FROM test;
+---------------------+
| foo                 |
+---------------------+
| 0000-00-00 00:00:00 |
+---------------------+
1 row in set (0.00 sec)

Как видите, вы получили простое предупреждение (которое необходимо прочитать явно) и повреждение данных,

Если вы сконфигурируете свое приложение для использования строгого режима, вы получите правильное сообщение об ошибке как раз вовремя:

mysql> SET @@SESSION.sql_mode = 'TRADITIONAL,NO_AUTO_VALUE_ON_ZERO';
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO test (foo) VALUES (1546335960);
ERROR 1292 (22007): Incorrect datetime value: '1546335960' for column 'foo' at row 1
mysql>

Обратите внимание, что timestamp это простородовое английское слово:

Цифровая запись времени возникновения определенного события.

Не обязательно является синонимом Unix time .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...