我在MySQL中有一个datetime列。
如何使用PHP将其转换为m m/dd/yy h:m(am/pm)显示?
- 我们需要知道的是日期是如何存储在SQL中的。它是时间戳、日期时间还是unixtime?
- 它们不是存储在Unix时间中的,就像普通的日期一样,PHP是处理它的秒数和内容的日期。我建议您使用php OOPdatetime函数,它们非常容易使用。
- 我可以推荐和替代你的日期格式吗?mm/dd/yy是非常美国化的,而我们生活在世界其他地方的人,在试图猜测11-12-13的意思时,会变得非常烦躁。更通用的标准是yyyy-mm-dd,是ISO 8601标准的一部分。如果失败,您应该使用月份名称,而不是数字。
如果您正在寻找将日期规范化为MySQL格式的方法,请使用以下内容
1 2
| $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的标准日期格式。
(编者按:这个答案之所以出现在这里,是因为一个原始问题的措词混乱,而且谷歌提供了这个答案的一般效用,即使它没有直接回答现在存在的问题)
- 谢谢,这将是我最后一次在阅读评论之前复制粘贴。
- 这个答案混淆了话题
- 'y-m-d h:i:s'是正确的标准日期时间格式(阅读MySQL手册,所有示例都使用此格式)
- @0xbaadf00d:请重新阅读这个问题…没有人问过MySQL标准格式。
- 当然,但是,当标准存在时,遵循标准可能会更好(当其他开发人员处理您的代码时它避免了以后的头疼)xd
- 你能告诉我"M/D/Y G:I:S"的预赛是什么吗?
- 问题要求以m m/d d/y y h:m(am/pm)格式输出,而不是"y-m-d h:i:s"。
- 江户十一〔七〕为谁?如果您希望根据OP的要求将mysql转换为m m/dd/yy h:m(am/pm),接受的答案将有效。仅仅因为你想做相反的事情,就不会使公认的答案错了。
- 使用此选项可将英文用户输入日期转换为正确的MySQL。
- 解决了我的问题
要将从MySQL中检索到的日期转换为请求的格式(mm/dd/yy H:M (AM/PM):
1 2 3 4
| // $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日期格式选项以调整格式。
- 可能有用,但它不是标准的MySQL格式。
- MySQL的标准格式是:date("Y-m-d H:i:s", $datetime)。
- 这个$row物体应该来自哪里?
- 我可能是错的,但我认为你们中的一些人没有抓住要点。他希望输出为"m/d/y g:i a"格式,从日期时间字段中提取原始日期。所以他的密码有效。@mike$row->createdate只是tim的datetime列。
- 投反对票,因为答案令人困惑。
- @只有你误读了问题,aster的答案才令人困惑。OP回答了自己的问题,希望从MySQL获取一个日期并输出到请求的格式:m m/dd/yy h:m(am/pm)。
- @Timboland我认为如果强调From以及要求的格式m m/dd/yy h:m(am/pm),答案可能会有所改进。它还可以从日期函数的链接中获益。我试图建议编辑,但被拒绝了。
- @托克洛特,当然,在跳到复制粘贴答案代码之前,我们都读了三遍整个问题;)
- 有趣的事实:这个答案大致相当于下面的那个(实际上没有投反对票),但是因为它回答了OP的问题,所以它得到了40多个反对票,这与进入这个页面的人实际拥有的不同。
- 使用此选项可以将日期时间从MySQL输出为英文格式的网页。
如果您使用的是php 5,也可以尝试
1 2
| $oDate = new DateTime($row->createdate);
$sDate = $oDate->format("Y-m-d H:i:s"); |
。
- +1如果您有php 5>=5.2.0,这是一种方法。
- 如上注释所述,标准格式为("Y-m-d H:i:s")。
- 为我工作。改变。
号
参考:http://php.net/manual/en/function.date.php
- 我认为人们投反对票是因为他们对行动问题感到困惑。大多数人把这个问题读成与实际情况相反。另一种可能性是,这与5年前发布的公认答案非常相似。
- 您引用的链接没有指向您正在使用的函数,也没有解释格式。我认为php.net/function.date.php更好。
- @托克洛特公认的答案是错误的。在我回答我的链接后,我将替换您的链接。谢谢
- 整个问答都有一段肮脏的历史。接受的答案在2013年4月29日至2013年5月24日之间是错误的。你第一次发表答案时是正确的。到2013年5月29日为止,您的回答是错误的,此后,它变得非常类似于接受的答案。
最后,针对php 5.3及更高版本的正确解决方案是:
1 2
| $date = \DateTime::createFromFormat('Y-m-d H:i:s', $mysql_source_date);
echo $date->format('m/d/y h:i a'); |
号
- 它的错误……找不到类"appcontrollerdatetime"。使用php 6.4
- 如果在另一个名称空间中工作,则必须使用前面的反斜杠来调用它:\DateTime::createFromFormat('Y-m-d H:i:s', $mysql_source_date);。
- 创建日期对象时不要忘记指定时区!否则,格式化的日期可能会有几个小时的休息时间。您的datetime列应该是utf8,所以将new DateTimeZone('UTC')作为第三个参数传递,以确保php知道。
一种更简单的方法是直接在mysql查询中格式化日期,而不是用php。日期格式见mysql手册条目。
如果您愿意用PHP来实现,那么您需要日期函数,但是您必须首先将数据库值转换为时间戳。
- -1因为在数据库中格式化日期不是一个好主意。多语言Web需要不同的日期格式,然后您必须用PHP(通用的业务逻辑语言)格式化日期。当你写关于date函数的时候,那么你应该写关于strottime函数的文章来帮助别人,而不是"但是你必须先把你的数据库值转换成时间戳"。
- 预先格式化日期不是一个好的、可扩展的想法
忘记所有。仅使用:
。
要正确格式化php中用于存储在mysql中的DateTime对象,请使用mysql使用的标准化格式,即iso 8601。
从5.1.1版开始,PHP就将这种格式存储为常量,我强烈建议您使用它,而不是每次手动键入字符串。
1 2
| $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
- OP希望从MySQL格式中获取一个日期,并将其转换为m m/dd/yy h:m(am/pm)。
这将格式化SQL查询中的字段:
1
| SELECT DATE_FORMAT( `fieldname` , '%d-%m-%Y' ) FROM tablename |
- 您应该指定mysql查询,而不仅仅是SQL,因为这不一定适用于所有数据库。虽然OP要求提供PHP解决方案,但这是一个很好的替代方案,OP可能不知道。但是,这将不提供请求的格式。要获得请求的格式op,您需要'%m/%d/%y %h:%i %p'。
使用日期功能:
1 2 3
| <?php
echo date("m/d/y g:i (A)", $DB_Date_Field);
?> |
- 以下是我最擅长的工作:
- 函数的日期()是否需要整数时间戳而不是问题中指定的日期时间?
- @Timboland不再是"低于"而是"高于"!!恭喜;)
1 2 3 4
| SELECT
DATE_FORMAT(demo .dateFrom , '%e.%M.%Y') as dateFrom ,
DATE_FORMAT(demo .dateUntil , '%e.%M.%Y') as dateUntil
FROM demo |
号
如果您不想更改PHP代码中的每个函数,为了显示预期的日期格式,请在源代码(您的数据库)中更改它。
使用as操作符命名行很重要,如上面的示例(作为datefrom,作为datefuntil)。你写的名字有名字,结果中将调用这些行。
这个例子的输出将是
[月日,数字(0..31)][月名(1月..12月)][年,数字,四位数]
示例:2015年8月5日
用所选分隔符更改点,并检查日期格式(日期、格式)功能以了解更多日期格式。
取决于您的mysql日期时间配置。通常:2011-12-31 07:55:13格式。这个非常简单的函数应该具有魔力:
1 2 3 4 5 6
| function datetime ()
{
return date( 'Y-m-d H:i:s', time());
}
echo datetime (); // display example: 2011-12-31 07:55:13 |
号
或者更进一步来匹配这个问题。
1 2 3 4 5 6 7 8
| function datetime ($date_string = false)
{
if (!$date_string)
{
$date_string = time();
}
return date("Y-m-d H:i:s", strtotime($date_string));
} |
号
- 这不回答OP问题。OP希望从MySQL格式中获取一个日期,并将其转换为m m/dd/yy h:m(am/pm)。另外,这将只是格式化当前时间,而不是特定日期。
您还可以让查询以unix时间戳的形式返回时间。这样就不再需要调用strtotime(),而使PHP方面的工作强度降低了一些……
1
| select UNIX_TIMESTAMP(timsstamp) as unixtime from the_table where id = 1234; |
然后在PHP中,只需使用date()函数以您希望的方式格式化它。
1 2 3
| <?php
echo date('l jS \of F Y h:i:s A', $row->unixtime);
?> |
。
或
1 2 3
| <?php
echo date('F j, Y, g:i a', $row->unixtime);
?> |
我喜欢这种方法,而不是使用MySQL的DATE_FORMAT函数,因为它允许您重用同一个查询来获取数据,并允许您在PHP中更改格式。
有两个不同的查询只是为了改变日期在用户界面中的显示方式,这很烦人。
- 我喜欢使用UNIX_TIMESTAMP来消除对strtotime的需求。如果它给出了一个以实际请求的格式格式化时间的示例,那么这个答案会更好。
在Unix时间戳中没有返回日期可能会有问题,所以这对我很有用…
这将起作用…
号
- 这种格式将24次与AM/PM混合。否则,它与5年前发布的公认答案相同。
使用php版本4.4.9&mysql 5.0,这对我很有用:
1 2 3
| $oDate = strtotime($row['PubDate']);
$sDate = date("m/d/y",$oDate);
echo $sDate |
。
PubDate是mysql中的列。
号
- 这不回答OP问题。OP希望从MySQL格式中获取一个日期,并将其转换为m m/dd/yy h:m(am/pm)。反之亦然。另外,它从表单而不是数据库中获取输入。