valida - php check para una fecha válida, conversiones de fechas extrañas
validar que la fecha no sea mayor a la actual php (10)
¿Hay alguna forma de comprobar si una fecha / hora es válida? ¿Crees que sería fácil verificarlas?
$date = ''0000-00-00'';
$time = ''00:00:00'';
$dateTime = $date . '' '' . $time;
if(strtotime($dateTime)) {
// why is this valid?
}
lo que realmente me atrapa es esto:
echo date(''Y-m-d'', strtotime($date));
resultados en: "1999-11-30",
¿eh? fui de 0000-00-00 a 1999-11-30 ???
Sé que podría hacer una comparación para ver si la fecha es cualquiera de esos valores, es igual a la fecha que tengo, pero no es una forma muy robusta de verificar. ¿Hay una buena manera de verificar si tengo una fecha válida? ¿Alguien tiene una buena función para verificar esto?
Editar: La gente está preguntando qué estoy ejecutando: Ejecutando PHP 5.2.5 (cli) (construido: 23 de julio 2008 11:32:27) en Linux localhost 2.6.18-53.1.14.mx5 # 1 SMP Wed Mar 5 11 : 36: 49 EST 2008 i686 i686 i386 GNU / Linux
<?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
echo date (''Ym-d'', strtotime ($ date));
resultados en: "1999-11-30"
El resultado de strtotime
es 943920000: este es el número de segundos, aproximadamente, entre la época de Unix (base desde la cual se mide el tiempo) hasta 1999-11-30.
Existe un error documentado de mysql en mktime(), localtime(), strtotime()
devuelve este valor impar cuando intenta un tiempo anterior a la época (incluido "0000-00-00 00:00:00"). Existe un debate sobre el hilo vinculado en cuanto a si esto es realmente un error:
Dado que la marca de tiempo se inició a partir de 1970, no creo que se suponía que funcionara de todos modos.
A continuación se muestra una función que utilizo para convertir dateTimes como el anterior a una marca de tiempo para comparaciones, etc., que puede ser de alguna utilidad para usted, para fechas posteriores a "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);
}
No espere resultados coherentes cuando se encuentre fuera del alcance:
cf strtotime
cf Gnu Calendar-date-items .html
"Para los meses numéricos, se permite el formato ISO 8601 ''año-mes-día'', donde el año es cualquier número positivo, el mes es un número entre 01 y 12 , y el día es un número entre 01 y 31 . presente si un número es menor que diez ".
Entonces ''0000-00-00'' da resultados extraños, ¡eso es lógico!
"Además, no todas las plataformas admiten marcas de tiempo negativas, por lo tanto, su intervalo de fechas puede limitarse a no antes de la época de Unix . Esto significa que, por ejemplo,% e,% T,% R y% D (puede haber más) y fechas anteriores El 1 de enero de 1970 no funcionará en Windows, algunas distribuciones de Linux y algunos otros sistemas operativos ".
cf strftime
Use la función checkdate en su lugar (más robusta):
mes: el mes está entre 1 y 12 inclusive .
día: el día está dentro del número permitido de días para el mes determinado. Los años bisiestos se toman en consideración.
año: el año está entre 1 y 32767 inclusive .
Desde 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;
}
?>
Esta versión permite que el campo esté vacío, tiene fechas en formato mm / dd / aa o mm / dd / aaaa, permite horas de un solo dígito, agrega am / pm opcional y corrige algunos errores sutiles en el tiempo de coincidencia.
Todavía permite algunos tiempos patológicos como ''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;
}
Como se menciona aquí: https://bugs.php.net/bug.php?id=45647
No hay ningún error aquí, 00-00-00 significa 2000-00-00, que es 1999-12-00, que es 1999-11-30. Sin errores, perfectamente normal.
Y como se muestra con algunas pruebas, retroceder es el comportamiento esperado, aunque un poco inquietante:
>> 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''
Si solo desea manejar una conversión de fecha sin tiempo para un campo de fecha mysql, puede modificar este gran código como yo lo hice. En mi versión de PHP sin realizar esta función, obtengo "0000-00-00" todo el tiempo. Molesto.
function ConvertDateString ($DateString)
{
list($year, $month, $day) = explode("-", $DateString);
return date ("Y-m-d, mktime (0, 0, 0, $month, $day, $year));
}
He estado cambiando la respuesta de Martin anterior, que validará cualquier tipo de fecha y devolverá en el formato que desee.
Simplemente cambie el formato editando debajo de la línea del script 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" ;
}
}
?>
He utilizado el siguiente código para validar las fechas provenientes de aplicaciones 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);
}
<?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;
}
?>