【问题标题】:Date_format return false when seconds are leading without zero当秒数领先且不为零时,Date_format 返回 false
【发布时间】:2016-02-16 21:48:29
【问题描述】:

我在 json 消息中有一个字符串,如下所示:“2016-2-16 13:48:3

请注意,秒数不是以零开头的,在将日期插入数据库之前,我需要验证它的格式是否正确,

所以我创建了一个函数来使用 date_format 函数来验证日期,如下所示:

function validateDate($date, $format = 'Y-m-d H:i:s')
{
    $d = DateTime::createFromFormat($format, $date);       
    if ($d) {
        return $date;        
    } else {
        return null;
    } 
}

我的问题是,当秒数不以 0 开头时,它返回 null,因为格式没有不以 0 开头的秒数,所以秒数应该像“03”而不是“3”,

有什么想法吗?

【问题讨论】:

  • 第一件事:为什么有没有前导零的秒?
  • 主要问题是:“2016-2-16 13:48:3”是有效的日期时间吗?我怀疑没有。顺便说一句,要验证该日期,您必须在验证之前操作$date。你可以试试preg_replace( '/:(\d)$/', ':0\1', $date )
  • 这将是我的问题。 php 的日期格式手册页只有 's' 表示带有前导零的秒数。您对正在使用的 json 有任何控制权吗?如果没有,您将不得不自己处理日期。
  • 请满足我的好奇心:在原始 json 中也有 sec > 9 的日期,对吧?
  • @fusion3k:是的,大于9的秒就没有问题,所以我的问题就是小于10的秒

标签: php date format


【解决方案1】:

如果您无法修复 JSON,我会使用 preg_replace 手动替换单个数字的秒和分钟 - 应该很容易,因为您只需在每个前面填充 0

以下是如何替换秒数:

 $pattern = '/:(.)$/';
 $fixed_seconds = preg_replace($pattern, ':0${1}', "2016-2-16 13:48:3");
 echo $fixed_seconds; 

您可以在几分钟内使用此模式:

 $pattern = '/:(.):/';
 $fixed_minutes = preg_replace($pattern, ':0${1}:', "2016-2-16 13:4:03");

然后,如果这两个得到将您的格式字符串更改为:

$format = 'Y-n-j G:i:s'

【讨论】:

    【解决方案2】:

    这可能有点复杂,但确实可以:

    $date = "2016-2-16 13:48:3";
    
    $dateArray = explode(":", $date);
    
    $newDate = array();
    
    foreach ($dateArray as $splitDate) {
        if (strlen($splitDate) == 1)
            $newDate[] = "0".$splitDate;
        else
            $newDate[] = $splitDate;
    }
    
    $date = implode(":", $newDate);
    

    【讨论】:

      【解决方案3】:

      很奇怪的日期格式! 我认为唯一的方法是预处理$date。 “味道”是您的函数支持多种格式验证。

      我建议你这样:

      function validateDate( $date, $format = 'Y-m-d H:i:s' )
      {
          $date = preg_replace( '/:0+(\d{2})/', ':\1', str_replace( ':',':0',$date ) );
      
          $d = DateTime::createFromFormat($format, $date);     
          if ($d) {
              return $date;        
          } else {
              return null;
          } 
      }
      

      eval.in demo

      (编辑:更改正则表达式以匹配分钟)

      【讨论】:

        【解决方案4】:

        日期格式仅适用于使用带有初始零的秒数(选项 s),所以我想您需要执行以下操作:

        function validateDate($date, $format = 'Y-m-d H:i:s')
        {
            $crackedDate = explode(':', $date);
            $newDate = '';
            foreach($crackedDate as $datePart) {
                if (strlen($datePart)==1) {
                    $newDate .= '0'.$datePart;
                    continue;
                }
            }
            $d = DateTime::createFromFormat($format, $newDate);       
            if ($d) {
                return $date;        
            } else {
                return null;
            } 
        }
        

        php 日期中秒或分钟的非初始零格式的格式未知,因此解决方案最终是这样的自定义函数,因此这是一种无法用于所有 dateTime 格式的解决方法,只是问题之一和其他一些,请记住日期格式有很多选项

        【讨论】:

        • 我猜你的意思是strlen而不是len,据我所知,后者在PHP中不存在......
        • @webeno...你完全正确,对不起,我是通过手机制作的,未经测试
        猜你喜欢
        • 2023-03-17
        • 2013-11-13
        • 1970-01-01
        • 2016-03-11
        • 1970-01-01
        • 2015-09-21
        • 2011-05-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多