【问题标题】:createFromFormat giving me wrong resultscreateFromFormat 给我错误的结果
【发布时间】:2017-11-08 18:44:20
【问题描述】:

我想用时区偏移将日期形式从 d/m/Y 转换为 Y-m-d。我可以使用以下代码从 d/m/Y 转换为 Y-m-d:

$date = DateTime::createFromFormat('d/m/Y', $date);
$date = $date->format('Y-m-d');

这在某种程度上有效,但是当我遇到这样的日期时:

echo DateTime::createFromFormat('d/m/Y h:m:s', '19/07/2017 00:00:00');
results is 2016-12-19 00:00:00.000000
echo DateTime::createFromFormat('d/m/Y h:m:s', '20/07/2017 22:51:17');
results is false

已编辑 现在使用建议的格式

DateTime::createFromFormat('d/m/Y H:i:s', '19/07/2017 00:00:00');

预期结果:

06/06/2017 00:00:00 => 2017-06-06 00:00:00.000000
06/06/2017 12:31:34 => 2017-06-06 12:31:34.000000
08/06/2017 21:59:21 => 2017-08-06 21:59:21.000000
19/07/2017 00:00:00 => 2018-07-07 00:00:00.000000 wrong!
20/07/2017 22:51:17 => 2018-08-07 22:51:17.000000 wrong!
21/07/2017 23:39:23 => 2018-09-07 23:39:23.000000 wrong!
27/07/2017 02:46:14 => 2019-03-07 02:46:14.000000 wrong!

【问题讨论】:

  • 应该是d/m/Y H:i:s 使用H 为24hour 格式。
  • 干杯现在到了某个地方,但它仍然给出错误的结果,例如 30/07/2017 00:00:00 变成 2016-12-07 00:00:00.000000
  • @Photonic:您在几分钟内使用m 而不是i。 Sahil 编辑了他的评论,也许你没看到。

标签: php date date-format


【解决方案1】:

请改用H 和i。此外,您不能回显对象,请改用print_r。

Try with an example

H 24 小时制。

i 表示带前导零的分钟

将其更改为:

echo DateTime::createFromFormat('d/m/Y h:m:s', '19/07/2017 00:00:00');

这个:

print_r(DateTime::createFromFormat('d/m/Y H:i:s', '19/07/2017 00:00:00'));

获取特定格式

$dateObject=DateTime::createFromFormat('d/m/Y H:i:s', '19/07/2017 00:00:00');
echo $dateObject->format("Y-m-d H:i:s");

【讨论】:

  • 适用于一些但 23/08/2017 18:08:02 => 2018-11-08 18:08:02.000000 | 24/08/2017 22:42:56 => 2018-12-08 22:42:56.000000 等等
  • @Photonic 你能分享你预期的格式吗?你想要的。
  • d/m/Y H:i:s 到 Y-m-d H:i:s 是我的预期结果。无论如何,有些结果是遥不可及的,比如年、月和日。
  • @Photonic 你可以试试这个eval.in/895295 。它工作正常。
  • 是的,现在可以工作了,非常感谢@Sahil Gulati
【解决方案2】:

请试试这个

$date = DateTime::createFromFormat('d/m/Y H:i:s', '20/07/2017 22:51:17');
echo date_format($date, 'Y-m-d H:i:s');

【讨论】:

    【解决方案3】:

    解释为什么这会给你这些结果:

    您的日期格式字符串包含两次m,其中第二次是读取时间的“分钟”部分。这将覆盖上一个正确的月份值。由于您的第一个字符串 (19/07/2017 00:00:00) 的分钟数为零,因此您的 DateTime 对象被初始化为“第 0”个月 - 在 PHP 中,这会导致日期回滚到上一年的一个月,所以您重新看到 2016 年 12 月。

    您的第二个字符串 (20/07/2017 22:51:17) 失败,因为您使用 h 解析 24 小时时间 - 解析任何大于 12 的数字时都会失败。

    正如其他答案中所解释的,用于这些日期的正确格式字符串是 d/m/Y H:i:s。

    【讨论】:

      猜你喜欢
      • 2011-01-07
      • 2018-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-21
      • 2014-09-16
      • 1970-01-01
      • 2013-03-09
      相关资源
      最近更新 更多