¿Cómo sumo o resto el tiempo transcurrido de una fecha en el formato aaaa-mm-dd hh:mm:ss y devuelvo el resultado en el mismo formato?

¿Cómo resto y/o sumo el tiempo transcurrido a una fecha en el formato aaaa-mm-dd hh:mm:ss?
es decir, ¿cómo agrego 16:49:13 a 2012-06-18 22:03:18?

Además, ¿cómo resto 16:49:13 de 2012-06-19 14:52:31?
Necesito que los resultados estén en el formato hh:mm:ss

preguntado el 29 de julio de 12 a las 21:07

¿Quieres hacer esto con php o con mysql? -

¿Cómo obtienes esas cadenas de tiempo? -

Los obtengo de un documento de Excel muy grande (contiene alrededor de 50 000 fechas a la vez). Los subo a un sistema PHP que estoy desarrollando. Estoy escribiendo código usando las siguientes fórmulas DURACIÓN = FECHA DE FINALIZACIÓN - FECHA DE INICIO FECHA DE FINALIZACIÓN = FECHA DE INICIO + DURACIÓN FECHA DE INICIO = FECHA DE FINALIZACIÓN - DURACIÓN. Necesito devolver la DURACIÓN en el formato HH:MM:SS. Pero, necesito devolver STARTDATE & ENDDATE en el formato aaaa-mm-dd hh:mm:ss. -

OK, mira mi respuesta, puedes generar el resultado en cualquier formato que desees usando eso. -

4 Respuestas

mi idea rápida:

<?php

$a="16:49:13"; 
$e=explode(':', $a);

$y="2012-06-18 22:03:18";

echo  date('d-m-Y h:i:s',strtotime("+ $e[0] hours $e[1] minutes $e[2] seconds ",strtotime($y)));

output: 19-06-2012 02:52:31

Respondido 29 Jul 12, 21:07

Sin embargo, el segundo desafío es restar $a de $y - Loyd

cambie el + a un - en el strtotime() - user557846

¡Ay! gracias por el consejo. Creo que lo último es implementar una pequeña validación de expresiones regulares para YYYY-MM-DD HH:MM:SS antes de hacer cualquier cálculo. - Loyd

Podrías hacer uso de PHP Objetos DateTime para esto. Algo a lo largo de las líneas de: -

Para agregar:-

$dateTime = new DateTime("2012-06-18 22:03:18");
list($hours, $minutes, $seconds) = explode(":", "16:49:13");
$seconds += $minutes * 60;
$seconds += $hours * 3600;
$interval = new DateInterval("PT{$seconds}S");
$dateTime->add($interval);

Restar:-

$dateTime = new DateTime("2012-06-18 22:03:18");
list($hours, $minutes, $seconds) = explode(":", "16:49:13");
$seconds += $minutes * 60;
$seconds += $hours * 3600;
$interval = new DateInterval("PT{$seconds}S");
$dateTime->sub($interval);

Entonces usa el DateTime::format() función para mostrar el resultado de la forma que desee.

El objeto de fecha y hora se ocupará de cosas como años bisiestos, zonas horarias, etc. Estas son todas las cosas que pueden hacer fácilmente que los cálculos de tiempo sean una molestia.

Respondido 29 Jul 12, 21:07

Dados dos tiempos tales como: 23:54:23 y 16:49:13, desea que la salida siga en formato HH:MM:SS, lo que representa la cantidad total de horas, minutos y segundos resultantes de la suma de las dos fechas (debería salir 40:43:36):

Puede utilizar esta función:

function addTime($t1, $t2)
{
    $t1a = explode(':', $t1);
    $t2a = explode(':', $t2);

    $h = $t1a[0] + $t2a[0] + ((($t1a[1] + $t2a[1]) / 60) >= 1 ? 1 : 0);
    $m = (($t1a[1] + $t2a[1]) % 60) + ((($t1a[2] + $t2a[2]) / 60) >= 1 ? 1 : 0);
    $s = ($t1a[2] + $t2a[2]) % 60;

    if($m == 60)
    {
        $h++;
        $m = 0;
    }

    $h = strlen($h) < 2 ? '0'.$h : $h;
    $m = strlen($m) < 2 ? '0'.$m : $m;
    $s = strlen($s) < 2 ? '0'.$s : $s;

    return "$h:$m:$s";
}

$t1 = '23:54:23'; 
$t2 = '16:49:13';

echo addTime($t1, $t2); // 40:43:36

Respondido 29 Jul 12, 22:07

Aquí hay otra forma de usar la función strtotime:

$myTime      = strtotime('2012-06-18 22:03:18');
$delta       = (16 * 60 * 60) + (49 * 60) + 13;
$myTimeMinus = $myTime - $delta;
$myTimePlus  = $myTime + $delta;
echo date('Y-m-d H:i:s', $myTimeMinus);

//2012-06-18 05:14:05

echo date('Y-m-d H:i:s', $myTimePlus);
// 2012-06-19 14:52:31

Respondido 29 Jul 12, 22:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.