为什么用PHP将此日期时间转换为时间戳不起作用?

时间:2019-01-01 09:16:56

标签: php mysql datetime timestamp

我想将此日期时间格式转换为“ 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显示日期时间。 / p>

有人可以帮我吗? 谢谢。

2 个答案:

答案 0 :(得分:2)

这与PHP无关。您只是在MySQL中使用了错误的日期文字格式。每个the docs的一个:

  

MySQL可以识别以下格式的DATETIMETIMESTAMP值:

     
      
  • 作为'YYYY-MM-DD HH:MM:SS''YY-MM-DD HH:MM:SS'格式的字符串。这里也允许使用“宽松”语法:任何   标点符号可以用作日期部分之间的分隔符   或时间部分。

  •   
  • 作为无分隔符的字符串,其格式为'YYYYMMDDHHMMSS''YYMMDDHHMMSS',只要该字符串在   日期。

  •   
  • YYYYMMDDHHMMSSYYMMDDHHMMSS格式的数字表示,只要该数字作为日期有意义即可。

  •   

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 time的同义词。

答案 1 :(得分:0)

您必须指定日期/时间as one of these formats

sudo service <my_service> [start, stop, restart]

已经说过,如果要在PHP代码中转换时区,则可以简单地使用$date = "31-12-2018 19:30 hs."; $clean_date = substr($date, 0, -4); // explicitly specify the format instead of making PHP guess $dt = DateTime::createFromFormat("d-m-Y H:i", $clean_date, new DateTimeZone("America/Argentina/Buenos_Aires")); $dt->setTimeZone(new DateTimeZone("UTC")); $date_str = $dt->format("Y-m-d H:i:s"); // 2018-12-31 22:30:00 数据类型。 See the documentation关于MySQL如何处理DATETIME值以及服务器时区更改时会发生什么。