2009-07-14 11 views
12

J'ai une table avec des valeurs d'horodatage comme:Ajouter 13 heures à un horodatage

 
    2009-07-14 02:00:00 

je dois les afficher lors de l'exécution de 13 heures ajoutées, comme:

 
    2009-07-14 15:00:00 

Quelle est la plus simple façon de le faire en PHP?

+0

07-14 02:00 à 07-15 13:00 est 35 heures, pas 13. Comment comptez-vous? –

+0

ahh ouais c'était juste un exemple .. mon mauvais! J'ai juste besoin de savoir comment ajouter x heures à un horodatage (pas l'heure actuelle)! – aalaap

+0

Si quelqu'un est toujours à la recherche de cela, le meilleur moyen est la méthode de Richy B., à savoir: '$ date = new DateTime ('2009-07-14 02:00:00'); $ date-> add (new DateInterval ('P13H')); ' – aalaap

Répondre

1

Je sais que cela a été demandé depuis longtemps et je l'avais déjà choisi la réponse, mais je pense qu'il est important de nouveaux utilisateurs dans une direction plus moderne et correcte, qui utilise le fantastique Carbon bibliothèque:

>>> Carbon\Carbon::parse('2009-07-14 02:00:00') 
... ->addHours(13) 
... ->format('Y-m-d H:i:s'); 
=> Carbon\Carbon {#869 
    +"date": "2009-07-14 15:00:00.000000", 
    +"timezone_type": 3, 
    +"timezone": "UTC", 
    } 

carbone non seulement il est plus simple d'effectuer le calcul demandé, il vous protège également contre les erreurs potentielles que vous pouvez faire tout manuellement en essayant de faire la même chose.

Le shell de l'exemple de sortie ci-dessus est Laravel Tinker. Laravel est livré avec du carbone, donc la déclaration ci-dessus fonctionne out-of-the-box. Si vous n'utilisez pas un framework PHP moderne, vous devriez l'être. Il est facile d'ajouter du carbone.

1

vous pouvez utiliser http://de3.php.net/manual/en/function.strptime.php pour le convertir en un horodatage unix. Ensuite, vous pouvez facilement ajouter 13 * 60 * 60 à cela et utiliser http://de3.php.net/manual/en/function.date.php pour le convertir en un horodatage que vous le souhaitez.

une autre façon serait par la fonction d'exploser, mais je pense que cela pourrait être plus compliqué parce que vous devez regarder si les jours/mois/années changement et d'autres choses

+0

ouais je ne veux pas le faire manuellement sauf si je dois le faire. Lemme essayez l'autre méthode que vous avez mentionnée. – aalaap

+0

+1, pensé pour le format de date donné, strtotime fonctionnerait tout aussi bien –

+0

-1, vous ne devriez pas utiliser l'arithmétique de base pour les calculs de temps. En raison de l'heure d'été, certains insectes se faufilent.J'ai écrit à ce sujet: http://igstan.blogspot.com/2008/12/how-not-to-make-dates-in-php.html –

2

Pouvez-vous faire l'ajouter qu'il sort de la base de données?

SELECT ... DateAdd(hh, 13, DateField) AS DateField 

(SQL Server)

+0

trop coûteux sur la fin du serveur, ne pensez-vous pas? – aalaap

+1

À mon humble avis, celui-ci est meilleur que les données sont "correctes" dès qu'il revient de la requête. Il n'y a aucune possibilité de faire autre chose en cas d'accident ou d'oublier de le convertir. – CaseySoftware

18

Je sais que

date("Y-M-d H:i:s", strtotime($timestamp_from_array) + 13 * 3600); 

sentait mauvais, mais il vous donnera une idée.

strtotime convertit la chaîne d'horodatage en valeur d'horodatage, puis nous ajoutons les heures et la convertissons au format d'horodatage dans le tableau avec la fonction date.

Mais je suppose que ce que vous voulez vraiment, c'est utiliser time zones.

Editer: igstan est correct, vous devriez également faire attention aux changements d'heure d'été entre ces décalages.

+0

bingo! Ça y est! – aalaap

15

Il y a beaucoup de problèmes avec les fuseaux horaires et l'heure d'été lors de l'utilisation de l'arithmétique de base pour les calculs de temps. La meilleure solution est de s'appuyer sur les propres fonctions date/heure de PHP, comme strtotime() ou mktime(). J'ai écrit environ DST problems on my blog.

echo date('Y-M-d H:i:s', strtotime('2009-07-14 02:00:00 + 13 hours')); 
1

Vous avez une table avec les horodatages?Si elle est une base de données MySQL, vous pouvez simplement le faire dans la base de données en utilisant addtime: SELECT ADDTIME('2007-12-31 23:59:59.999999', '1 1:1:1.000002');

Si vous utilisez le Zend Framework PHP, vous pouvez faire quelque chose comme:

$date=new Zend_Date(Array('year'=>$iYear,'month'=>$iMonth,'day'=>$iDay)); 
// changes $date by adding 12 hours 
$date->add('12:00:00', Zend_Date::TIMES); 

Sinon, vous pouvez le faire en utilisant les fonctions de PHP4 natives telles que: [plus rapide, moins précis: ne tient pas compte de la zone secondes de saut/temps change, etc.]

$datestamp=strtotime('2009-07-14 02:00:00'); // It'll probably be better using mktime 
$datestamp=$datestamp+(60*60*13); // 60 seconds times 60 minutes times 13 hours 

ou [plus lent, plus précis]

$datestamp = strtotime('2009-07-14 02:00:00'); // It'll probably be better using mktime 
    $newDate = date('Y-m-d H:i:S', mktime(date('H',$datestamp)+13, date('i',$datestamp), date('s',$datestamp), date('m',$datestamp), date('d',$datestamp), date('Y',$datestamp))); 

ou, si vous utilisez PHP 5 en utilisant les Datetime fonctions

$date = new DateTime('2009-07-14 02:00:00'); 
date_add($date, new DateInterval("P13H")); 
0
<?php 
echo date('Y-m-d H:i:s', strtotime('+13 hours', strtotime('2009-07-14 02:00:00'))); 
?> 
-1

Disons que vous ramassez un champ de date spécifique de votre table appelée "datetime_field" de ID de ligne 3000. Ce serait aussi simple que ça!

SELECT *, ADDTIME(`datetime_field`,'0 13:00:00') as new_datetime 
FROM `table_name` 
WHERE id = 3000 

Cela peut évidemment être utilisé dans les requêtes de mise à jour aussi si l'on voulait mettre à jour, bien sûr. En variante, si vous étiez en train d'ajouter 13 heures (différences de fuseau horaire) à la requête. On utiliserait MySQL MAINTENANT() comme heure d'origine et il suffirait d'ajouter l'heure comme ci-dessus. Sélectionner, mettre à jour ou insérer, c'est la même méthodologie! Ce serait:

SELECT *, NOW() as current_datetime, 
      ADDTIME(NOW(),'0 13:00:00') as new_datetime 
FROM `table_name` 
WHERE id = 3000 

Restez simple et rapide!

: o)

Questions connexes