【问题标题】:How to convert MySQL TIMESTAMP to date time in PHP如何在 PHP 中将 MySQL TIMESTAMP 转换为日期时间
【发布时间】:2017-05-13 00:49:32
【问题描述】:

我有一个 MySQL 数据库表,其中有一列名为 "timestamp",类型为 timestamp,属性为 on update CURRENT_TIMESTAMP,默认值为 CURRENT_TIMESTAMP

如果我向表中添加一条记录,指定其他值,但不指定时间戳,则时间戳会自动添加,如 2016-12-28 17:02:26

在 PHP 中,我使用以下查询查询表

SELECT * FROM history WHERE user_id = 9 ORDER BY timestamp ASC

查询的结果被保存到$rows 中,我使用foreach 创建一个数组,其中一些其他值已格式化。我正在尝试将时间戳格式化为英国类型的 24 小时日期时间:dd/mm/yy, HH:MM:SS

date()strftime() 函数我都试过了,如下:

$formatted_datetime = strftime("%d %m %y  %H %M %S", $row["timestamp"]); 
$formatted_datetime = date("d/m/y, H:i:s", $row["timestamp"]);

这两种情况都会导致以下通知和日期时间输出错误,如01 01 70 00 33 36

注意:在第 20 行的 /home/ubuntu/workspace/pset7/public/history.php 中遇到格式不正确的数值

我是 PHP 和 MySQL 的新手,到目前为止,我看到的其他问题或文档都没有成功解决执行此转换的问题。我不明白为什么 strftime() 不起作用,也不知道如何正确执行此操作?

【问题讨论】:

  • 旁注:由于其限制,我不会使用TIMESTAMP“TIMESTAMP 数据类型用于同时包含日期和时间部分的值。TIMESTAMP 的范围为 '1970 -01-01 00:00:01' UTC 到 '2038-01-19 03:14:07' UTC。" dev.mysql.com/doc/refman/5.5/en/datetime.html 使用 DATETIME " DATETIME 类型用于包含日期和时间部分的值。MySQL 以 'YYYY-MM-DD HH:MM:SS' 格式检索和显示 DATETIME 值。支持的范围是 '1000-01-01 00:00:00 ' 到 '9999-12-31 23:59:59'。"
  • @Tiger 那里选择的解决方案似乎......很多。我会从我表上时间戳列的不同类型中受益吗?
  • 2038 是一个 UNIX 错误 stackoverflow.com/q/2012589/1415724 - 编辑:您删除了我回复的评论。
  • @Fred-ii- 对不起,我注意到你的“旁注:”一开始就意识到我的评论是不必要的。不过谢谢!

标签: php mysql datetime timestamp formatdatetime


【解决方案1】:

为此,OO(也是最灵活的)方式使用DateTime 类并使用静态createFromFormat 方法来实例化一个新的DateTime 对象:

$new_datetime = DateTime::createFromFormat ( "Y-m-d H:i:s", $row["timestamp"] );

现在您可以使用$new_datetime 对象通过调用对象的format 方法来生成您想要的任何字符串表示:

echo $new_datetime->format('d/m/y, H:i:s');

启动时,您既然拥有DateTime 对象,您现在还可以进行任何方式的转换(如移动时区或添加天数)、比较(大于或小于另一个DateTime)和各种时间计算(这个和另一个DateTime之间有多少天/月/等等......)。

日期时间:http://php.net/manual/en/class.datetime.php 学习它。爱它。活下去。

【讨论】:

    【解决方案2】:

    通常在 MySQL 日期时间戳中将时间保存为 YYYY-MM-DD HH:MM:SS (2016-12-20 18:36:14) 格式,您可以使用日期格式轻松地将它们转换为您的愿望,但必须先将您的输入转换为时间。以下将做的伎俩

    $formatted_datetime = date("d/m/y, H:i:s", strtotime($row["timestamp"]));
    

    【讨论】:

    • 不知道为什么这被否决了,虽然它可能不是 OO 方式,但 strtotime 可以很好地用于 MySQL 时间戳。
    【解决方案3】:

    为什么不让 MySQL 完成这项工作?你真的想要 mm/dd/yy,而不是 dd/mm/yy?

    SELECT *, DATE_FORMAT(timestamp, '%m/%d/%y, %T') formatted_date FROM ....
    

    然后您可以将格式化的日期提取为 $row['formatted_date']。

    https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_date-format

    【讨论】:

    • 哎呀,你是对的,我确实想要 dd/mm/yy,谢谢。我会编辑 fothwith!
    • 我看到提到的 DATE_FORMAT() 但仅与 SELECT DATE_FORMAT... 相关,不知道如何调整它,我会试一试
    • 这行得通,我喜欢它的简洁性,但我认为 Ray 的 DateTime 对象方法更灵活一些。
    • 这将产生所需的输出,但将应用程序逻辑移动到 MySQL,这通常是一个糟糕的架构选择。不这样做的原因是代码可移植性——更改数据库(比如 oracle 或 postges)可能会更改可用的功能,那么您的 SQL 将无效。
    • 使用 DateTime 对象肯定会让您获得更强大的对象,并且它可能更便携(例如,SQL 服务器似乎没有 DATE_FORMAT 函数,尽管 PostgreSQL 有)。它只是更慢。在这种情况下,您可能并不关心。干杯。
    【解决方案4】:

    日期为timestamp 类型,格式如下:“YYYY-MM-DD HH:MM:SS”或“2008-10-05 21:34:02”。

    $res = mysql_query("SELECT date FROM times;");
    while ( $row = mysql_fetch_array($res) ) {
       echo $row['date'] . "
    ";
    }
    

    PHP strtotime 函数将 MySQL 时间戳解析为 Unix 时间戳,可用于在 PHP 日期函数中进一步解析或格式化。

    以下是一些可能实用的其他示例日期输出格式:

    echo date("F j, Y g:i a", strtotime($row["date"]));                  // October 5, 2008 9:34 pm
    echo date("m.d.y", strtotime($row["date"]));                         // 10.05.08
    echo date("j, n, Y", strtotime($row["date"]));                       // 5, 10, 2008
    echo date("Ymd", strtotime($row["date"]));                           // 20081005
    echo date('\i\t \i\s \t\h\e jS \d\a\y.', strtotime($row["date"]));   // It is the 5th day.
    echo date("D M j G:i:s T Y", strtotime($row["date"]));               // Sun Oct 5 21:34:02 PST 2008
    

    【讨论】:

      【解决方案5】:

      我会使用Carbon class 及其字符串格式

      $carbon = Carbon::instance('2016-12-28 17:02:26');
      

      然后你可以按照你想要的方式格式化它。

      【讨论】:

      • 需要注意的是,Carbon 是 PHP DateTime API 的第三方扩展。
      • @Devon 确实但非常有用。 Laravel自带的太好了
      • 是的,我几乎每天都在使用它。不知道为什么这被否决了,对于那些希望使用该库的人来说,Carbon 是一个很好的解决方案。 +1 恢复平衡。
      • @Devon 是的,我也是,为我省去了很多痛苦。谢谢我的余额;)
      猜你喜欢
      • 2021-12-23
      • 1970-01-01
      • 2011-11-11
      • 2014-04-12
      • 2011-02-20
      • 2011-06-20
      • 2011-07-18
      • 2020-11-21
      • 2022-12-05
      相关资源
      最近更新 更多