2009-07-02 9 views
5

J'ai un objet Date (de Pear) et je veux soustraire un autre objet Date pour obtenir le décalage horaire en secondes.Calculez la différence entre la date et l'heure en PHP

J'ai essayé quelques petites choses mais la première me donnait juste la différence en jours, et la seconde me permettait de convertir un temps fixe en timestamp unix mais pas l'objet 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; 

** Remarque ** La différence sera toujours inférieure à 24 heures.

+0

est le format de sortie de $ maintenant le même que la chaîne que vous nourrissez dans strtotime()? ie "aaaa/mm/jj H: i" – Mathew

+1

Probablement c'est seulement moi mais je n'arrive pas à trouver de description pour une classe "Date" dans la documentation PHP. De quelle bibliothèque s'agit-il? –

+0

Pourquoi ne convertissez-vous qu'un seul dans un autre fuseau horaire? Ne devriez-vous pas utiliser l'heure locale ou les deux sur la cible? –

Répondre

1

encore donné des valeurs un peu mal, mais étant donné que j'avoir une ancienne version de PEAR Date de autour, peut-être que cela fonctionne pour vous ou vous donne une indication sur la façon de corriger :)

<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

Etes-vous sûr que la conversion de l'objet Date poire -> chaîne -> horodatage fonctionnera de manière fiable? C'est ce qui se fait ici:

$start = strtotime($now); 

Comme alternative, vous pouvez obtenir l'horodatage comme celui-ci selon la documentation

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

Pour le faire sans poire, de trouver les secondes « jusqu'à 17: 00 vous pouvez faire:

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

Non testé, mais il devrait faire ce que vous avez besoin.

0

Je ne pense pas que vous devriez passer l'ensemble de l'objet Date à strtotime. Utilisez l'un d'entre eux à la place;

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

ou

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

Peut-être que certaines personnes veulent avoir le décalage horaire de la façon Facebook. Il « Il y a 2 jours » vous indique « une minutes il y a », ou, etc ... Voici mon code:

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"; 

    } 
Questions connexes