PHP时间格式混乱

时间:2013-03-31 09:49:08

标签: php wordpress time formatting

这实际上是来自this question的后续问题,但它提出了一个完全不同的问题。我也知道它很混乱所以请耐心等待。

我的日期类似于:1/04/2013,其目的是Jan 04 2013

在前面提到的问题中,我不得不随机地将时间和分钟添加到时间格式中,并且它适用于它应该做的事情:

$clr_datenew = date('Y-m-d ' . sprintf('%02d:%02d:00', mt_rand(0, 23), mt_rand(0, 59)), strtotime($date));

这产生了类似:2013-05-01 08:57:00

的内容

问题是,现在系统将该日期视为MAY 1st而不是JAN 05 ..

当我自动插入这些帖子(wp)时 - 所有会有2012-05-28日期的帖子都将作为1970-01-01插入到数据库中(我认为这是默认的“错误日期”) php格式。第28个月当然是错误的。)

我试图改变

的日期
$clr_datenew = date('Y-m-d ' . sprintf('%02d:%02d:00', mt_rand(0, 23), mt_rand(0, 59)), strtotime($date));

$clr_datenew = date('Y-d-m ' . sprintf('%02d:%02d:00', mt_rand(0, 23), mt_rand(0, 59)), strtotime($date));

但它使用不同的日期组合产生相同的错误。

一位同事给我一个提示:

  

strtotime将x / y / z解释为mm / dd / yy [yy],将x-y-z解释为dd-mm-yyyy或   yy-mm-dd,取决于z是4位还是2位。

我也尝试过:

date('Y-m-d ' . sprintf('%02d:%02d:00', mt_rand(0, 23), mt_rand(0, 59)), strtotime(str_replace('/','-',$clr_date)));

我真的在这里失去理智: - )

我认为这是因为我使用了strtotime(),其中函数实际上“猜测”如何基于松散的“人类”格式来格式化我的时间。

是否有一个函数可以将日期从一个日期转换为另一个日期,同时指定原始日期格式和所需的转换格式?

类似dummy_function($origformat,$wantedformat)的内容,我可以指定dummy_function('Y-d-m','Y-m-d')

编辑我 在阅读了@harke的评论之后,我发现了一些内容,并将其与@ Maks3w的答案相结合,似乎对我有用的格式是:

$clr_datenew = date('Y-m-d ' . sprintf('%02d:%02d:00', mt_rand(0, 23), mt_rand(0, 59)), strtotime(str_replace('/','-',$clr_date)));

我无法验证Php 5.3+方法,因为它们对我来说不那么重要,因为该特定公司的(内部)服务器运行较低版本..

应该在DB设计人员/程序员的每个广告牌上发布一些额外的东西:http://xkcd.com/1179/

那是 - 直到另行通知: - )

3 个答案:

答案 0 :(得分:1)

date()的第一个参数是打印文字的格式掩码,你必须使用反斜杠\

来转义每个字符。
$clr_datenew = date('Y-m-d ' . preg_replace('/(.)/', '\\\$1', sprintf('\%d\%d\:\%d\%d\:00', mt_rand(0, 23), mt_rand(0, 59))), strtotime($date));

答案 1 :(得分:1)

  1. 决定一个内部时间表示并坚持下去。最好在许多系统中选择一个标准m/d/y 这样的标准(尽管许多美国人喜欢思考; P)。实际上,通用标准是Y-m-d H:i:s(表示为date()函数的格式字符串)。大多数数据库都期望这种格式,所有与时间相关的函数都可以解析该格式而不会产生歧义。

  2. 上面是一个有用的文本表示日期可以在不同系统之间互换,但是内部更有意义的是表示日期更多灵活类型:UNIX timestampDateTime object。选择一个或另一个,并以该格式在代码内部保留所有日期。两者都允许轻松操作时间值。只有在需要向用户显示日期或者需要将其作为字符串发送到另一个系统(即插入数据库)时,才将其更改回字符串。不要在m/d/y字符串之间来回转换为UNIX时间戳到d/m/y字符串。

  3. 要解析以已知格式的日期为Unix时间戳或DateTime对象对其进行格式化成别的东西后,使用DateTime::createFromFormat最近的PHP版本(5.3+)或较旧的strptime然后进行一些手动重组。

答案 2 :(得分:1)

$date=date_format(date_create($clr_datenew), 'Y-m-d H:i:s');