2015-11-04 4 views
0

Я работаю над извлечением даты с filenames. Для этого я использовал регулярное выражение.Php Datetime Неизвестный формат - Только дата

Даты могут быть как 2015-10-31, 20151031, , 31102015.

Вот код, я использую для извлечения даты:

$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 Я раздевая дефис, поэтому я в конечном итоге с одним из двух форматов, 20151031, 31102015.

Использование strtotime() преобразуется в 1970. Использование РНР DateTime я получил следующее сообщение об ошибке:

Uncaught exception 'Exception' with message 'DateTime::__construct(): Failed to parse time string (01102015) at position 7 (5): Unexpected character'

Мне нужно, чтобы избежать createfromformat от того, что я понимаю, но у меня есть только дата и не DATETIME это erroring.

Может ли кто-нибудь указать мне в правильном направлении, как я могу отформатировать эти даты для использования позже в коде.

+0

Ничего я понимаю, некоторые из них, случается, есть дефис, а некоторые нет. – Ashley

+0

У вас всегда был этот формат даты –

+0

'strtotime()' даст вам дату 1970 года, когда она не понимает формат даты. Он не понимает '01012015', поэтому, когда вы удаляете дефисы, он не будет распаковываться' 01-01-2015'. Он действительно понимает '20150101', однако – RiggsFolly

ответ

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

+0

Нужно еще немного. Протестируйте его своими действительными входами и ошибками – RiggsFolly

+0

Возможно, это может быть ригги @RiggsFolly –

+0

Я обновил свой ответ @RiggsFolly –

0

Не раздеться дефис. Итак, следующий код будет работать нормально.

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

Demo