2008-09-26 4 views
13

Есть ли способ, чтобы проверить, если дата/время действительна вы думаете, это было бы легко проверить:проверка PHP для действительной даты, странные преобразования даты

что на самом деле получает меня это:

echo date('Y-m-d', strtotime($date)); 

приводит: "1999-11-30",

да? я пошел с 0000-00-00 до 1999-11-30 ???

Я знаю, что могу сделать сравнение, чтобы увидеть, является ли дата одним из этих значений, равна дате, которую я имею, но это не очень надежный способ проверки. Есть ли хороший способ проверить, есть ли у меня действительная дата? У кого-нибудь есть хорошая функция, чтобы проверить это?

Edit: Люди спрашивают, что я бегу: Запуск PHP 5.2.5 (кли) (постройки: 23 Jul 2008 11:32:27) на Linux LOCALHOST 2.6.18-53.1.14.el5 # 1 SMP Wed Mar 5 11:36:49 EST 2008 i686 i686 i386 GNU/Linux

+0

какая версия PHP это? – Swati 2008-09-26 19:09:31

+0

Попробуйте следующее: http://php.net/manual/en/function.checkdate.php – 2012-02-19 19:24:53

+0

strtotime ("0000-00-00 00:00:00") возвращает FALSE в 32-битной системе. \t strtotime ("0000-00-00 00:00:00") возвращает -62169955200 на 64-разрядной системе. – 2012-11-21 09:58:04

ответ

22

от php.net

<?php 
function isValidDateTime($dateTime) 
{ 
    if (preg_match("/^(\d{4})-(\d{2})-(\d{2}) ([01][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$/", $dateTime, $matches)) { 
     if (checkdate($matches[2], $matches[3], $matches[1])) { 
      return true; 
     } 
    } 

    return false; 
} 
?> 
2

echo date ('Ym-d', strtotime ($ date));

результаты в: «1999-11-30»

Результатом является strtotime 943920000 - это количество секунд, грубо говоря, между Unix epoch (основание, от которого измеряется время) до 1999- 11-30.

Существует документально mysql bug на mktime(), localtime(), strtotime() все возвращать нечетное значение, когда вы пытаетесь времени до эпохи (в том числе «0000-00-00 00:00:00»). Там какая-то дискуссия по теме, связанной, как ли это на самом деле ошибка:

Поскольку штамп времени начинается с 1970 года, я не думаю, что он должен работу в любом случае.

Ниже приводится функция, которую я использую для преобразования DateTimes например, выше метку времени для сравнения, и т.д., которые могут быть некоторые используют для вас, для даты за «0000-00-00 00:00: 00"

/** 
* Converts strings of the format "YYYY-MM-DD HH:MM:SS" into php dates 
*/ 
function convert_date_string($date_string) 
{ 
    list($date, $time) = explode(" ", $date_string); 
    list($hours, $minutes, $seconds) = explode(":", $time); 
    list($year, $month, $day) = explode("-", $date); 
    return mktime($hours, $minutes, $seconds, $month, $day, $year); 
} 
+0

Я пробовал дату ('Ym-d', convert_date_string ('0000-00-00 00:00:00')), но по-прежнему дает дату 1999 года – SeanDowney 2008-09-26 19:19:37

+0

Обнаружен отчет об ошибке PHP о нечетном поведении временных функций в PHP для значения 0000-00 ... В этой ветке есть дискуссия о том, действительно ли это ошибка, как будто люди когда-либо захотят рассчитать дату до 1970 года! – ConroyP 2008-09-26 19:24:35

1

не ожидайте когерентные результаты, когда вы находитесь вне диапазона:

сравни strtotime

Gnu Calendar-date-items сравни .html

«Для числовых месяцев ISO 8601 формат 'год-месяц-день' допускается, где год любое положительное число, месяц является номер между 01 и 12 и день - номер между 01 и 31. ведущий ноль должен присутствовать, если число меньше десяти. "

Так '0000-00-00' дает странные результаты, это логично!


" Кроме того, не все платформы поддерживают отрицательные метки времени, поэтому ваш диапазон дат может быть ограничен не ранее, чем Unix эпохи. Это означает, что, например, % е,% T,% R и% D (там может быть более ) и даты до Jan 1, 1970 не будет работать на Windows,, некоторые дистрибутивы Linux, а также несколько других операционных систем «.

ср strftime


Используйте checkdate функции вместо (более надежной):

месяц: месяц между 1 и 12 включительно.

день: День в течение допустимого количества дней для данного месяца. Високосный год принимается во внимание .

год: год составляет от 1 до 32767 включительно.

1

Если вы хотите обработать преобразование даты без времени для поля даты mysql, вы можете изменить этот отличный код так же, как я. В моей версии PHP без выполнения этой функции я получаю «0000-00-00» каждый раз. Раздражает.

function ConvertDateString ($DateString) 
{ 
    list($year, $month, $day) = explode("-", $DateString); 
    return date ("Y-m-d, mktime (0, 0, 0, $month, $day, $year)); 
} 
1

Эта версия позволяет поле пустым, имеет даты мм/дд/гг или мм/дд/гггг, позволяют для отдельных цифровых часов, добавляет дополнительный AM/PM, и исправляет некоторые тонкие недостатки в матче времени.

Все еще допускает некоторые патологические времена, такие как «23: 14 AM».

function isValidDateTime($dateTime) { 
    if (trim($dateTime) == '') { 
     return true; 
    } 
    if (preg_match('/^(\d{1,2})\/(\d{1,2})\/(\d{2,4})(\s+(([01]?[0-9])|(2[0-3]))(:[0-5][0-9]){0,2}(\s+(am|pm))?)?$/i', $dateTime, $matches)) { 
     list($all,$mm,$dd,$year) = $matches; 
     if ($year <= 99) { 
      $year += 2000; 
     } 
     return checkdate($mm, $dd, $year); 
    } 
    return false; 
} 
-1
<?php 

function is_date($str) { 
    $stamp = strtotime($str); 

    if (!is_numeric($stamp)) { 
     return FALSE; 
    } 
    $month = date('m', $stamp); 
    $day = date('d', $stamp); 
    $year = date('Y', $stamp); 

    if (checkdate($month, $day, $year)) { 
     return TRUE; 
    } 
    return FALSE; 
} 
?> 
0

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

Просто измените формат, отредактировав ниже строку сценария strftime ("10-10-2012", strtotime ($ dt));

<?php 
echo is_date("13/04/10"); 

function is_date($str) { 
    $flag = strpos($str, '/'); 

    if(intval($flag)<=0){ 
     $stamp = strtotime($str); 
    } else { 
     list($d, $m, $y) = explode('/', $str);  
     $stamp = strtotime("$d-$m-$y"); 
    } 
    //var_dump($stamp) ; 

    if (!is_numeric($stamp)) { 
     //echo "ho" ; 
     return "not a date" ;   
    } 

    $month = date('n', $stamp); // use n to get date in correct format 
    $day = date('d', $stamp); 
    $year = date('Y', $stamp); 

    if (checkdate($month, $day, $year)) { 
     $dt = "$year-$month-$day" ; 
     return strftime("%d-%b-%Y", strtotime($dt)); 
     //return TRUE; 
    } else { 
     return "not a date" ; 
    } 
} 
?> 
0
<?php 
function is_valid_date($user_date=false, $valid_date = "1900-01-01") { 
    $user_date = date("Y-m-d H:i:s",strtotime($user_date)); 
    return strtotime($user_date) >= strtotime($valid_date) ? true : false; 
} 

echo is_valid_date("00-00-00") ? 1 : 0; // return 0 

echo is_valid_date("3/5/2011") ? 1 : 0; // return 1 
5

Как уже упоминалось здесь: https://bugs.php.net/bug.php?id=45647

Там нет ошибка здесь, 00-00-00 означает, 2000-00-00, который является 1999-12-00, , который 1999-11-30. Нет ошибок, совершенно нормально.

И, как показано с помощью нескольких тестов, скатывание назад ожидаемое поведение, если немного тревожно:

>> date('Y-m-d', strtotime('2012-03-00')) 
string: '2012-02-29' 
>> date('Y-m-d', strtotime('2012-02-00')) 
string: '2012-01-31' 
>> date('Y-m-d', strtotime('2012-01-00')) 
string: '2011-12-31' 
>> date('Y-m-d', strtotime('2012-00-00')) 
string: '2011-11-30' 
0

Я использовал следующий код для проверки даты, поступающие от приложений ExtJS.

function check_sql_date_format($date) { 
    $date = substr($date, 0, 10); 
    list($year, $month, $day) = explode('-', $date); 
    if (!is_numeric($year) || !is_numeric($month) || !is_numeric($day)) { 
     return false; 
    } 
    return checkdate($month, $day, $year); 
} 
Смежные вопросы