当秒数超前时,Date_format返回false

时间:2016-02-16 21:48:30

标签: php date format

我有一个像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",

有什么想法吗?

4 个答案:

答案 0 :(得分:3)

如果你无法修复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'

然后,如果这两个人将你的格式字符串改为:

func Foo(s *someStruct) {
    fmt.Printf("s is %v\n", s)
    if s!=nil {
        fmt.Printf("s is not nil")
        ...
    }
}

答案 1 :(得分:1)

这可能有点复杂,但可以完成工作:

$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);

答案 2 :(得分:1)

日期格式化只准备使用带有初始零(选项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格式的解决方法,只是问题一和其他一些人,请记住日期格式有很多选项

答案 3 :(得分:1)

非常奇怪的日期格式! 我认为唯一的方法是预处理$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

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