[英]Why this datetime to timestamp convertion in PHP doesn't work?
我想将这种日期时间格式转换为“ 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显示日期时间。
有人可以帮我吗? 谢谢。
这与PHP无关。 您只是在MySQL中使用了错误的日期文字格式。 每个文档 :
MySQL可以使用以下格式识别
DATETIME
和TIMESTAMP
值:
作为
'YYYY-MM-DD HH:MM:SS'
或'YY-MM-DD HH:MM:SS'
格式的字符串。 这里也允许使用“宽松”语法:任何标点符号都可以用作日期部分或时间部分之间的分隔符。如果字符串不带分隔符,则格式为
'YYYYMMDDHHMMSS'
或'YYMMDDHHMMSS'
,但前提是该字符串应作为日期使用。如果数字是日期,
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>
请注意, 时间戳只是一个通用英语单词:
特定事件发生时间的数字记录。
它不一定是Unix时间的同义词。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.