transcurridas - PHP encuentra diferencia entre dos fechas
horas transcurridas entre dos fechas php (5)
Estoy tratando de obtener la diferencia entre dos fechas y devolverlas como fecha y hora. He encontrado ejemplos usando diff pero parece que no puedo hacerlo bien.
$timein = date("Y-m-d H:i:s");
$timeout = date("Y-m-d 20:00:00");
$totaltime = $timein->diff($timeout);
Sin embargo, $ totaltime registra "0000-00-00 00:00:00" en mi base de datos. ¿Esto es porque no estoy formateando mi variable de tiempo total?
<?php
$val1 = ''2014-04-10 11:34:09'';
$val2 = ''2015-04-10 10:56:15'';
$result1 = (explode('' '', $val1)) ;
$result2 = (explode('' '', $val2)) ;
$date1= new DateTime($result1[0]);
$date2=new DateTime($result2[0]);
$diffdate=date_diff($date1,$date2);
$difftime = strtotime($result1[1]) - strtotime($result2[1]);
$dates=$diffdate->format("%R%a days");
echo $dates;
echo $difftime;
?>
<?php
$value=''20140203113405'';
$val=''20150203113410'';
$val1=str_split($val,2);
$dateval1=$val1[0].$val1[1]."-".$val1[2]."-".$val1[3];
$timeval1=$val1[4].":".$val1[5].":".$val1[6];
$val2=str_split($value,2);
$dateval2=$val2[0].$val2[1]."-".$val2[2]."-".$val2[3];
$timeval2=$val2[4].":".$val2[5].":".$val2[6];
$date1=new DateTime($dateval1);
$date2=new DateTime($dateval2);
$diffdate=date_diff($date1,$date2);
$dates=$diffdate->format("%a days");
$difftime = strtotime($timeval1) - strtotime($timeval2);
echo $dates;
echo $difftime."seconds";
?>
Simplemente puede usar el formato y diferencia de fecha y hora para calcular la diferencia.
<?php
$datetime1 = new DateTime(''2009-10-11 12:12:00'');
$datetime2 = new DateTime(''2009-10-13 10:12:00'');
$interval = $datetime1->diff($datetime2);
echo $interval->format(''%Y-%m-%d %H:%i:%s'');
?>
Para obtener más información sobre el formato DATETIME, consulte: aquí
Puede cambiar el formato de intervalo en la forma que desee.
Aquí está el ejemplo de trabajo
PD Estas funciones ( diff () y format () ) funcionan solo con> = PHP 5.3.0
No estoy seguro de qué formato está buscando en su diferencia, pero he aquí cómo hacerlo usando DateTime
$datetime1 = new DateTime();
$datetime2 = new DateTime(''2011-01-03 17:13:00'');
$interval = $datetime1->diff($datetime2);
$elapsed = $interval->format(''%y years %m months %a days %h hours %i minutes %s seconds'');
echo $elapsed;
John Conde hace todos los procedimientos correctos en su método, pero no satisface el último paso en su pregunta, que es formatear el resultado según sus especificaciones.
Este código ( Demo ) mostrará la diferencia bruta, expondrá el problema al tratar de formatear inmediatamente la diferencia en bruto, mostrará mis pasos de preparación y finalmente presentará el resultado con el formato correcto:
$datetime1 = new DateTime(''2017-04-26 18:13:06'');
$datetime2 = new DateTime(''2011-01-17 17:13:00''); // change the millenium to see output difference
$diff = $datetime1->diff($datetime2);
// this will get you very close, but it will not pad the digits to conform with your expected format
echo "Raw Difference: ",$diff->format(''%y years %m months %d days %h hours %i minutes %s seconds''),"/n";
// Notice the impact when you change $datetime2''s millenium from ''1'' to ''2''
echo "Invalid format: ",$diff->format(''%Y-%m-%d %H:%i:%s''),"/n"; // only H does it right
$details=array_intersect_key((array)$diff,array_flip([''y'',''m'',''d'',''h'',''i'',''s'']));
echo ''$detail array: '';
var_export($details);
echo "/n";
array_map(function($v,$k)
use(&$r)
{
$r.=($k==''y''?str_pad($v,4,"0",STR_PAD_LEFT):str_pad($v,2,"0",STR_PAD_LEFT));
if($k==''y'' || $k==''m''){$r.="-";}
elseif($k==''d''){$r.=" ";}
elseif($k==''h'' || $k==''i''){$r.=":";}
},$details,array_keys($details)
);
echo "Valid format: ",$r; // now all components of datetime are properly padded
Salida:
Raw Difference: 6 years 3 months 9 days 1 hours 0 minutes 6 seconds
Invalid format: 06-3-9 01:0:6
$detail array: array (
''y'' => 6,
''m'' => 3,
''d'' => 9,
''h'' => 1,
''i'' => 0,
''s'' => 6,
)
Valid format: 0006-03-09 01:00:06
Ahora, para explicar mi preparación de valores de fecha y hora:
$details
toma el objeto diff y lo lanza como una matriz. array_flip ([''y'', ''m'', ''d'', ''h'', ''i'', ''s'']) crea una matriz de claves que se utilizará para eliminar todas las claves irrelevantes de (array)$diff
usando matriz_intersección_clave () .
Luego usando array_map () mi método itera cada valor y clave en $details
, rellena su lado izquierdo con la longitud apropiada con 0
, y concatena la cadena $r
(resultado) con los separadores necesarios para cumplir con el formato de fecha y hora solicitado.