【问题标题】:PHP strtotime fails for 1 digit minute or secondPHP strtotime 失败 1 位数分钟或秒
【发布时间】:2013-02-08 03:04:53
【问题描述】:

php strtotime() 失败,为分钟或秒的一位数。

例如-

echo date('m/d/Y H:i:s', strtotime('02/23/2013 8:50:1 PM'));  // 01/01/1970 01:00:00
echo date('m/d/Y H:i:s', strtotime('02/23/2013 8:5 PM'));     // 01/01/1970 01:00:00

对此有快速解决方案吗?

我知道,我们可以拆分它并检查分钟或秒字符串长度,并添加一个 0 前缀。

顺便说一句,奇怪的是,如果最后部分是一位数,则失败

例如-

echo date('m/d/Y H:i:s', strtotime('02/23/2013 8:5:10 PM'));  // 02/23/2013 20:05:10
// worked well, despite of one digit minute

【问题讨论】:

  • 我总是建议DateTime::createFromFormat() 而不是strtotime()。但是在这种情况下,即使那样也无济于事,因为它还坚持在分钟和秒内使用前导零。没有它们似乎有点奇怪。无论如何,您从哪里得到那些损坏的日期/时间字符串?您不能只强制执行更高质量的输入数据吗?

标签: php datetime unix-timestamp strtotime


【解决方案1】:

PHP Date Man Page 声明日期格式命令的说明符 is 必须包含前导零。

没有办法解决这个问题,它们必须包含零。

【讨论】:

  • 是的,但有趣的是,他们没有像 hour,day ... 那样没有前导零的分钟和秒的内置参数吗?
  • 可能会误解数字是否应该有前导或附加的零。而对于小时/日/月等,众所周知,单个数字应该以零开头。单个数字分钟可以解释为在任一位置值列中。
  • 好吧,当人们写 8:5 h 时,通常意味着 8:05 前导零,在 90% 或更多的情况下,如果他们想写 8:50,那是一个错字
  • 我认为绝大多数时间是 8:50 的拼写错误,我从未见过 8:5h 甚至 08:5h 的书写。我认为当这种格式似乎违反书写日期的“标准”时,添加这种格式的可能性是没有意义的。
  • 如果有的话,我认为您更有可能看到十进制表示法(显然是 8.83~ am)。如果确实有必要,您可以随时自己解析字符串。
【解决方案2】:
$time = '02/23/2013 8:5 PM';
$time = preg_replace('/ ([0-9]*:[0-9]) /', " \${1}0 ", $time );
echo date('m/d/Y H:i:s', strtotime($time));

【讨论】:

    【解决方案3】:
    preg_replace_callback('/ ([0-9]*):([0-9]*):([0-9]*)/', function($p){                                        
     return " ".str_pad($p[1], 2, 0, STR_PAD_LEFT).":".str_pad($p[2],2 , 0, STR_PAD_LEFT).":".str_pad($p[3],2, 0, STR_PAD_LEFT);
    },  $some_bad_date_string);
    

    这会将“11/04/2021 6:5:0”转换为“11/04/2021 06:05:00”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-03
      • 2020-06-30
      • 1970-01-01
      • 2020-03-31
      • 2015-12-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多