php - saber - ¿Cómo verificar si una fecha está en un rango determinado?
php fecha entre dos fechas (10)
Convierta ambas fechas en marcas de tiempo y luego haga
pseudocódigo:
if date_from_user > start_date && date_from_user < end_date
return true
Si tiene $start_date
y $end_date
, ¿cómo puede verificar si una fecha dada por el usuario se encuentra dentro de ese rango?
p.ej
$start_date = ''2009-06-17'';
$end_date = ''2009-09-05'';
$date_from_user = ''2009-08-28'';
Por el momento las fechas son cadenas, ¿sería útil convertirlas en enteros de marca de tiempo?
Conviertalos en enteros de fecha y hora y, a continuación, solo haga clic en $ date_from_user is <= $ end_date and> = $ start_date
Convirtiéndolos en marcas de tiempo es la manera de ir bien, usando strtotime , por ejemplo
$start_date = ''2009-06-17'';
$end_date = ''2009-09-05'';
$date_from_user = ''2009-08-28'';
check_in_range($start_date, $end_date, $date_from_user);
function check_in_range($start_date, $end_date, $date_from_user)
{
// Convert to timestamp
$start_ts = strtotime($start_date);
$end_ts = strtotime($end_date);
$user_ts = strtotime($date_from_user);
// Check that user date is between start & end
return (($user_ts >= $start_ts) && ($user_ts <= $end_ts));
}
En el formato que proporcionó, suponiendo que el usuario es lo suficientemente inteligente como para darle fechas válidas, no necesita convertir primero a una fecha, puede compararlas como cadenas.
Encontré este método el más fácil:
$start_date = ''2009-06-17'';
$end_date = ''2009-09-05'';
$date_from_user = ''2009-08-28'';
$start_date = date_create($start_date);
$date_from_user = date_create($date_from_user);
$end_date = date_create($end_date);
$interval1 = date_diff($start_date, $date_from_user);
$interval2 = date_diff($end_date, $date_from_user);
if($interval1->invert == 0){
if($interval2->invert == 1){
// if it lies between start date and end date execute this code
}
}
No es necesario convertir a marca de tiempo para hacer la comparación, dado que las cadenas se validan como fechas en formato canónico ''AAAA-MM-DD''.
Esta prueba funcionará:
( ( $date_from_user >= $start_date ) && ( $date_from_user <= $end_date ) )
dado:
$start_date = ''2009-06-17'';
$end_date = ''2009-09-05'';
$date_from_user = ''2009-08-28'';
NOTA: La comparación de cadenas como esta permite fechas "no válidas", por ejemplo (32 de diciembre) ''2009-13-32'' y cadenas extrañamente formateadas ''2009/3/3'', de modo que una comparación de cadenas NO será equivalente a una comparación de fecha o marca de tiempo. Esto funciona SÓLO si los valores de fecha en las cadenas están en un formato CONSISTENTE y CANÓNICO .
EDITAR para agregar una nota aquí, explicando lo obvio.
Por CONSISTENTE , me refiero, por ejemplo, a que las cadenas que se comparan deben estar en formato idéntico: el mes debe tener siempre dos caracteres, el día debe tener siempre dos caracteres y el carácter separador debe ser siempre un guión. No podemos comparar confiablemente "cadenas" que no sean de cuatro caracteres anuales, dos caracteres mensuales, dos caracteres diarios. Si tuviéramos una combinación de un carácter y dos meses de carácter en las cuerdas, por ejemplo, obtendríamos resultados inesperados cuando comparamos, ''2009-9-30''
a ''2009-10-11''
. Humanamente vemos "9" como menos de "10", pero una comparación de cadenas verá ''2009-9''
como mayor que ''2009-1''
. No necesariamente necesitamos tener un separador de guiones; podríamos comparar de manera confiable cadenas en formato ''YYYYMMDD''
; si hay un carácter separador, tiene que estar siempre allí y ser siempre el mismo.
Por CANONICAL , me refiero a un formato que dará como resultado cadenas que serán ordenadas por orden de fecha. Es decir, la cadena tendrá una representación de "año" primero, luego "mes", luego "día". No podemos comparar cadenas de manera confiable en ''MM-DD-YYYY''
formato ''MM-DD-YYYY''
, porque eso no es canónico. Una comparación de cadenas compararía el MM
(mes) antes de comparar YYYY
(año) ya que la comparación de cadenas funciona de izquierda a derecha. Un gran beneficio del formato de cadena ''YYYY-MM-DD'' es que es canónico; las fechas representadas en este formato se pueden comparar confiablemente como cadenas.
[APÉNDICE]
Si opta por la conversión de la marca de tiempo php, tenga en cuenta las limitaciones.
En algunas plataformas, php no admite valores de marca de tiempo anteriores a 1970-01-01 y posteriores a 2038-01-19. (Esa es la naturaleza del entero de 32 bits de la marca de tiempo Unix.) Se supone que las versiones posteriores pf php (5.3?) Abordan eso.
La zona horaria también puede ser un problema, si no tiene cuidado de utilizar la misma zona horaria al convertir de cadena a marca de tiempo y de marca de tiempo a cadena.
HTH
Puedes intentar esto:
//custom date for example
$d1 = new DateTime("2012-07-08");
$d2 = new DateTime("2012-07-11");
$d3 = new DateTime("2012-07-08");
$d4 = new DateTime("2012-07-15");
//create a date period object
$interval = new DateInterval(''P1D'');
$daterange = iterator_to_array(new DatePeriod($d1, $interval, $d2));
$daterange1 = iterator_to_array(new DatePeriod($d3, $interval, $d4));
array_map(function($v) use ($daterange1) { if(in_array($v, $daterange1)) print "Bingo!";}, $daterange);
Use la clase DateTime si tiene PHP 5.3+. Más fácil de usar, mejor funcionalidad.
DateTime admite internamente zonas horarias, con las otras soluciones depende de usted manejar eso.
<?php
/**
* @param DateTime $date Date that is to be checked if it falls between $startDate and $endDate
* @param DateTime $startDate Date should be after this date to return true
* @param DateTime $endDate Date should be before this date to return true
* return bool
*/
function isDateBetweenDates(DateTime $date, DateTime $startDate, DateTime $endDate) {
return $date > $startDate && $date < $endDate;
}
$fromUser = new DateTime("2012-03-01");
$startDate = new DateTime("2012-02-01 00:00:00");
$endDate = new DateTime("2012-04-30 23:59:59");
echo isDateBetweenDates($fromUser, $startDate, $endDate);
$startDatedt = strtotime($start_date)
$endDatedt = strtotime($end_date)
$usrDatedt = strtotime($date_from_user)
if( $usrDatedt >= $startDatedt && $usrDatedt <= $endDatedt)
{
//..falls within range
}
$start_date="17/02/2012";
$end_date="21/02/2012";
$date_from_user="19/02/2012";
function geraTimestamp($data)
{
$partes = explode(''/'', $data);
return mktime(0, 0, 0, $partes[1], $partes[0], $partes[2]);
}
$startDatedt = geraTimestamp($start_date);
$endDatedt = geraTimestamp($end_date);
$usrDatedt = geraTimestamp($date_from_user);
if (($usrDatedt >= $startDatedt) && ($usrDatedt <= $endDatedt))
{
echo "Dentro";
}
else
{
echo "Fora";
}