Use esto para el código heredado (PHP <5.3). Para una solución actualizada, vea la respuesta de jurka a continuación
Puede usar strtotime () para convertir dos fechas a tiempo unix y luego calcular el número de segundos entre ellas. A partir de esto, es bastante fácil calcular diferentes períodos de tiempo.
Editar: Obviamente, la forma preferida de hacer esto es la descrita por jurka a continuación. Mi código generalmente solo se recomienda si no tiene PHP 5.3 o superior.
Varias personas en los comentarios han señalado que el código anterior es solo una aproximación. Todavía creo que para la mayoría de los propósitos está bien, ya que el uso de un rango es más para dar una idea de cuánto tiempo ha pasado o queda en lugar de proporcionar precisión; si desea hacerlo, simplemente envíe la fecha.
A pesar de todo eso, he decidido abordar las quejas. Si realmente necesita un rango exacto pero no tiene acceso a PHP 5.3, use el código a continuación (también debería funcionar en PHP 4). Este es un puerto directo del código que PHP usa internamente para calcular rangos, con la excepción de que no tiene en cuenta el horario de verano. Eso significa que está apagado por una hora como máximo, pero a excepción de eso, debería ser correcto.
Si está utilizando la clase DateTime, puede ir a $ date-> format ('U') para obtener la marca de tiempo de Unix.
Jon Cram el
44
No es cierto si tiene que lidiar con el horario de verano / invierno. En este caso particular, cuando ajusta el horario de verano / invierno, un día equivale a 23 o 25 horas.
Arno
44
Bueno, el mismo argumento podría hacerse para los años bisiestos. Tampoco tiene eso en cuenta. Aún así, no estoy convencido de que incluso quiera tener eso en cuenta ya que estamos discutiendo un rango aquí. La semántica para un rango es algo diferente que para una fecha absoluta.
Emil H
99
Esta función es incorrecta. Es bueno para una aproximación, pero incorrecto para rangos exactos. Por un lado, se supone que hay 30 días en un mes, es decir, tendrá la misma diferencia de días entre el 1 de febrero y el 1 de marzo que tendrá del 1 de julio al 1 de agosto (independientemente del año bisiesto).
enobrev
1
En PHP, las variables de referencia están en la firma de la función, no en la llamada. Mueve todos tus &a las firmas.
Paul Tarjan
909
Sugiero usar los objetos DateTime y DateInterval.
$date1 =newDateTime("2007-03-24");
$date2 =newDateTime("2009-06-26");
$interval = $date1->diff($date2);
echo "difference ". $interval->y ." years, ". $interval->m." months, ".$interval->d." days ";// shows the total amount of days (not divided into years, months and days like above)
echo "difference ". $interval->days ." days ";
+1 DateTime maneja los años bisiestos y las zonas horarias correctamente y hay un buen libro para el estante: phparch.com/books/…
hakre
3
¿Hay algún método que proporcione el número total de segundos entre los dos DateTimes? (sin sumar los componentes, es decir)
potatoe
1
@Panique El $ intervalo-> días y $ intervalo-> d son medidas diferentes. su comentario anterior es correcto "muestra la cantidad total de días (no divididos en años, meses y días como los anteriores)"
tenga en cuenta que hay un error en el que DateInterval tiene una propiedad de días incorrecta ( siempre 6015 ) en Windows con algunas versiones de PHP: bugs.php.net/bug.php?id=51184 (consulte los comentarios allí para solución / solución)
Pim Schaaf
73
El mejor curso de acción es usar los objetos DateTime(y DateInterval) de PHP . Cada fecha se encapsula en un DateTimeobjeto, y luego se puede hacer una diferencia entre los dos:
El DateTimeobjeto aceptará cualquier formato strtotime(). Si se necesita un formato de fecha aún más específico, DateTime::createFromFormat()puede usarse para crear el DateTimeobjeto.
Después de que ambos objetos fueron instanciados, resta uno del otro con DateTime::diff().
$difference = $first_date->diff($second_date);
$differenceahora contiene un DateIntervalobjeto con la información de diferencia. A se var_dump()ve así:
Tenemos un problema, intercambiamos first_date por second_date y estamos obteniendo el mismo resultado. ¿Por qué no decir 0 días 0 horas 0 minutos 0 segundos o solo 0. Ejemplo: 2012-11-30 17:03:30 - 2012-12-21 00:00:00 y 2012-12-21 00:00:00 - 2012-11-30 17:03:30 obtener el mismo resultado.
EgoistDeveloper
Porque diff te da la diferencia entre las dos veces. La diferencia no es 0, independientemente de la fecha posterior.
El fantasma de Madara
1
Esta es una respuesta realmente buena, ya que proporciona una función clara a la que se puede llamar desde cualquier parte de una base de código sin muchos cálculos de tiempo. Otras respuestas le permiten soltar cálculos con eco sobre la marcha que abordan los síntomas en lugar de resolver el problema ... El único elemento que he agregado (y casi todas las demás publicaciones no cubren esto) es la pluralización de elementos de intervalo $ si es más de 1.
Y es una solución horrible a menos que uno se ve obligado a utilizar una versión terriblemente anticuados de PHP ...
rdlowrey
2
No tan seco . Por ejemplo, 60 * 60 * 24 se repite 15 veces. ¡Viva la reutilización de copiar y pegar!
Peter Mortensen
¿Qué pasa con los años bisiestos? Un año no es 365 días en promedio.
Peter Mortensen
Este código supone que un mes son 30 días en promedio. Incluso suponiendo 365 días durante un año, un mes promedio es 365/12 = 30.42 días (aprox.).
Peter Mortensen
18
Echa un vistazo al siguiente enlace. Esta es la mejor respuesta que he encontrado hasta ahora .. :)
function dateDiff ($d1, $d2){// Return the number of days between the two dates: return round(abs(strtotime($d1)- strtotime($d2))/86400);}// end function dateDiff
No importa qué fecha sea anterior o posterior cuando pase los parámetros de fecha. La función utiliza el valor absoluto ABS () de PHP para devolver siempre un número positivo como el número de días entre las dos fechas.
Tenga en cuenta que el número de días entre las dos fechas NO incluye ambas fechas. Por lo tanto, si está buscando la cantidad de días representados por todas las fechas entre las fechas ingresadas e incluidas, deberá agregar uno (1) al resultado de esta función.
Por ejemplo, la diferencia (según lo devuelto por la función anterior) entre 2013-02-09 y 2013-02-14 es 5. Pero el número de días o fechas representados por el rango de fechas 2013-02-09 - 2013-02- 14 es 6.
La pregunta pedía la diferencia como la cantidad de años, meses y días, no la cantidad total de días.
Peter Mortensen
14
Voté por la respuesta de jurka ya que es mi favorita, pero tengo una versión pre-php.5.3 ...
Me encontré trabajando en un problema similar, que es cómo llegué a esta pregunta en primer lugar, pero solo necesitaba una diferencia en horas. Pero mi función resolvió esto bastante bien también y no tengo ningún lugar en mi propia biblioteca para mantenerlo donde no se pierda ni se olvide, así que ... espero que esto sea útil para alguien.
Tengo la idea original de aquí , que modifiqué para mis usos (y espero que mi modificación también se muestre en esa página).
Puede eliminar fácilmente los intervalos que no desea (por ejemplo, "semana") eliminándolos de la $aIntervalsmatriz, o tal vez agregando un $aExcludeparámetro, o simplemente filtrándolos cuando genera la cadena.
Desafortunadamente, esto no devuelve lo mismo que DateInterval debido a desbordamientos de año / mes.
Stephen Harris
2
@StephenHarris: No he probado esto, pero al leer el código estoy bastante seguro de que debería devolver el mismo resultado, siempre que elimine el weekíndice $aIntervals(ya que DateDiffnunca lo usa).
Alix Axel
Esta es una gran solución para encontrar fechas que ocurren cada intervalo entre dos fechas.
entrebrain
14
<?php
$today = strtotime("2011-02-03 00:00:00");
$myBirthDate = strtotime("1964-10-30 00:00:00");
printf("Days since my birthday: ",($today - $myBirthDate)/60/60/24);?>
no parece funcionar Tengo una cita al comienzo de la era de la marca de tiempo.
Sirber
Es importante comprender que debe hacer una $my_t["year"] -= 1970para obtener la cantidad correcta de años. También debe restar su diferencia horaria de GMT para obtener las horas correctas. También debe restar 1 del mes y la fecha.
Salman A
6
// If you just want to see the year difference then use this function.// Using the logic I've created you may also create month and day difference// which I did not provide here so you may have the efforts to use your brain.// :)
$date1='2009-01-01';
$date2='2010-01-01';
echo getYearDifference ($date1,$date2);function getYearDifference($date1=strtotime($date1),$date2=strtotime($date2)){
$year =0;while($date2 > $date1 = strtotime('+1 year', $date1)){++$year;}return $year;}
¿"Strtotime ('+ 1 año', $ date1)" tiene en cuenta los años bisiestos?
Peter Mortensen
6
Esta es mi funcion. PHP requerido> = 5.3.4. Utiliza la clase DateTime. Muy rápido, rápido y puede hacer la diferencia entre dos fechas o incluso el llamado "tiempo desde".
if(function_exists('grk_Datetime_Since')=== FALSE){function grk_Datetime_Since($From, $To='', $Prefix='', $Suffix=' ago', $Words=array()){# Est-ce qu'on calcul jusqu'à un moment précis ? Probablement pas, on utilise maintenantif(empty($To)=== TRUE){
$To = time();}# On va s'assurer que $From est numériqueif(is_int($From)=== FALSE){
$From = strtotime($From);};# On va s'assurer que $To est numériqueif(is_int($To)=== FALSE){
$To = strtotime($To);}# On a une erreur ?if($From === FALSE OR $From ===-1 OR $To === FALSE OR $To ===-1){return FALSE;}# On va créer deux objets de date
$From =newDateTime(@date('Y-m-d H:i:s', $From),newDateTimeZone('GMT'));
$To =newDateTime(@date('Y-m-d H:i:s', $To),newDateTimeZone('GMT'));# On va calculer la différence entre $From et $Toif(($Diff = $From->diff($To))=== FALSE){return FALSE;}# On va merger le tableau des noms (par défaut, anglais)
$Words = array_merge(array('year'=>'year','years'=>'years','month'=>'month','months'=>'months','week'=>'week','weeks'=>'weeks','day'=>'day','days'=>'days','hour'=>'hour','hours'=>'hours','minute'=>'minute','minutes'=>'minutes','second'=>'second','seconds'=>'seconds'), $Words);# On va créer la chaîne maintenantif($Diff->y >1){
$Text = $Diff->y.' '.$Words['years'];} elseif($Diff->y ==1){
$Text ='1 '.$Words['year'];} elseif($Diff->m >1){
$Text = $Diff->m.' '.$Words['months'];} elseif($Diff->m ==1){
$Text ='1 '.$Words['month'];} elseif($Diff->d >7){
$Text = ceil($Diff->d/7).' '.$Words['weeks'];} elseif($Diff->d ==7){
$Text ='1 '.$Words['week'];} elseif($Diff->d >1){
$Text = $Diff->d.' '.$Words['days'];} elseif($Diff->d ==1){
$Text ='1 '.$Words['day'];} elseif($Diff->h >1){
$Text = $Diff->h.' '.$Words['hours'];} elseif($Diff->h ==1){
$Text ='1 '.$Words['hour'];} elseif($Diff->i >1){
$Text = $Diff->i.' '.$Words['minutes'];} elseif($Diff->i ==1){
$Text ='1 '.$Words['minute'];} elseif($Diff->s >1){
$Text = $Diff->s.' '.$Words['seconds'];}else{
$Text ='1 '.$Words['second'];}return $Prefix.$Text.$Suffix;}}
Esto intentará detectar si se dio una marca de tiempo o no, y también devolverá fechas / horas futuras como valores negativos:
<?php
function time_diff($start, $end = NULL, $convert_to_timestamp = FALSE){// If $convert_to_timestamp is not explicitly set to TRUE,// check to see if it was accidental:if($convert_to_timestamp ||!is_numeric($start)){// If $convert_to_timestamp is TRUE, convert to timestamp:
$timestamp_start = strtotime($start);}else{// Otherwise, leave it as a timestamp:
$timestamp_start = $start;}// Same as above, but make sure $end has actually been overridden with a non-null,// non-empty, non-numeric value:if(!is_null($end)&&(!empty($end)&&!is_numeric($end))){
$timestamp_end = strtotime($end);}else{// If $end is NULL or empty and non-numeric value, assume the end time desired// is the current time (useful for age, etc):
$timestamp_end = time();}// Regardless, set the start and end times to an integer:
$start_time =(int) $timestamp_start;
$end_time =(int) $timestamp_end;// Assign these values as the params for $then and $now:
$start_time_var ='start_time';
$end_time_var ='end_time';// Use this to determine if the output is positive (time passed) or negative (future):
$pos_neg =1;// If the end time is at a later time than the start time, do the opposite:if($end_time <= $start_time){
$start_time_var ='end_time';
$end_time_var ='start_time';
$pos_neg =-1;}// Convert everything to the proper format, and do some math:
$then =newDateTime(date('Y-m-d H:i:s', $$start_time_var));
$now =newDateTime(date('Y-m-d H:i:s', $$end_time_var));
$years_then = $then->format('Y');
$years_now = $now->format('Y');
$years = $years_now - $years_then;
$months_then = $then->format('m');
$months_now = $now->format('m');
$months = $months_now - $months_then;
$days_then = $then->format('d');
$days_now = $now->format('d');
$days = $days_now - $days_then;
$hours_then = $then->format('H');
$hours_now = $now->format('H');
$hours = $hours_now - $hours_then;
$minutes_then = $then->format('i');
$minutes_now = $now->format('i');
$minutes = $minutes_now - $minutes_then;
$seconds_then = $then->format('s');
$seconds_now = $now->format('s');
$seconds = $seconds_now - $seconds_then;if($seconds <0){
$minutes -=1;
$seconds +=60;}if($minutes <0){
$hours -=1;
$minutes +=60;}if($hours <0){
$days -=1;
$hours +=24;}
$months_last = $months_now -1;if($months_now ==1){
$years_now -=1;
$months_last =12;}// "Thirty days hath September, April, June, and November" ;)if($months_last ==9|| $months_last ==4|| $months_last ==6|| $months_last ==11){
$days_last_month =30;}elseif($months_last ==2){// Factor in leap years:if(($years_now %4)==0){
$days_last_month =29;}else{
$days_last_month =28;}}else{
$days_last_month =31;}if($days <0){
$months -=1;
$days += $days_last_month;}if($months <0){
$years -=1;
$months +=12;}// Finally, multiply each value by either 1 (in which case it will stay the same),// or by -1 (in which case it will become negative, for future dates).// Note: 0 * 1 == 0 * -1 == 0
$out =new stdClass;
$out->years =(int) $years * $pos_neg;
$out->months =(int) $months * $pos_neg;
$out->days =(int) $days * $pos_neg;
$out->hours =(int) $hours * $pos_neg;
$out->minutes =(int) $minutes * $pos_neg;
$out->seconds =(int) $seconds * $pos_neg;return $out;}
"si" la fecha se almacena en MySQL, me resulta más fácil hacer el cálculo de la diferencia a nivel de la base de datos ... Luego, según el día, la hora, el minuto, la salida secundaria, analizar y mostrar los resultados según corresponda ...
Encontré su artículo en la siguiente página, que contiene una serie de referencias para PHP cálculos de fecha y hora .
Calcule la diferencia entre dos fechas (y tiempo) usando PHP. La siguiente página proporciona una variedad de métodos diferentes (7 en total) para realizar cálculos de fecha / hora usando PHP, para determinar la diferencia de tiempo (horas, munites), días, meses o años entre dos fechas.
También puede usar el siguiente código para devolver la diferencia de fecha por fracciones redondas hasta $ date1 = $ duedate; // asignar fecha de vencimiento echo $ date2 = date ("Ymd"); // fecha actual $ ts1 = strtotime ($ date1); $ ts2 = strtotime ($ date2); $ segundos_diff = $ ts1 - $ ts2; echo $ dateiff = ceil (($ segundos_diff / 3600) / 24); // regreso en días
Si usa el método de piso de php en lugar de ceil, le devolverá la fracción redonda hacia abajo. Verifique la diferencia aquí, algunas veces si la zona horaria de su servidor provisional es diferente a la zona horaria del sitio en vivo, en ese caso puede obtener resultados diferentes, por lo tanto, cambie las condiciones en consecuencia.
Tuve el mismo problema con PHP 5.2 y lo resolví con MySQL. Puede que no sea exactamente lo que estás buscando, pero esto hará el truco y devolverá la cantidad de días:
Como todos están publicando ejemplos de código, aquí hay otra versión.
Quería una función para mostrar diferencias de segundos a años (solo una unidad). Para períodos superiores a 1 día, quería que se transfiriera a la medianoche (las 10 a.m. del lunes visto desde las 9 a.m. el miércoles es hace 2 días, no 1). Y durante períodos de más de un mes, quería que la transferencia se realizara el mismo día del mes (incluidos los meses de 30/31 días y años bisiestos).
Esto es lo que se me ocurrió:
/**
* Returns how long ago something happened in the past, showing it
* as n seconds / minutes / hours / days / weeks / months / years ago.
*
* For periods over a day, it rolls over at midnight (so doesn't depend
* on current time of day), and it correctly accounts for month-lengths
* and leap-years (months and years rollover on current day of month).
*
* $param string $timestamp in DateTime format
* $return string description of interval
*/function ago($timestamp){
$then = date_create($timestamp);// for anything over 1 day, make it rollover on midnight
$today = date_create('tomorrow');// ie end of today
$diff = date_diff($then, $today);if($diff->y >0)return $diff->y.' year'.($diff->y>1?'s':'').' ago';if($diff->m >0)return $diff->m.' month'.($diff->m>1?'s':'').' ago';
$diffW = floor($diff->d /7);if($diffW >0)return $diffW.' week'.($diffW>1?'s':'').' ago';if($diff->d >1)return $diff->d.' day'.($diff->d>1?'s':'').' ago';// for anything less than 1 day, base it off 'now'
$now = date_create();
$diff = date_diff($then, $now);if($diff->d >0)return'yesterday';if($diff->h >0)return $diff->h.' hour'.($diff->h>1?'s':'').' ago';if($diff->i >0)return $diff->i.' minute'.($diff->i>1?'s':'').' ago';return $diff->s.' second'.($diff->s==1?'':'s').' ago';}
Esta respuesta es tan incorrecta como la respuesta de Khaldonno. Se supone (caso 10) que un año tiene 365 días (cada cuarto año tiene 366 días (excepto las reglas de 100 años / 400 años para el calendario gregoriano)), y que un mes tiene 30 días (es aproximadamente aproximadamente 30.42 días en años no bisiestos). Incluso con mejores constantes, solo es correcto en promedio, no necesariamente correcto para dos fechas en particular.
Peter Mortensen
3
Muy simple:
<?php
$date1 = date_create("2007-03-24");
echo "Start date: ".$date1->format("Y-m-d")."<br>";
$date2 = date_create("2009-06-26");
echo "End date: ".$date2->format("Y-m-d")."<br>";
$diff = date_diff($date1,$date2);
echo "Difference between start date and end date: ".$diff->format("%y years, %m months and %d days")."<br>";?>
Por favor, consulte el siguiente enlace para más detalles:
Corre dos bucles; el primero trata los intervalos relativos (años y meses) a través de la fuerza bruta, y el segundo calcula los intervalos absolutos adicionales con aritmética simple (por lo que es más rápido):
Respuestas:
Puede usar strtotime () para convertir dos fechas a tiempo unix y luego calcular el número de segundos entre ellas. A partir de esto, es bastante fácil calcular diferentes períodos de tiempo.
Editar: Obviamente, la forma preferida de hacer esto es la descrita por jurka a continuación. Mi código generalmente solo se recomienda si no tiene PHP 5.3 o superior.
Varias personas en los comentarios han señalado que el código anterior es solo una aproximación. Todavía creo que para la mayoría de los propósitos está bien, ya que el uso de un rango es más para dar una idea de cuánto tiempo ha pasado o queda en lugar de proporcionar precisión; si desea hacerlo, simplemente envíe la fecha.
A pesar de todo eso, he decidido abordar las quejas. Si realmente necesita un rango exacto pero no tiene acceso a PHP 5.3, use el código a continuación (también debería funcionar en PHP 4). Este es un puerto directo del código que PHP usa internamente para calcular rangos, con la excepción de que no tiene en cuenta el horario de verano. Eso significa que está apagado por una hora como máximo, pero a excepción de eso, debería ser correcto.
fuente
&
a las firmas.Sugiero usar los objetos DateTime y DateInterval.
leer más php DateTime :: diff manual
Del manual:
fuente
$date2->format('U') - $date1->format('U')
.El mejor curso de acción es usar los objetos
DateTime
(yDateInterval
) de PHP . Cada fecha se encapsula en unDateTime
objeto, y luego se puede hacer una diferencia entre los dos:El
DateTime
objeto aceptará cualquier formatostrtotime()
. Si se necesita un formato de fecha aún más específico,DateTime::createFromFormat()
puede usarse para crear elDateTime
objeto.Después de que ambos objetos fueron instanciados, resta uno del otro con
DateTime::diff()
.$difference
ahora contiene unDateInterval
objeto con la información de diferencia. A sevar_dump()
ve así:Para formatear el
DateInterval
objeto, necesitaremos verificar cada valor y excluirlo si es 0:Todo lo que queda ahora es llamar a nuestra función en el
$difference
DateInterval
objeto:Y obtenemos el resultado correcto:
El código completo utilizado para lograr el objetivo:
fuente
DateTime()
no es una función, es un objeto y está ahí desde PHP 5.2. Asegúrese de que su servidor lo admita.Ver Horas y Minutos y Segundos ..
fuente
Echa un vistazo al siguiente enlace. Esta es la mejor respuesta que he encontrado hasta ahora .. :)
http://www.bizinfosys.com/php/date-difference.html
fuente
Voté por la respuesta de jurka ya que es mi favorita, pero tengo una versión pre-php.5.3 ...
Me encontré trabajando en un problema similar, que es cómo llegué a esta pregunta en primer lugar, pero solo necesitaba una diferencia en horas. Pero mi función resolvió esto bastante bien también y no tengo ningún lugar en mi propia biblioteca para mantenerlo donde no se pierda ni se olvide, así que ... espero que esto sea útil para alguien.
Y la prueba:
Y el resultado:
Tengo la idea original de aquí , que modifiqué para mis usos (y espero que mi modificación también se muestre en esa página).
Puede eliminar fácilmente los intervalos que no desea (por ejemplo, "semana") eliminándolos de la
$aIntervals
matriz, o tal vez agregando un$aExclude
parámetro, o simplemente filtrándolos cuando genera la cadena.fuente
week
índice$aIntervals
(ya queDateDiff
nunca lo usa).fuente
No sé si está utilizando un marco PHP o no, pero muchos marcos PHP tienen bibliotecas de fecha / hora y ayudantes para evitar que reinvente la rueda.
Por ejemplo, CodeIgniter tiene la
timespan()
función. Simplemente ingrese dos marcas de tiempo Unix y generará automáticamente un resultado como este:http://codeigniter.com/user_guide/helpers/date_helper.html
fuente
Use ejemplo:
Salida:
Función:
fuente
Tengo una lógica simple para eso:
fuente
Puedes usar el
función que devuelve una matriz que contiene todos los elementos de la fecha / hora suministrada:
Si las fechas de inicio y finalización están en formato de cadena, use
antes del código anterior
fuente
$my_t["year"] -= 1970
para obtener la cantidad correcta de años. También debe restar su diferencia horaria de GMT para obtener las horas correctas. También debe restar 1 del mes y la fecha.fuente
Esta es mi funcion. PHP requerido> = 5.3.4. Utiliza la clase DateTime. Muy rápido, rápido y puede hacer la diferencia entre dos fechas o incluso el llamado "tiempo desde".
fuente
Preferiría usar
date_create
ydate_diff
objetos.Código:
Salida:
Para más información lea el manual de PHP
date_diff
fuente
Esto intentará detectar si se dio una marca de tiempo o no, y también devolverá fechas / horas futuras como valores negativos:
Ejemplo de uso:
O:
fuente
"si" la fecha se almacena en MySQL, me resulta más fácil hacer el cálculo de la diferencia a nivel de la base de datos ... Luego, según el día, la hora, el minuto, la salida secundaria, analizar y mostrar los resultados según corresponda ...
fuente
Encontré su artículo en la siguiente página, que contiene una serie de referencias para PHP cálculos de fecha y hora .
Calcule la diferencia entre dos fechas (y tiempo) usando PHP. La siguiente página proporciona una variedad de métodos diferentes (7 en total) para realizar cálculos de fecha / hora usando PHP, para determinar la diferencia de tiempo (horas, munites), días, meses o años entre dos fechas.
Vea PHP Fecha Hora - 7 métodos para calcular la diferencia entre 2 fechas .
fuente
También puede usar el siguiente código para devolver la diferencia de fecha por fracciones redondas hasta $ date1 = $ duedate; // asignar fecha de vencimiento echo $ date2 = date ("Ymd"); // fecha actual $ ts1 = strtotime ($ date1); $ ts2 = strtotime ($ date2); $ segundos_diff = $ ts1 - $ ts2; echo $ dateiff = ceil (($ segundos_diff / 3600) / 24); // regreso en días
Si usa el método de piso de php en lugar de ceil, le devolverá la fracción redonda hacia abajo. Verifique la diferencia aquí, algunas veces si la zona horaria de su servidor provisional es diferente a la zona horaria del sitio en vivo, en ese caso puede obtener resultados diferentes, por lo tanto, cambie las condiciones en consecuencia.
fuente
fuente
siempre puede usar la siguiente función que puede devolver la edad en años y meses (es decir, 1 año 4 meses)
o si desea que se calcule la edad en la fecha actual, puede usar
fuente
Para la versión php> = 5.3: Cree dos objetos de fecha y luego use la
date_diff()
función. Devolverá el objeto php DateInterval . ver documentaciónfuente
Aquí está el código ejecutable
fuente
Tuve el mismo problema con PHP 5.2 y lo resolví con MySQL. Puede que no sea exactamente lo que estás buscando, pero esto hará el truco y devolverá la cantidad de días:
Más información aquí http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_datediff
fuente
Como todos están publicando ejemplos de código, aquí hay otra versión.
Quería una función para mostrar diferencias de segundos a años (solo una unidad). Para períodos superiores a 1 día, quería que se transfiriera a la medianoche (las 10 a.m. del lunes visto desde las 9 a.m. el miércoles es hace 2 días, no 1). Y durante períodos de más de un mes, quería que la transferencia se realizara el mismo día del mes (incluidos los meses de 30/31 días y años bisiestos).
Esto es lo que se me ocurrió:
fuente
Hace algún tiempo escribí una
format_date
función, ya que esto ofrece muchas opciones sobre cómo desea su fecha :fuente
Muy simple:
Por favor, consulte el siguiente enlace para más detalles:
PHP: date_diff - Manual
Tenga en cuenta que es para PHP 5.3.0 o superior.
fuente
Una función fácil
Usar como
echo time_difference ($time_1, $time_2, "day");
Volveremos como
2 years 8 months 2 days
fuente
Pruebe esta respuesta muy simple usando date_diff () , esto se prueba.
la salida es:
fuente
Estoy usando la siguiente función que escribí, cuando PHP 5.3 (respectivamente date_diff ()) no está disponible:
fuente
DateInterval
es genial pero tiene un par de advertencias:Para superar eso, codifiqué lo siguiente (mejorado a partir de la respuesta de @enobrev ):
Corre dos bucles; el primero trata los intervalos relativos (años y meses) a través de la fuerza bruta, y el segundo calcula los intervalos absolutos adicionales con aritmética simple (por lo que es más rápido):
fuente