如何在PHP中将MySQL的TIMESTAMP转换为日期时间

8

我有一个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

注意:在/home/ubuntu/workspace/pset7/public/history.php的第20行遇到了一个非格式良好的数值。

我刚接触PHP和MySQL,并且迄今为止,我看到的其他问题或文档都没有成功地解决执行此转换的问题。我不明白为什么strftime()不起作用,也不知道如何正确执行此操作?


1
附注:由于其限制,我不会使用TIMESTAMP:“TIMESTAMP数据类型用于包含日期和时间部分的值。 TIMESTAMP的范围为“1970-01-01 00:00:01”UTC到“2038-01-19 03:14:07”UTC。”https://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”。 - Funk Forty Niner
2
2038是一个UNIX的bug https://dev59.com/8nI-5IYBdhLWcg3wHUZB - 编辑:你删除了我在回复的评论。 - Funk Forty Niner
@Fred-ii- 抱歉,我注意到你在开头的“旁注:”部分,意识到我的评论是不必要的。还是谢谢! - Toby
不客气。是的,我承认我编辑了几次我的第一条评论。但现在你知道了那个UNIX的Bug;选择权在你手中是否继续使用它。只是想让你知道这件事,这样你以后就不会有什么不愉快的意外了。 - Funk Forty Niner
@Fred-ii- 除了更改为DATETIME之外,我还添加了一个触发器来设置默认值(我的MySQL实例可能不是最新的,因为它不允许将CURRENT_TIMESTAMP作为DATETIME默认值):CREATE TRIGGER <triggername> BEFORE INSERT ON <tablename> FOR EACH ROW SET NEW.<datetimefield> = NOW() - Toby
显示剩余2条评论
5个回答

10

要以面向对象(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对象之间间隔多少天/月等)。

DateTime:http://php.net/manual/zh/class.datetime.php 学习它,热爱它,享受它。


5

通常在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"]));

1
不确定为什么这个被踩了,虽然它可能不是面向对象的方式,但strtotime对于MySQL时间戳来说完全可以正常工作。 - Devon

3

糟糕,你是正确的,我确实想要dd/mm/yy日期格式,谢谢。我会立即编辑! - Toby
我曾经看到过提到DATE_FORMAT(),但只是在SELECT DATE_FORMAT...的相关内容中,并不确定如何适应它,我会尝试一下。 - Toby
这个代码可行且我喜欢它的整洁性,但我认为Ray的DateTime对象方法更加灵活。 - Toby
1
这个方案可以生成所需的输出,但将应用程序逻辑移到MySQL中通常是一个不好的架构选择。 不要这样做的原因包括代码可移植性 - 更改数据库(例如Oracle或PostgreSQL)可能会更改可用的函数,您的SQL语句将无效。 - Ray
使用DateTime对象可以获得更强大的对象,而且可能更具可移植性(例如,SQL Server似乎没有DATE_FORMAT函数,尽管PostgreSQL有)。只是速度较慢。在某些情况下,您可能并不关心这一点。干杯。 - Giles B

2
日期是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

0
我会使用Carbon类及其字符串格式化。
$carbon = Carbon::instance('2016-12-28 17:02:26');

然后您可以按照您的意愿进行格式化。


2
需要注意的是,Carbon是PHP DateTime API的第三方扩展。 - Devon
@Devon 确实非常有用。它非常好,因为它与Laravel一起使用。 - Samuel
是的,我几乎每天都在使用它。不确定为什么会被投票否决,Carbon 是一个很好的解决方案,适用于那些希望使用该库的人。+1 来恢复平衡。 - Devon
@Devon 是的,我也是,这让我免去了很多痛苦。感谢我的平衡;) - Samuel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接