How do I check if a given datetime object is “between” two datetimes?

前端 未结 4 1946
耶瑟儿~
耶瑟儿~ 2021-02-14 12:05
my_event = Event.objects.get(id=4)
current_time = datetime.datetime.now()

How do I do check if my current time is between them?

my_eve         


        
相关标签:
4条回答
  • 2021-02-14 12:22

    you can use a simple if comparing three dates, like this

    if date1 < yourdate < date2:
      ...do something...
    else:
      ...do ...
    
    0 讨论(0)
  • 2021-02-14 12:32

    The datetimes getting tested need to all naive (no timezone) or all aware (timezone). An exception should occur if you try to compare aware and naive. If all the datetimes are aware the timezones don't actually have to match that appears to be taken into consideration when comparing.

    e.g.

    class RND(datetime.tzinfo):
        """ Random timezone UTC -3 """
    
        def utcoffset(self, dt):
            return datetime.timedelta(hours=-3)
    
        def tzname(self, dt):
            return "RND"
    
        def dst(self, dt):
            return datetime.timedelta(hours=0)
    
    
    april_fools = datetime.datetime(year=2017, month=4, day=1, hour=12, tzinfo=pytz.UTC)
    
    random_dt = datetime.datetime(year=2017, month=4, day=1, hour=9, tzinfo=RND())
    
    random_dt == april_fools
    # True as the same time when converted back to utc.
    
    # Between test of 3 naive datetimes
    start_spring = datetime.datetime(year=2018, month=3, day=20)
    end_spring = datetime.datetime(year=2018, month=6, day=21)
    april_fools = datetime.datetime(year=2018, month=4, day=1)
    
    
    if start_spring < april_fools < end_spring:
        print "April fools is in spring"
    
    0 讨论(0)
  • 2021-02-14 12:34

    Your answer is the way to go as long as start_time and end_time don't have an associated tzinfo class. You can't directly compare a naive datetime with a timezoned-datetime.

    0 讨论(0)
  • 2021-02-14 12:34

    I know old, but since this is so high on Google results, answers here don't take into consideration two cases:

    1. If your time equals either of your range, ie your range is 6-8 and it is 6.
    2. If your time range is say 18:00 to 6:00, valid range; however 19:00 would not match.

    I wrote a function to take care of time comparison, hope this helps anyone viewing this old question.

    def process_time(intime, start, end):
        if start <= intime <= end:
            return True
        elif start > end:
            end_day = time(hour=23, minute=59, second=59, microsecond=999999)
            if start <= intime <= end_day:
                return True
            elif intime <= end:
                return True
        return False
    
    0 讨论(0)
提交回复
热议问题