strtotime () преобразует несуществующую дату в другую дату - PullRequest
2 голосов
/ 28 сентября 2011

Я строю временную метку из значений даты, месяца и года, введенных пользователями.

Предположим, что пользователь вводит некоторые неправильные значения и дата «31-02-2012», которая не существует, тогда я должен получить ложный возврат. Но здесь его преобразование в другую дату поблизости. Точно: "02-03-2012" ..

Я не хочу, чтобы это произошло ..

$str = "31-02-2012";
echo date("d-m-Y",strtotime($str)); // Outputs 02-03-2012

Кто-нибудь может помочь? Я не хочу, чтобы возвращалась временная метка, если дата не является оригинальной.

Ответы [ 6 ]

4 голосов
/ 28 сентября 2011

Вы можете посмотреть на checkdate.

2 голосов
/ 28 сентября 2011

Это потому, что strtotime() имеет проблемы с -, поскольку они используются для обозначения фразы типа -1 week и т. Д. *

Попробуйте

$str = '31-02-2012';
echo date('d-m-Y', strtotime(str_replace('-', '/', $str)));

Однако 31-02-2012 не является допустимым английским форматом, он должен быть 02-31-2012.


Если у вас PHP> = 5,3 , вы можете использовать createFromFormat:

$str = '31-02-2012';
$d = DateTime::createFromFormat('d-m-Y', $str);
echo $d->format('d-m-Y');
1 голос
/ 28 сентября 2011

Объедините date_parse и checkdate, чтобы проверить, действительно ли это время.

<?php
date_default_timezone_set('America/Chicago');

function is_valid_date($str) {
    $date = date_parse($str);
    return checkdate($date['month'], $date['day'], $date['year']);
}

print is_valid_date('31-02-2012') ? 'Yes' : 'No';
print "\n";
print is_valid_date('28-02-2012') ? 'Yes' : 'No';
print "\n";

Несмотря на то, что этот формат даты приемлем в соответствии с PHP форматами даты , он все равно может вызвать проблемы для анализаторов даты, потому что месяц и день легко перепутать. Например, 02-03-2012, трудно сказать, является ли 02 месяцем или днем. Здесь лучше использовать другие более конкретные примеры анализатора даты, чтобы сначала проанализировать дату, а затем проверить ее с помощью checkdate.

1 голос
/ 28 сентября 2011

Используйте функцию checkdate.

$str = "31-02-2012";
$years = explode("-", $str);
$valid_date = checkdate($years[1], $years[0], $years[2]);

Функция проверки - Руководство по PHP & Функция разнесения - Руководство по PHP

1 голос
/ 28 сентября 2011

Вы можете обойти это поведение

<?php
$str = "31-02-2012";
$unix = strtotime($str); 
echo date('d-m-Y', $unix);
if (date('d-m-Y', $unix) != $str){
   echo "wrong";
}
else{
   echo date("d-m-Y", $unx);
}

или просто использовать checkdate()

1 голос
/ 28 сентября 2011

Перед использованием strtotime вам нужно проверить, возможна ли дата.Strtotime преобразует его в дату Unix, то есть будет использовать секунды, так как ... Это означает, что это всегда будет дата.

...