2009-09-18 5 views
0

Ma base de données contient des variables de date, de début et de fin. Dans mon code, je prends le début et eux comme l'utilisateur les sélectionne, et les convertir en horodatages comme si (tout dans une boucle foreach) ..La validation de l'horodatage se chevauche avec PHP

$selectionDate = strtotime($timeQry['date']); 
$startTimes[]  = strtotime($timeQry['start'],$selectionDate); 
$endTimes[]   = strtotime($timeQry['end'],$selectionDate);  

Cela me donne les heures de début et de fin correctes en tant que timestamp. J'ai alors une instruction logique pour la valider et de voir si l'un des temps sélectionnés se chevauchent ....

if(($startTimes[1] < $startTimes[0]) && ($endTimes[1] > $startTimes[0]) || 
($startTimes[1] > $startTimes[0]) && ($startTimes[1] < $endTimes[0])) 
{ 
    echo "overlap" 
} 

Cela fonctionne bien la plupart du temps, si l'un des temps de la fin si après 12 minuit (par exemple 02:00), cet horodatage sera plus petit que l'heure de début car le code utilise la date de début de la réservation. Cela provoque l'échec de la logique et le chevauchement est manqué.

J'ai pensé à faire:

if(($endTimes[$k] >= $selectionDate)) 
{ 
    $endTimes[]  = strtotime($timeQry['end'],$newDate+ 1253574000); 
} 
else 
{ 
    $endTimes[]  = strtotime($timeQry['end'],$selectionDate); 
} 

    //...run same logic query 

Ce qui crée une nouvelle date qui est un jour plus tard. Mais je ne pense pas que ce soit la bonne façon de s'y prendre. Si quelqu'un peut m'aider, je serais très reconnaissant. Ça me fait un peu me gratter la tête celui-là! Merci beaucoup

Répondre

1

Pourquoi ne pas utiliser DATETIME pour les deux colonnes, en évitant tout jonglage.

+0

Yeh J'ai réalisé que le design aurait dû être meilleur. J'étais nouveau dans ce genre de choses à l'époque. Je peux le changer à l'avenir, mais pour l'instant, j'ai besoin d'obtenir ce tri en premier – whamo

0

Je pense que vous avez presque, mais cela peut être une approche plus agréable:

while(/* iterate */) { 
    //... 
    $selectionDate = strtotime($timeQry['date']); 
    $startTime = strtotime($timeQry['start'], $selectionDate); 
    $endTime = strtotime($timeQry['end'], $selectionDate); 
    if($endTime < $startTime) { 
     $endTime += 86400; 
    } 
    $startTimes[] = $startTime; 
    $endTimes[] = $endTime; 
}  

Mais comme mentionné cemkalyoncu vous devez utiliser deux horodatages indépendants, au lieu de trois les « demi ». Je ne connais pas votre application, mais l'utilisation de deux horodatages complets couvre également les cas où la différence de temps est supérieure à 24 heures. Cela ne fonctionnera pas avec votre configuration actuelle.

+0

Bravo pour l'idée. Donc, vous ajoutez 24 heures si l'heure de fin est plus petite que l'heure de début. Quand vous dites que je devrais utiliser datetime pour chaque colonne, cela signifierait que l'ocode expliquerait le changement après minuit? Donc je n'aurais pas besoin d'ajouter 24 heures? – whamo

+0

Si vous utilisez 'datetime', un entier contenant l'horodatage UNIX ou tout autre horodatage (pseudo-) unique, vous n'avez pas besoin d'ajouter 24 heures, car chaque horodatage contient la date et l'heure complètes, ne nécessitant donc aucune autre distinction . – Koraktor

Questions connexes