2010-09-20 20 views
4

J'ai 2 horodatages unix, Im en fuseau horaire AsiaPacific/Auckland (GMT + 12, DaylightSavings = GMT + 13)Comment calculer l'intervalle entre 2 horodatages unix en php SANS diviser par 86400 (60 * 60 * 24)

Je souhaite calculer le nombre d'intervalle de jours entre deux horodatages, l'un à l'intérieur de l'heure d'été et l'autre non.

Mes dates par exemple sont

7 Feb 2009 (1233925200)-21 September 2010 (1284985360) (non compris 21) voir ici, il dit 591 jours: http://www.timeanddate.com/date/durationresult.html?d1=7&m1=2&y1=2009&d2=21&m2=9&y2=2010

permet de calculer, voici mes horodatages (les deux sont basés sur Auckland 00:00 heure)

1284985360-1233925200 = 51060160 
51060160/86400 = 590.974 

Alors oui je besoin 591. Je ne veux pas utiliser la solution « arrondir »

est-il une méthode fiable comme strtotime, mais pour le calcul des intervalles de date, de préférence qui ne avez pas besoin php 5.3+ minimum

EDIT: nécessité de clarifier, im en utilisant StrToTime pour obtenir ces horodatages, je pensais que était UTC

EDIT2: Je crois que j'ai trouvé le problème. Alors que ma date de fin était le 21 septembre, j'utilisais time() pour obtenir ma date de fin, et time() renvoyait le mauvais horodatage, peut-être que cela ne rendait pas compte du GMT + 12, même si je passais time() à strtotime (date ('d M Y')) et il a renvoyé l'horodatage correct! eureka 591 jours

Cheers!

+0

Pourquoi êtes-vous réticent à utiliser la solution évidente, simple division? – You

+1

@Vous: parce que cela donne un mauvais résultat? –

+0

@Michael: Non, ce n'est pas le cas. OP déclare que cela fonctionne, mais il "ne veut pas utiliser cette solution". – You

Répondre

3

Calculer le nombre de jours complets pour les deux horodatages avant de calculer la différence:

floor(1284985360/86400) - floor(1233925200/86400) 

Le résultat est votre toujours un entier.

Et puisque vous utilisez strtotime pour obtenir ces horodateurs, indiquez le temps 00:00:00+0000 pour obtenir toujours un multiple de 86400:

strtotime($str.' 00:00:00+0000') 
+1

Seule solution raisonnable jusqu'ici. Bon travail downvoter. – Mchl

+0

@Gumbo Monsieur, vous êtes un génie. C'est finalement le moyen de faire le calcul "Days between" en utilisant un horodatage unix, sans la classe 'DateTime' (pour ceux d'entre nous sans PHP5.3). – Shackrock

0

Diviser par 86400 est fiable et facile. Je ne connais aucune fonction particulière et je ne vois pas pourquoi ils existeraient.

+0

Dans 5.3, le nouveau DateTime ($ t1) -> diff (nouveau DateTime ($ t2)) est facile et clair. Mais le PO a demandé une solution pré-5.3. –

+0

ce que Daniel a dit – samsong

+1

C'est pourquoi il faut sauvegarder les horodatages en UTC. – You

2

Un horodatage Unix (POSIX) correct est en UTC, vous commencez donc avec des valeurs qui sont déjà incorrectes. Vous êtes confronté à une bataille difficile, car les API supposent généralement que les horodatages sont en UTC. Il serait préférable de résoudre ce problème, après quoi la simple division donnerait le bon résultat.

+0

Je n'ai aucune idée si son UTC, im juste courir STRTOTIME, donc si vous dites strtotime génère un GMT au lieu de UNIX (POSIX) alors oui je devine que je suis foutu. Vous semblez bien informé, je suppose que vous dites qu'il n'y a pas de moyen fiable autre que les méthodes 5.3+ ??? – samsong

+0

@fatjoze: Pour être exact, il est faux de dire que strtotime génère un horodatage dans un fuseau horaire spécifique. Il génère toujours l'UTC, la question est de savoir quel fuseau horaire il utilise pour interpréter le paramètre de date lisible par l'homme. Et il semble que ce soit incorrect dans votre cas car les horodatages que vous listez ne correspondent pas à 00:00 en heure UTC ou Auckland. Vous pouvez définir le fuseau horaire par défaut via date_default_timezone_set() –

+0

@fatjoze: À première vue, vos horodateurs semblent correspondre à 00:00 à Sydney - est-ce possible que c'est là que se trouvent vos serveurs et ce qu'ils sont configurés pour utiliser comme fuseau horaire par défaut ? –