【问题标题】:Why this datetime to timestamp convertion in PHP doesn't work?为什么这个日期时间到 PHP 中的时间戳转换不起作用?
【发布时间】:2019-01-01 09:16:56
【问题描述】:

我想转换这种格式的日期时间“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 显示日期时间。

有人可以帮我吗? 谢谢。

【问题讨论】:

  • 我认为这对你有帮助。Click Here
  • 并且 $timestamp 如果你 echo 也是正确的?您在数据库中的字段使用时间戳还是日期时间?如果是日期时间,则需要将时间戳转换回日期时间: $value_for_database = date('Y-m-d H:i:s', $timestamp);
  • 将数据插入 MySQL 的代码可能被破坏。您也需要发布这些详细信息。
  • $timestamp 回显打印如下内容:“1546335960”,数据库中的字段类型是时间戳,我用来更新行的代码是这样的:$sql = "UPDATE $tblname SET nombre='$name', creado='$timestamp', msg='$msg' WHERE id=$rowid";,显然其他字段正在更新,没有问题。
  • 您想在阿根廷和 UTC 之间进行转换吗?如果是年,那么它总是相同的小时数 + DST

标签: php mysql datetime timestamp


【解决方案1】:

这与 PHP 无关。您只是在 MySQL 中使用了不正确的日期文字格式。每the docs

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

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

  • 作为'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 的同义词。

【讨论】:

  • @Andreas 是的,是的。但是在 MySQL 文档中没有任何地方说 Unix 时间戳是一种有效的格式。您实际上需要call a function 来预处理该值。
  • 难以置信,不仅有帮助@Álvaro González,我会努力解决这个问题,当我成功时,我会给你支票!非常感谢。
猜你喜欢
  • 1970-01-01
  • 2022-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-31
  • 2013-12-17
相关资源
最近更新 更多