2017-09-18 6 views
0

si j'ai deux valeurs timedelta telles que 21:00:00 (PM), heure de début et 03:00:00 (AM) comme heure de fin et je souhaite comparer 23:00:00 dans cette plage, voir si elle tombe entre ces deux, sans avoir la valeur de la date, comment pourrais-je le faire?Vérification si timedelta valeur est à portée Donc après minuit

Ainsi, bien que dans cet exemple, il verra 23:00:00 plus grand que 21:00:00 il ne verra pas 23:00:00 moins 03:00:00, ce qui est mon problème. Je dois être capable de comparer l'heure sur un cercle de 24 heures en utilisant timedelta ou une conversion loin de timedelta est très bien.

Remarque: Les plages horaires de début et de fin peuvent changer, donc tout peut être AM/PM. Je ne peux donc pas simplement ajouter un jour à l'heure de fin par exemple.

+0

Vérifiez si diff (23, 21) est inférieur à diff (23, 3)? –

+0

L'heure de fin est-elle garantie dans les 24 heures suivant l'heure de début? Sinon, ça peut devenir compliqué. Si l'heure de début est le lundi à 23 heures et l'heure de fin est mercredi à 3 heures du matin, alors un temps arbitraire dit 11 heures tombe entre eux, aussi longtemps que vous parlez de 11 heures mardi. Si cela est possible, vous aurez besoin de quelque chose de plus que les heures de début et de fin. –

+0

@DavidJenkins oui, ce ne sera que dans une période de 24 heures, tout le temps. Donc, quand vous choisissez un temps arbitraire, c'est-à-dire 15 heures, mais votre plage (sous réserve de changement) ne dit que 6 heures du matin à 12 heures, cela ne devrait pas être à portée. – sgript

Répondre

0

Vous devriez probablement penser à utiliser datetime.time au lieu de datetime.timedelta pour les temps absolus. Néanmoins, voici quelque chose qui devrait fonctionner compte tenu de votre situation actuelle.

def is_in_time_range(start, end, time): 
    if end < start: 
     return start < time or end > time 
    return start < time < end 


from datetime import timedelta 

>>> is_in_time_range(timedelta(hours=21), timedelta(hours=3), timedelta(hours=23)) 
True 
>>> is_in_time_range(timedelta(hours=21), timedelta(hours=3), timedelta(hours=4)) 
False 
>>> is_in_time_range(timedelta(hours=21), timedelta(hours=3), timedelta(hours=2)) 
True 

Si vous décidez d'utiliser à la place datetime.time comme je l'ai suggéré, cette solution fonctionne encore:

from datetime import time 
>>> is_in_time_range(time(hour=21), time(hour=3), time(hour=23)) 
True 
>>> is_in_time_range(time(hour=21), time(hour=3), time(hour=4)) 
False 
>>> is_in_time_range(time(hour=21), time(hour=3), time(hour=2)) 
True 
0

Il devient "difficile" que lorsque endtime est plus petite que starttime (IE, le lendemain) . Mais, vous pourriez avoir un test, si c'est le cas, ajoutez 12 heures à tous les trois articles, alors maintenant vous pouvez facilement tester et vérifier que 11h est entre 9h et 15h.