Trouver si une heure xx:xx:xx est située entre deux autres heures
dbizier
Messages postés8Date d'inscriptiondimanche 12 août 2007StatutMembreDernière intervention16 août 2007
-
12 août 2007 à 21:19
andalo
Messages postés102Date d'inscriptionlundi 23 avril 2007StatutMembreDernière intervention20 octobre 2012
-
14 août 2007 à 10:44
Bonjour,
j'ai deux timespan que voici:
'16h00 -> soit 4h de l'apres-midi
Private heure1 As New TimeSpan(16, 0, 0)
'02h00 -> soit 2h du matin
Private heure2 As New TimeSpan(2, 0, 0)
Je voudrais faire une petite fonction qui valide si le timespan passé en paramètre se situe entre heure1 et heure2. C'est à dire s'il s'agit d'une heure comprise entre 16hpm et 2ham. Donc 08:00:00, 13:00:00 et 15:00:00 serait exclu.
Quelque chose du genre:
Private Sub estceHeureValide(byval currentTime as timespan) as boolean
If (currentTime >= heure1 ) And (currentTime <= heure2 ) Then
'Moment valide
End If
End Sub
Mais cette fonctione ne marche pas...
Merci de votre aide!
David
A voir également:
Trouver si une heure xx:xx:xx est située entre deux autres heures
dbizier
Messages postés8Date d'inscriptiondimanche 12 août 2007StatutMembreDernière intervention16 août 2007 12 août 2007 à 21:36
Bon, effectivement j'ai codé mon exemple sur le forum rapidement et je n'aurais pas du mettre "as boolean". Cependant, dans mon code j'ai un sub et sans "as boolean" donc oublions cet erreur de ma part.
C'est le if qui n'est pas valide:
If (currentTime >= heure1 ) And (currentTime <= heure2 ) Then
'Moment valide
End If
il n'entre jamais dedans
17h devrait etre moment valide mais 17h n'est pas "currentTime <= heure2"
Julien237
Messages postés883Date d'inscriptionvendredi 3 novembre 2000StatutMembreDernière intervention 3 mars 20097 12 août 2007 à 21:55
Bon alors tu fais deux erreurs :
1) Les TimeSpan sont, comme leurs noms l'indique, des structures décrivant des intervalles de temps, pas des dates, vu ta définition de heure1 et heure2 donnant heure1>heure2, il est impossible de trouver une date telle que (currentTime >= heure1 ) And (currentTime <= heure2) soit vérifié.
Remarquons que le nom currentTime pour un interval n'est pas très judicieux. Il serait plus logique de comparer des dates avec par exemples :
(currentTime >= DateTime.Today.Add(heure1)) and (currentTime <= DateTime.Today.Add(heure2))
Où currentTime est maintenant une date.
Pour utiliser un interval décrivant l'heure de deux heure du lendemain comme j'imagine que tu veux le faire, tu dois alors faire
Private heure2 As New TimeSpan(26, 0, 0)
2) Ce n'est pas vraiment une erreur en soi, mais ta manière de coder n'est pas propre. Une fonction nommée IsSomething ou EstCeQquechose en français, est logiquement, une fonction renvoyant un boolean. Donc, soit tu fais :
'corps appelant
If (EstCeHeureValide(...)) Then
ActionHeureValide
Else
ActionHeureInvalide
End if
Function EstCeHeureValide(...) as Boolean
Return (currentTime >= DateTime.Today.Add(heure1)) And (currentTime <= DateTime.Today.Add(heure2))
End Function
Soit tu change le nom de ta fonction, et tu fais une procédure qui exécutera explicitement l'acion à faire lorsque l'heure est valide.
<hr size="2" width="100%" />Julien.
dbizier
Messages postés8Date d'inscriptiondimanche 12 août 2007StatutMembreDernière intervention16 août 2007 12 août 2007 à 22:25
Merci pour les commentaires Julien! J'en prend bonne note!
Cependant, si je prend ta fonction, soit:
'16h00 -> soit 4h de l'apres-midi
Private heure1 As New TimeSpan(16, 0, 0)
'02h00 -> soit 2h du matin
Private heure2 As New TimeSpan(2, 0, 0)
Function EstCeHeureValide(...) as Boolean
Return (currentTime >= DateTime.Today.Add(heure1)) And (currentTime <= DateTime.Today.Add(heure2))
End Function
et que je lui passe l'heure du moment, soit 22:20:00 cela donnerait:
** Je veux que ma fonction retourne TRUE si l'on est dans l'intervale 16h-2ham et non 2ham-16h. Prendre note aussi que la date n'est pas important (date d'aujoudhui ou non)
Voici ce que j'ai fais et qui semble marché. Pas tres élégant mais bon:
If (currentTime >= 16:00:00 And currentTime <= New TimeSpan(23, 59, 99)) Or (currentTime >= New TimeSpan(0, 0, 0) And currentTime <= 02:00:00) Then
return true
Else
return false
End If
Vous n’avez pas trouvé la réponse que vous recherchez ?
Julien237
Messages postés883Date d'inscriptionvendredi 3 novembre 2000StatutMembreDernière intervention 3 mars 20097 12 août 2007 à 22:32
Ben c'est normal que ca retourne false, après minuit, on est le lendemain :p, tu dois donc écrire
(8/12/2007 22:20:00 PM >= 8/12/2007 4:00:00 PM) And (8/12/2007 22:20:00 PM <= 8/ 13 /2007 2:00:00 AM)
Soulignés les 12, car nous sommes le 12 et non le 13.
Véritable correction en gras :p
Ecris donc heure2 comme (26, 0, 0), ca passera tout seul
dbizier
Messages postés8Date d'inscriptiondimanche 12 août 2007StatutMembreDernière intervention16 août 2007 12 août 2007 à 22:37
Oui, j'aimerais bien mais ces valeurs de références sont "hard codé" dans des documents textes, sous la forme:
02:00:00
Bien sur, je pourais les modifier avant de les traiter. Cependant, dans l'optique ou je n'ai pas besoin de m'encombrer des dates, est-ce que la fonction que j'ai fais:
If (currentTime >= 16:00:00 And currentTime <= New TimeSpan(23,
59, 99)) Or (currentTime >= New TimeSpan(0, 0, 0) And currentTime
<= 02:00:00) Then
return true
Else
return false
End If
te semble acceptable ? "Programmationellement" parlant ? ;)
Julien237
Messages postés883Date d'inscriptionvendredi 3 novembre 2000StatutMembreDernière intervention 3 mars 20097 12 août 2007 à 22:41
Zut, saleté de bug avec IE, je réécris :
Ecrire
If Condition Then
Return True
Else
Return False
End If
Reviens au même que d'écrire :
Return Condition
Qui est nettement plus élégant non ?
Pour ce qui est de ton document texte, l'information est mal codée, tu as deux solutions :
Soit tu modifie la source d'information pour qu'elle ajoute un champs pour le jour relatif, ca deviendrait donc :
0:16:00:00 et 1:02:00:00
Soit tu modifie artificiellement le saut du jour (le "minuit") en disant par exemple qu'on change de jour à 5h du matin. Lorsque tu récolte les infos, tu fais alors
If heure <= new timespan(5,0,0) then heure += new timespan(24,0,0)
Julien237
Messages postés883Date d'inscriptionvendredi 3 novembre 2000StatutMembreDernière intervention 3 mars 20097 13 août 2007 à 23:33
Bah en même temps les opérateurs de comparaisons sont définis pour les dates, pas besoin de s'amuser à les transformer, le problème n'est pas là, notre ami veut comparer des heures et non des dates. Savoir si un moment est entre telle heure et telle heure, peut importe le jour.
andalo
Messages postés102Date d'inscriptionlundi 23 avril 2007StatutMembreDernière intervention20 octobre 2012 14 août 2007 à 09:09
d'accord, mis il me semble bien avoir lu que la gestion du minuit posais problème, donc a mon avis ya pas a tortiller ,il faut considerer la date aussi....