2015-09-11 3 views
2

Запуск PHP 5.3.28DateTime :: createFromFormat не работает, как ожидалось

У меня есть конкретная дата получения возвращается в виде строки, StrToTime задыхается на, так что я думал попробовать DateTime :: createFromFormat(), однако несмотря на все попытки получить ошибки.

<?php 

$freshdate = '09/07/2015 (Mon)'; 
$date = DateTime::createFromFormat("m/d/Y (D)", $freshdate); 
if (!$date) { 
    var_dump('error', DateTime::getLastErrors()); 
} 

Результат:

array (size=4) 
    'warning_count' => int 0 
    'warnings' => array (size=0) 
    'error_count' => int 2 
    'errors' => array (size=2) 
     12 => string 'A textual day could not be found' (length=32) 
     16 => string 'Data missing' (length=12) 
+0

[Я не могу воспроизвести это] (https://eval.in/431992) –

+1

@JohnConde Ошибка может быть воспроизведена только с помощью PHP 5.3.0 - 5.4.19, 5.5.0 - 5.5.3 https: // 3v4l.org/tf473 – Rizier123

+0

Это воспроизводимо в PHP 5.3 - попробуйте http://phptester.net/ – samlev

ответ

4

Это ошибка в PHP#65554:

createFromFormat не работает, когда в формате D или l следуют разделители, что не являются пробелами или запятыми.

Как исправить? Измените свой формат или обновите версию PHP.

+2

Учитывая, что PHP 5.4 является EOL всего за два дня, рекомендуется обновить рекомендацию –

0

Это должно работать, преобразовать его в Отметка времени Unix:

$freshdate = explode('/', '09/07/2015 (Mon)'); 
$year = explode(' ', $freshdate[2]); 
$unix_date = mktime(0,0,0,$freshdate[0],$freshdate[1],$year[0]); 

Может быть не самый лучший ответ, но его определенно ответ :)

2

Использование этого-

<?php 

$freshdate = '09/07/2015 (Mon)'; 
$date = DateTime::createFromFormat("m/d/Y (D)", $freshdate); 
echo $date->format('m/d/Y (D)'); 
+0

Вам следует добавить несколько пояснений к вашему ответу. –

3

Из журнала изменений для 5.4.20: - Исправлена ​​bug #65554 (createFromFormat сломана, когда название дня недели следуют некоторые разделители)

Таким образом, проблема заключается в задней ) после названия дня

Вы можете workround его обрезкой трейлинг ):

$freshdate = '09/07/2015 (Mon)'; 
$date = DateTime::createFromFormat("m/d/Y (D", rtrim($freshdate, ')')); 
if (!$date) { 
    var_dump('error', DateTime::getLastErrors()); 
} 
Смежные вопросы