Php日期时间未知格式 - 仅限日期

时间:2015-11-04 14:01:42

标签: php date datetime

我正致力于从filenames中提取日期。为此,我使用了正则表达式。

日期可能会显示为2015-10-312015103131-10-201531102015

以下是我用来提取日期的代码:

$re = '/(\d{8})|([0-9]{4}-[0-9]{2}-[0-9]{2})|([0-9]{2}-[0-9]{2}-[0-9]{4})/';
$str = "20151001-importsrc1.txt";
$str = "2015-10-01-importsrc1.txt";
$str = "01-10-2015-importsrc1.txt";
$str = "importsrc1-2015-10-01.txt";
$str = "importsrc1-01102015.txt";
$str = "importsrc1-01-10-2015.txt";
preg_match($re, $str, $matches);
$date = str_replace("-", "", $matches[0]);

使用str_replace我正在删除连字符,因此我最终选择了两种格式之一,2015103131102015

使用strtotime()它正在转换为1970。使用PHP DateTime我收到以下错误:

  

带有消息'DateTime :: __ construct()的未捕获异常'异常':无法解析位置7(5)处的时间字符串(01102015):意外字符'

我需要从我的理解中避免createfromformat,但因为我只有日期而不是日期时间,所以这是错误的。

任何人都可以指出我如何格式化这些日期以便稍后在代码中使用。

2 个答案:

答案 0 :(得分:0)

如果您只有这四种格式,那么您可以创建一个自定义函数,如

function check_format($string) {
    $string = preg_replace('/(-?importsrc1-?)|(.txt)/','',$string);
    if (preg_match('/(\d){4}-(\d){2}-(\d){2}/', $string)) {
        $date = DateTime::createFromFormat('Y-m-d', $string);
    } elseif (preg_match('/(\d){2}-(\d){2}-(\d){4}/', $string)) {
        $date = DateTime::createFromFormat('d-m-Y', $string);
    } elseif (preg_match('/..\K(\d{2})/', $string, $m)) {
        if ($m[0] > 12) {
            $date = DateTime::createFromFormat('Ymd', $string);
        } else {
            $date = DateTime::createFromFormat('dmY', $string);
        }
    }
        return $date->format('Y-m-d');
}

Demo

答案 1 :(得分:0)

不要剥掉连字符。所以,下一个代码可以正常工作。

$date1 = new \DateTime('31-10-2015');
$date2 = new \DateTime('2015-10-31');

Demo