1

这实际上是this question的后续问题,但它提出了一个完全不同的问题。我也知道这很令人困惑,所以请多多包涵。

我有一个日期,如下所示1/04/2013Jan 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],并将 xyz 解释为 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/

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

4

3 回答 3

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));
于 2013-03-31T10:01:29.043 回答
1
  1. 决定一种内部时间表示并坚持下去。最好选择一个跨多个系统的标准。m/d/y不是这样的标准(尽管许多美国人喜欢这样想;P)。实际上,通用标准是Y-m-d H:i:s(表示为date()函数的格式字符串)。大多数数据库都期望这种格式,所有与时间相关的函数都可以毫无歧义地解析这种格式。

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

  3. 要将已知格式的日期解析为 UNIX 时间戳或DateTime对象以稍后将其格式化为其他格式,DateTime::createFromFormat请在最近的 PHP 版本(5.3+)或更早版本上使用,strptime然后进行一些手动重组。

于 2013-03-31T10:05:48.340 回答
1
$date=date_format(date_create($clr_datenew), 'Y-m-d H:i:s');
于 2013-03-31T10:28:36.183 回答