使用PHP从MySQL日期时间转换为另一种格式


447

datetime在MySQL中有专栏。

如何使用PHP 将其转换为mm / dd / yy H:M(AM / PM)显示


4
我们需要知道的是日期如何在SQL中存储。是时间戳还是日期时间还是unixtime?
奥拉维尔Waage

它们不是像一般日期一样以unix时间存储的,PHP是将其作为秒和东西处理的一种。我建议您使用PHP OOPdatetime函数,它们非常易于使用。
Gucho Ca

2
我可以推荐并替代您的日期格式吗?mm/dd/yy他是非常美国人,居住在世界其他地区的我们这些人对试图猜测的含义有些恼怒11-12-13。更为通用的标准是yyyy-mm-dd,并且是ISO 8601标准的一部分。否则,您应该使用月份名称,而不是数字。
曼戈

Answers:


516

如果您正在寻找一种将日期标准化为MySQL格式的方法,请使用以下命令

$phpdate = strtotime( $mysqldate );
$mysqldate = date( 'Y-m-d H:i:s', $phpdate );

该行$phpdate = strtotime( $mysqldate )接受一个字符串并执行一系列试探法,以将该字符串转换为unix时间戳。

该行$mysqldate = date( 'Y-m-d H:i:s', $phpdate )使用该时间戳和PHP date函数将其转换回MySQL的标准日期格式。

编者注:之所以在这里给出此答案,是因为最初的问题带有令人困惑的措辞,而且即使该答案没有直接回答现在存在的问题,该答案也具有一般的Google实用性)


19
这个答案使这个话题感到困惑
Alex K

5
@ 0xBAADF00D:请再次阅读问题...没有人问过MySQL标准格式。
user7116 2013年

3
当然,但是,当存在标准时,遵循标准可能会很好(避免以后在另一个开发人员对您的代码进行操作时头痛)xD
0xBAADF00D 2013年

4
问题要求以mm / dd / yy H:M(AM / PM)格式输出,而不是“ Ymd H:i:s”。
Rikki 2014年

6
does not work为了谁?如果您想按照OP的要求 MySQL转换为mm / dd / yy H:M(AM / PM),则可接受的答案将起作用。仅仅因为您想做相反的事情就不会使接受的答案错误。
toxalot

311

要将从MySQL检索的日期转换为请求的格式(mm/dd/yy H:M (AM/PM)):

// $datetime is something like: 2014-01-31 13:05:59
$time = strtotime($datetimeFromMysql);
$myFormatForView = date("m/d/y g:i A", $time);
// $myFormatForView is something like: 01/31/14 1:05 PM

请参考PHP日期格式选项以调整格式。


这个$row物体应该从哪里来?
Mike

25
我可能是错的,但是我想你们当中有些人没有抓住重点。他希望输出为“ m / d / yg:i A”格式,并从DATETIME字段中提取原始日期。因此他的代码有效。@Mike $ row-> createdate只是Tim的datetime列。
Mere Development

4
@AsTeR答案只有在您误解了问题的情况下才会令人困惑。OP回答了自己的问题,并希望 MySQL 提取日期并输出为请求的格式:mm / dd / yy H:M(AM / PM)
toxalot

@TimBoland我认为,如果强调from以及所要求的格式mm / dd / yy H:M(AM / PM)则可以改善答案。它可以受益于日期函数的链接。我试图建议进行修改,但遭到拒绝。
toxalot

1
有趣的事实:这个答案大致等于下面的答案(实际上没有降票),但是它有> 40个降票,因为它回答了OP的问题,这与访问此页面的人的实际问题有所不同。
克莱门特

110

如果您使用的是PHP 5,也可以尝试

$oDate = new DateTime($row->createdate);
$sDate = $oDate->format("Y-m-d H:i:s");

如上文评论所述,标准格式为("Y-m-d H:i:s")
Yannickv

45
$valid_date = date( 'm/d/y g:i A', strtotime($date));

参考: http : //php.net/manual/en/function.date.php


我认为人们之所以投票,是因为他们对OP问题感到困惑。大多数人认为这个问题与实际问题相反。另一种可能性是,这与5年前发布的公认答案非常相似。
toxalot

1
您引用的链接没有指向您正在使用的功能,也没有说明格式。我认为php.net/function.date.php会更好。
toxalot

@toxalot接受的答案是错误的。它在我的回答和关于我的链接的内容之后进行了修改,我替换了您的链接。谢谢
Tony Stark

1
整个问答环节有着悠久的历史。在2013年4月29日至2013年5月24日之间,接受的答案错误的。当您首次发布答案时,它是正确的。您的答案 2013年5月29日之前错误的,之后变得与接受的答案非常相似。
toxalot

23

对于PHP 5.3和更高版本,最后是正确的解决方案:( 在示例中添加了可选的时区,如注释中所述)

$date = \DateTime::createFromFormat('Y-m-d H:i:s', $mysql_source_date, new \DateTimeZone('UTC'));
$date->setTimezone(new \DateTimeZone('Europe/Berlin')); // optional
echo $date->format('m/d/y h:i a');

其错误..找不到类'App \ Controller \ DateTime'..使用php 6.4
aswzen

1
如果您在另一个名称空间中工作,则必须在其前面加上反斜杠来调用它:\DateTime::createFromFormat('Y-m-d H:i:s', $mysql_source_date);
Hasenpriester

2
创建日期对象时,请不要忘记指定时区!否则,您的格式化日期可能要过几个小时。您的datetime列应为UTF8,因此请new DateTimeZone('UTC')作为第3个参数传递以确保PHP知道。
埃里克·海斯特兰德'19

这是输出OP所需格式的正确答案,只需要注意时区即可
会计م

12

一种更简单的方法是直接在MySQL查询中而不是PHP格式化日期。参见MySQL手册中的DATE_FORMAT

如果您希望使用PHP进行操作,则需要使用date函数,但是必须首先将数据库值转换为时间戳。


11
-1,因为在DB中格式化日期不是一个好主意。多语言Web需要不同的日期格式,然后您必须使用PHP(通用的业务逻辑语言)格式化日期。当您写date函数时,您也应该写strottime函数来帮助别人,而不是“但是您必须先将数据库值转换成时间戳”。
鲍里斯·舒斯卡

10

忘记所有。只需使用:

$date = date("Y-m-d H:i:s",strtotime(str_replace('/','-',$date)))

9

DateTime在PHP中正确格式化对象以存储在MySQL中,请使用MySQL使用的标准格式,即ISO 8601

从5.1.1版开始,PHP就将此格式存储为常量,因此我强烈建议使用它,而不是每次都手动键入字符串。

$dtNow = new DateTime();
$mysqlDateTime = $dtNow->format(DateTime::ISO8601);

可在http://php.net/manual/en/class.datetime.php#datetime.constants.types上找到该列表以及其他PHP DateTime常量列表。


MySQL实际上并没有使用这种格式,并且如果包含由它生成的“ + xxxx”时区指示符,则MySQL会生成警告。更新X SET Y ='2014-03-31T15:00:00 + 0100'其中Z; 查询正常,影响0行,1警告(0.06秒)匹配行:1已更改:0警告:1
George Lund 2014年

OP希望 MySQL格式获取日期并转换 mm / dd / yy H:M(AM / PM)
toxalot

8

这应该格式化SQL查询中的字段:

SELECT DATE_FORMAT( `fieldname` , '%d-%m-%Y' ) FROM tablename

您应该指定MySQL查询,而不仅仅是SQL,因为它不一定适用于所有数据库。OP要求使用PHP解决方案时,这是OP可能不知道的一个很好的选择。但是,这不会提供所需的格式。要获取请求的OP格式,您需要'%m/%d/%y %h:%i %p'
toxalot


5

取决于您的MySQL日期时间配置。通常:2011-12-31 07:55:13格式。这个非常简单的功能应该具有神奇的作用:

function datetime()
{
    return date( 'Y-m-d H:i:s', time());
}

echo datetime(); // display example: 2011-12-31 07:55:13

还是要提前解决这个问题。

function datetime($date_string = false)
{
    if (!$date_string)
    {
        $date_string = time();
    }
    return date("Y-m-d H:i:s", strtotime($date_string));
}

1
这不能回答OP问题。OP希望 MySQL格式获取日期并转换 mm / dd / yy H:M(AM / PM)。另外,这只会格式化当前时间,而不是特定日期。
toxalot

5
SELECT 
 DATE_FORMAT(demo.dateFrom, '%e.%M.%Y') as dateFrom,
 DATE_FORMAT(demo.dateUntil, '%e.%M.%Y') as dateUntil
FROM demo

如果您不想更改PHP代码中的每个函数,要显示预期的日期格式,请在源-数据库中进行更改。

如上例所示,使用as运算符命名行很重要(如dateFrom,dateUntil)。您在其中输入的名称就是名称,结果中的行将被调用。

该示例的输出将是

[月份中的一天,数字(0..31)]。[月份名称(1月。12月)]。[年份,数字,四位数]

示例:2015年8月5日

用选择的分隔符更改点,然后检查DATE_FORMAT(date,format)函数是否有更多日期格式。


3

您还可以让查询以Unix时间戳返回时间。这将消除调用的需要strtotime()并使PHP方面的工作量减少一些...

select  UNIX_TIMESTAMP(timsstamp) as unixtime from the_table where id = 1234;

然后在PHP中,只需使用date()函数即可格式化它。

<?php
  echo date('l jS \of F Y h:i:s A', $row->unixtime);
?>

要么

<?php
  echo date('F j, Y, g:i a', $row->unixtime);
?>

我喜欢这种方法,而不是使用MySQLDATE_FORMAT函数,因为它允许您重用相同的查询来获取数据,并允许您更改PHP的格式。

有两个不同的查询只是为了更改日期在UI中的显示方式而令人讨厌。


我喜欢UNIX_TIMESTAMP用来消除对的需要的想法strtotime。如果给出一个以实际要求的OP格式格式化时间的示例,则此答案会更好。
toxalot

1

您可能会遇到Unix Timestamp中未返回日期的问题,因此这对我有用...

return date("F j, Y g:i a", strtotime(substr($datestring, 0, 15)))

1
这不会将日期转换为OP要求的格式。
toxalot


0

使用PHP版本4.4.9和MySQL 5.0,这对我有用:

$oDate = strtotime($row['PubDate']);
$sDate = date("m/d/y",$oDate);
echo $sDate

PubDateMySQL中的列。


这不会将日期转换为OP要求的格式
toxalot

0

我建议的方法如下所示。首先,您使用mysql格式的字符串创建一个基本的datetime对象。然后以您喜欢的方式对其进行格式化。幸运的是,mysql datetime符合ISO8601,因此代码本身看起来非常简单而优雅。请记住,尽管该datetime列没有时区信息,所以您需要对其进行适当的转换

这是代码:

(new ISO8601Formatted(
    new FromISO8601('2038-01-19 11:14:07'),
    'm/d/Y h:iA'
))
    ->value();

它输出01/19/2038 11:14AM-希望您期望什么。

本示例使用蛋白酥皮库。如果您愿意,可以查看更多内容


-1
$date = "'".date('Y-m-d H:i:s', strtotime(str_replace('-', '/', $_POST['date'])))."'";

1
这不能回答OP问题。OP希望 MySQL格式获取日期并转换 mm / dd / yy H:M(AM / PM)。相反。另外,它从表单而不是数据库获取输入。
toxalot
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.