date_create_from_format принимает неверные даты в качестве входных данных - PullRequest
3 голосов
/ 29 апреля 2011

PHP date_create_from_format функция принимает несуществующие, хотя даты в формате действительны.

Я бы хотел, чтобы эта функция работала как команда date:

niloct@HP-Mini:~$ date --date="29/02/2011" +%s
date: invalid date `29/02/2011'

хотя это то, что происходит в php:

$tmp = date_create_from_format('d/m/Y H:i:s',"29/02/2011 00:00:00", timezone_open('America/Sao_Paulo'));
var_dump($tmp);
/*
output: object(DateTime)#28 (3) { ["date"]=> string(19) "2011-03-01 00:00:00" ["timezone_type"]=> int(3) ["timezone"]=> string(17) "America/Sao_Paulo" }
*/

Можно ли избежать этого автоматического преобразования, и в этом случае функция вернет -1?

niloct@HP-Mini:~$ php -v
PHP 5.3.3-1ubuntu9.3 with Suhosin-Patch (cli) (built: Jan 12 2011 16:08:14) 

Спасибо.

Ответы [ 3 ]

5 голосов
/ 29 апреля 2011

Вы можете использовать комбинацию date_parse_from_format и checkdate, чтобы проверить, является ли это действительной календарной датой.

Пример:

$date = date_parse_from_format('d/m/Y H:i:s',"29/02/2011 00:00:00");

if (checkdate($date['month'], $date['day'], $date['year'])) {
    echo "Valid date";
}
else {
    echo "Invalid date";
}
0 голосов
/ 24 октября 2013

Это будет работать:

 $format = 'd/m/Y H:i';
   $date = DateTime::createFromFormat($format, Input::get('start_date'));

  return $date->format('Y/m/d H:i'); 
0 голосов
/ 05 мая 2011

Я обнаружил, что вызов date_get_last_errors после date_create_from_format уже дает вам все виды проверок в проанализированной строке, в массивах warnings и errors и счетчиках warning_count и error_count.

Так что достаточно просто проверить счетчики на наличие нулевых предупреждений и ошибок.

Пересмотрен код с некоторыми тестами:

<?
$appTZ = 'America/Sao_Paulo';

function datetimeCreateErrorsWarnings() {
    $obj = date_get_last_errors();  
    return ($obj['error_count'] > 0) || ($obj['warning_count'] > 0);
}

function datetimeToUnixTS($data) {
    global $appTZ;

    $fmt = "d/m/Y H:i:s";

    $dtobj = date_create_from_format($fmt, $data . " 00:00:00", timezone_open($appTZ)); 

    if ($dtobj) {
        if (!datetimeCreateErrorsWarnings()) {
            return date_timestamp_get($dtobj);
        }
    }

    //Second try, $data is auto-suficient
    $dtobj = date_create_from_format($fmt, $data, timezone_open($appTZ));

    if ($dtobj) {
        if (!datetimeCreateErrorsWarnings()) {
            return date_timestamp_get($dtobj);
        }
    }

    return -1;
}

$test = array(
    'asdfasdf',
    '',
    "28/02/2011",
    "29/02/2011",
    "28/02/2011 00:00:90"
);

for ($i=0; $i<count($test); $i++) {
    $tmp = datetimeToUnixTS($test[$i]);
    var_dump($tmp);
    echo "<p>";
}
?>

Приведенный выше скрипт вычисляет метку времени Unix для созданной даты и времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...