Si tiene un $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';
En el momento en que las fechas son cadenas, ¿ayudaría convertirlas en números enteros de marca de tiempo?
php
date
date-range
leal
fuente
fuente
Respuestas:
Convertirlos en marcas de tiempo es el camino a seguir, 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)); }
fuente
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);
fuente
2012-02-01
está entre2012-02-01 ... 2014-04-30 23:59:59
.DateTime
las funciones de tiempo incompletas que PHP ofrece listas para usar. Para incluir la fecha de inicio y finalización dentro de esta verificación, simplemente cambie el valor de retorno areturn $date >= $startDate && $date <= $endDate;
No es necesario convertir a marca de tiempo para realizar la comparación, dado que las cadenas se validan como fechas en formato canónico 'AAAA-MM-DD'.
Esta prueba funcionará:
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 con formato extraño '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 SOLO si los valores de fecha en las cadenas están en formato CONSISTENTE y CANÓNICO .
EDITAR para agregar una nota aquí, elaborando lo obvio.
Por CONSISTENTE , quiero decir, por ejemplo, que las cadenas que se comparan deben tener un formato idéntico: el mes debe tener siempre dos caracteres, el día siempre debe tener dos caracteres y el carácter separador debe ser siempre un guión. No podemos comparar de forma fiable "cadenas" que no sean un año de cuatro caracteres, un mes de dos caracteres ni un día de dos caracteres. Si tuviéramos una mezcla de un carácter y dos meses de caracteres en las cadenas, por ejemplo, obtendríamos un resultado inesperado cuando comparamos
'2009-9-30'
con'2009-10-11'
. Humanamente vemos "9" como menor que "10", pero una comparación de cadenas verá'2009-9'
como mayor que'2009-1'
. No es necesario que tengamos caracteres separadores de guiones; podríamos comparar cadenas de forma fiable en'YYYYMMDD'
formato; si hay un carácter separador, debe estar siempre ahí y ser siempre el mismo.Por CANÓNICO , me refiero a un formato que dará como resultado cadenas que se ordenarán por fecha. Es decir, la cadena tendrá una representación de "año" primero, luego "mes", luego "día". No podemos comparar cadenas en
'MM-DD-YYYY'
formato de manera confiable , porque eso no es canónico. Una comparación de cadenas compararía elMM
(mes) antes de compararloYYYY
(año), ya que la comparación de cadenas funciona de izquierda a derecha.) Un gran beneficio del formato de cadena 'AAAA-MM-DD' es que es canónico; las fechas representadas en este formato se pueden comparar de forma fiable como cadenas.[APÉNDICE]
Si opta por la conversión de 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 / o posteriores a 2038-01-19. (Esa es la naturaleza del entero de 32 bits de marca de tiempo de 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 usar la misma zona horaria al convertir de cadena a marca de tiempo y de marca de tiempo a cadena.
HTH
fuente
$startDatedt = strtotime($start_date) $endDatedt = strtotime($end_date) $usrDatedt = strtotime($date_from_user) if( $usrDatedt >= $startDatedt && $usrDatedt <= $endDatedt) { //..falls within range }
fuente
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
fuente
En el formato que ha proporcionado, asumiendo que el usuario es lo suficientemente inteligente como para darle fechas válidas, no necesita convertir a una fecha primero, puede compararlas como cadenas.
fuente
$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"; }
fuente
Conviértelos en fechas o números enteros de marca de tiempo y luego simplemente verifique que $ date_from_user sea <= $ end_date y> = $ start_date
fuente
Puedes probar 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);
fuente
iterator_to_array()
está disponible desde PHP 5.1Encontré 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 } }
fuente