Trouver si une heure xx:xx:xx est située entre deux autres heures

dbizier Messages postés 8 Date d'inscription dimanche 12 août 2007 Statut Membre Dernière intervention 16 août 2007 - 12 août 2007 à 21:19
andalo Messages postés 102 Date d'inscription lundi 23 avril 2007 Statut Membre Dernière intervention 20 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

14 réponses

Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
12 août 2007 à 21:28
Pas étonnant, t'as mis une procédure (Sub)... Pour faire un fonction, utilise le mot-clé Function :

Private Function EstCeHeureValide(currentTime as TimeSpan) as Boolean
   Return (currentTime >= heure1 ) And (currentTime <= heure2)
End function

<hr size="2" width="100%" />Julien.
0
dbizier Messages postés 8 Date d'inscription dimanche 12 août 2007 Statut Membre Dernière intervention 16 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"
0
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
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.
0
dbizier Messages postés 8 Date d'inscription dimanche 12 août 2007 Statut Membre Dernière intervention 16 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:

Function EstCeHeureValide(...) as Boolean

   Return (8/13/2007 22:20:00 PM >= 8/12/2007 4:00:00 PM) And (8/13/2007 22:20:00 PM <= 8/12/2007 2:00:00 AM)

End Function

Cela ne retournerait FALSE

** 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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
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

<hr width ="100%" size="2" />Julien.
0
dbizier Messages postés 8 Date d'inscription dimanche 12 août 2007 Statut Membre Dernière intervention 16 août 2007
12 août 2007 à 22:32
P.S. J'ai écris '16:00:00' mais je veux dire new timespan(16,00,00). Je veux juste sauver de l'espace dans le post.
0
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
12 août 2007 à 22:36
<hr size="2" width="100%" />

Julien.
0
dbizier Messages postés 8 Date d'inscription dimanche 12 août 2007 Statut Membre Dernière intervention 16 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 ? ;)
0
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
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)

Je vais aller dormir, a demain...

<hr size="2" width="100%" />Julien.
0
andalo Messages postés 102 Date d'inscription lundi 23 avril 2007 Statut Membre Dernière intervention 20 octobre 2012
13 août 2007 à 21:53
j'ai ptet une solution des plus simple
tout transformer en entier long, tout concatener de 'lannée a la seconde

AAMMJJHHMMSS

ca fais un gros nombre mais niveau comparaison t'es a l'aise
0
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
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.

<hr width="100%" size="2" />Julien.
0
andalo Messages postés 102 Date d'inscription lundi 23 avril 2007 Statut Membre Dernière intervention 20 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....
0
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
14 août 2007 à 10:01
Oui il faut considérer une date, mais avec un jour relatif, comme je lui ai dit de faire en ajoutant 24h au timespan de comparaison.

<hr width="100%" size="2" />Julien.
0
andalo Messages postés 102 Date d'inscription lundi 23 avril 2007 Statut Membre Dernière intervention 20 octobre 2012
14 août 2007 à 10:44
j'ia pas des méthodes trés pro, je le conçois, c'est juste que perso je trouvais ca plus simple au final.
0
Rejoignez-nous