#1 Le 08/01/2013, à 14:43
- Vuel
[PHP] Probléme MkTime et décallage horraire
Bonjour à tous !
Voilà je me retrouve confronté à un problème avec les mktime, je vous explique mon soucis.
Je loue une chambre d'hote à la nuit, pour une ou plusieurs nuits. Je rentre donc dans ma bdd chaque jour où le client doit dormir dans ma chambre.
$mkday = 24*3600 // un jour en mktime
$mkdateDebut = mktime( 0, 0, 0, $mkDateDebut[1], $mkDateDebut[2], $mkDateDebut[0] );
$mkDateFin = mktime( 0, 0, 0, $mkDateFin[1], $mkDateFin[2], $mkDateFin[0]) -$mkday; //ici je soustrais un mkday car c'est la date où le client part, elle ne sera donc pas prise en compte dans ma BDD pour cette réservation.
/* aprés vérification des disponibilités */
for($i=$mkdateDebut; $i<$mkDateFin;$i+=$mkday)
{
/* je rentre ma résa */
}
Le problème et qu'un client à voulut passer la nuit de 31 mars 2013 au 1er Avril 2013, et là surprise, gros bug ...
Lorsque je fais
echo date("Y-m-d", $mkDateDebut)."<br/>";
echo date("Y-m-d", $mkDateFin)."<br/>";
J'obtiens
2013-03-31
2013-03-30
par contre lorsque je fais ça :
$mkdateDebut = mktime( 0, 0, 0, $mkDateDebut[1], $mkDateDebut[2], $mkDateDebut[0] );
$mkDateFin = mktime( 0, 0, 0, $mkDateFin[1], $mkDateFin[2], $mkDateFin[0]) -23*3600;
echo date("Y-m-d", $mkDateDebut)."<br/>";
echo date("Y-m-d", $mkDateFin)."<br/>";
j'obtiens bien :
2013-03-31
2013-03-31
qui est le résultat que j'attends.
Ma question est donc simple après toutes ces explications, comment faire pour prévoir les futurs décalage horaire ? Car effectivement, j'ai testé et en 2014/2015 il n'y a aucun soucis avec cette date là.
Merci de votre attention et de vos potentielles réponses.
Dernière modification par Vuel (Le 08/01/2013, à 14:47)
Hors ligne
#2 Le 08/01/2013, à 15:44
- tiramiseb
Re : [PHP] Probléme MkTime et décallage horraire
Je ne rencontre pas ce problème :
php > $date = mktime( 0, 0, 0, 04, 01, 2012);
php > echo date("Y-m-d", $date)."\n";
2012-04-01
php > echo date("Y-m-d", $date-86400)."\n";
2012-03-31
php > echo date("Y-m-d", $date-86401)."\n";
2012-03-30
Dans le cas en erreur, que donne :
echo date("Y-m-d H:i:s", $mkDateFin)."<br/>";
?
Dernière modification par tiramiseb (Le 08/01/2013, à 15:44)
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#3 Le 08/01/2013, à 16:50
- Vuel
Re : [PHP] Probléme MkTime et décallage horraire
Bonjour,
C'est normal que tu ne rencontre pas cette erreur avec les dates que tu as rentrés étant donné que tu es resté en 2012 . Il m'a fallut un bout de temps pour arriver à cerner le problème. En 2013 il n'y a que 23*3600 entre le 31/03 et le 04/01, le 31 étant le dernier dimanche de Mars.
J'ai élaboré cette fonction pour palier au problème :
function previousTime($mkDebut,$mkFin)
{
$result = 0;
$mkday = 24*3600;
$mkdiff = ($mkFin-$mkDebut)%$mkday;
if($mkdiff == 0)
{
$result = $mkFin - $mkday;
}
else
{
$result = $mkFin - $mkdiff;
}
return $result;
}
(Si il existe une solution plus simple je suis bien sûr preneur).
Cordialement.
Dernière modification par Vuel (Le 08/01/2013, à 16:51)
Hors ligne
#4 Le 08/01/2013, à 16:57
- tiramiseb
Re : [PHP] Probléme MkTime et décallage horraire
Ah merde désolé. Saleté de nouvel an !
Il s'agit en effet simplement du changement d'heure en fait ! Tu as le même comportement en 2012 le 25 mars, en 2014 le 30 mars...
Une proposition : tu peux réduire de 12 heures seulement, puis extraire uniquement les champs correspondant à la date en gardant les champs correspondant à l'heure à zero...
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#5 Le 08/01/2013, à 17:03
- tiramiseb
Re : [PHP] Probléme MkTime et décallage horraire
J'ajouterais aussi que, si tu te bases sur la date en te disant que de toute façon l'heure, la minute et la seconde restent à zero, tu risque d'avoir des problèmes avec les secondes intercalaires.
http://fr.wikipedia.org/wiki/Seconde_intercalaire
Les jours où il y a une seconde intercalaire, la journée dure 86401 secondes et non 86400 secondes, avec ta soustraction tu te retrouves donc au jour précédent à 00:00:01 et non à 00:00:00.
Et si tu t'en fous complètement des champs "heure", "minute" et "seconde", ça voudrait dire qu'en plus de n'avoir pas de problème avec les secondes intercalaires tu n'aurais aucun souci non plus à soustraire 12 heures, 1 heure, 10 minutes ou 1 minute (*) au lieu de 24 heures, ce qui résoudrait également le problème qui t'a fait ouvrir ce fil de discussion
(*): mais surtout pas une seconde
Dernière modification par tiramiseb (Le 08/01/2013, à 17:04)
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#6 Le 08/01/2013, à 17:23
- Vuel
Re : [PHP] Probléme MkTime et décallage horraire
Effectivement j'avais pas du tout pensée à réduire la durée à 12heures, il ferait des testes et je verrais quelle solution fonctionne le mieux. Dans la BDD il n'y a pas les heures/minutes/seconde. Je sais donc pas du tout ce que ça va donner.
Hors ligne