2009-07-02 13 views
5

Tengo un objeto Date (de pera) y quieren restar otro objeto Date para obtener la diferencia de tiempo en segundos.Calcular la diferencia entre fecha/horas en PHP

que han intentado algunas cosas, pero el primero sólo me dio la diferencia en días, y la segunda me permitiría convertir un tiempo fijo de marca de tiempo Unix, pero no el objeto Date.

 $now = new Date(); 
     $tzone = new Date_TimeZone($timezone); 
     $now->convertTZ($tzone); 
     $start = strtotime($now); 
     $eob = strtotime("2009/07/02 17:00"); // Always today at 17:00 

     $timediff = $eob - $start; 

** Nota ** Siempre será menos de 24 horas de diferencia.

+0

es el formato de salida de $ ahora lo mismo que la cadena que se introduce en strtotime()? es decir, "aaaa/mm/dd H: i" – Mathew

+1

Probablemente es sólo a mí, pero no puedo parecen capaces de encontrar la descripción de una clase "fecha" en la documentación de PHP. ¿De qué biblioteca es? –

+0

¿Por qué convierte solo uno de ellos a otra zona horaria? ¿No deberías usar ambos como hora local o ambos en el TZ objetivo? –

Respuesta

1

Aún dio valores algo mal, pero teniendo en cuenta que tienen una versión antigua de PERA Fecha alrededor, tal vez funciona para usted o le da una pista sobre cómo solucionar :)

<pre> 
<?php 
    require "Date.php"; 

    $now = new Date(); 
    $target = new Date("2009-07-02 15:00:00"); 

    //Bring target to current timezone to compare. (From Hawaii to GMT) 
    $target->setTZByID("US/Hawaii"); 
    $target->convertTZByID("America/Sao_Paulo"); 

    $diff = new Date_Span($target,$now); 

    echo "Now (localtime): {$now->format("%Y-%m-%d %H:%M:%S")} \n\n"; 
    echo "Target (localtime): {$target->format("%Y-%m-%d %H:%M:%S")} \n\n"; 
    echo $diff->format("Diff: %g seconds => %C"); 
?> 
</pre> 
0

¿Seguro que la conversión de pera objeto Date -> string -> marca de tiempo funcionará de forma fiable? Eso es lo que se está haciendo aquí:

$start = strtotime($now); 

Como alternativa, se puede obtener la marca de tiempo como esta de acuerdo con el documentation

$start = $now->getTime(); 
0

Para hacerlo sin la pera, para encontrar los segundos 'hasta 17: 00 usted puede hacer:

$current_time = mktime(); 
$target_time = strtotime (date ('Y-m-d'. ' 17:00:00')); 
$timediff = $target_time - $current_time; 

No probado, pero debe hacer lo que necesita.

0

no creo que debe estar pasando todo el objeto Date a strtotime. Use uno de estos en su lugar;

$start = strtotime($now->getDate()); 

o

$start = $now->getTime(); 
0

Tal vez algunas personas quieren tener la diferencia de tiempo de la forma en facebook. Se le dice "hace un minuto", o "hace 2 días", etc ... Aquí está mi código:

function getTimeDifferenceToNowString($timeToCompare) { 

     // get current time 
     $currentTime = new Date(); 
     $currentTimeInSeconds = strtotime($currentTime); 
     $timeToCompareInSeconds = strtotime($timeToCompare); 

     // get delta between $time and $currentTime 
     $delta = $currentTimeInSeconds - $timeToCompareInSeconds; 

     // if delta is more than 7 days print the date 
     if ($delta > 60 * 60 * 24 *7) { 
      return $timeToCompare; 
     } 

     // if delta is more than 24 hours print in days 
     else if ($delta > 60 * 60 *24) { 
      $days = $delta/(60*60 *24); 
      return $days . " days ago"; 
     } 

     // if delta is more than 60 minutes, print in hours 
     else if ($delta > 60 * 60){ 
      $hours = $delta/(60*60); 
      return $hours . " hours ago"; 
     } 

     // if delta is more than 60 seconds print in minutes 
     else if ($delta > 60) { 
      $minutes = $delta/60; 
      return $minutes . " minutes ago"; 
     } 

     // actually for now: if it is less or equal to 60 seconds, just say it is a minute 
     return "one minute ago"; 

    } 
Cuestiones relacionadas