为什么php中的datetime到timestamp转换不起作用?

nfzehxib  于 2021-06-17  发布在  Mysql
关注(0)|答案(1)|浏览(269)

我想将datetime“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”,但如果我回显$dt,直到有完美的工作和显示utc的日期时间。
有人能帮我吗?谢谢。

8zzbczxx

8zzbczxx1#

这与php无关。只是在mysql中使用了不正确的日期文本格式。a根据文件:
mysql识别 DATETIME 以及 TIMESTAMP 以下格式的值:
作为字符串 'YYYY-MM-DD HH:MM:SS' 或者 'YY-MM-DD HH:MM:SS' 格式。这里也允许使用“宽松”语法:任何标点符号都可以用作日期部分或时间部分之间的分隔符。
作为一个字符串,其中没有分隔符 'YYYYMMDDHHMMSS' 或者 'YYMMDDHHMMSS' 格式,前提是字符串作为日期有意义。
作为一个数字 YYYYMMDDHHMMSS 或者 YYMMDDHHMMSS 格式,前提是数字作为日期有意义。 1546335960 这可能是最后一种情况,但由于1546年没有33个月的时间,所以数字没有意义。
更糟糕的是,许多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时间的同义词。

相关问题