【问题标题】:How to check in python if I'm in certain range of times of the day?如果我在一天中的特定时间范围内,如何签入 python?
【发布时间】:2013-09-18 23:29:51
【问题描述】:

我想在 python 中检查当前时间是否在两个端点之间(例如,上午 8:30 和下午 3:00),而与实际日期无关。就像,我不在乎完整的日期是什么;只是一个小时。当我使用strptime 创建datetime 对象来指定时间时,它输入了一个虚拟日期(我认为是1900 年?),这不是我想要的。我可以使用像(hour == 8 and minute >= 30) or (9 <= hour < 15) 这样笨拙的布尔表达式,但这似乎不太优雅。完成此任务的最简单和最 Pythonic 的方法是什么?

再扩展一点,我真正想要的是能告诉我它是否在这个时间范围内,以及它是工作日的东西。当然我可以使用0 <= weekday() <= 4 来破解它,但可能有更好的方法。

【问题讨论】:

    标签: python datetime


    【解决方案1】:

    datetime 对象有一个名为time() 的方法,它返回一个time 对象(没有日期信息)。然后,您可以使用普通的 <> 运算符比较 time 对象。

    import datetime
    import time
    timestamp = datetime.datetime.now().time() # Throw away the date information
    time.sleep(1)
    print (datetime.datetime.now().time() > timestamp) # >>> True (unless you ran this one second before midnight!)
    
    # Or check if a time is between two other times
    start = datetime.time(8, 30)
    end = datetime.time(15)
    print (start <= timestamp <= end) # >>> depends on what time it is
    

    如果您还想检查工作日,您建议的代码可能是最有效的方法,但在这种情况下,您可能不想丢弃原始的 datetime 对象。

    now = datetime.datetime.now()
    if 0 <= now.weekday() <= 4:
        print ("It's a weekday!")
    print (start <= now.time() <= end) # with start & end defined as above
    

    【讨论】:

    • 是的,但是日期中的因素,这是我想忽略的。它也不会在一天中的几个小时内进行测试。我想要的是,在中午 12:00 运行代码应该总是返回 True,而在 18:00 运行它应该总是返回 False,不管它是哪一天。编辑:您的编辑解决了这个问题。或者也许它已经是正确的。谢谢!
    • @limp_chimp 这完全忽略了这一天,只比较了time 对象。我在示例中添加了一个额外的部分,以显示当前时间对固定端点的真实测试。
    • 查看我的代码以获取完整示例。 .time() 丢弃 datetime 的日期部分,只留下时间部分。
    • 只是比较开始
    • @nehemiahjacob 跨越到另一天显然不是 OP 问题的一部分,因此包含该逻辑会引入不必要的复杂性。 “不考虑实际日期”比较时间的唯一合理方法是假设所有给定时间都发生在同一(任意)日期。如果你不能做出这样的假设,你就不能对无日期时间戳之间的关系说任何有意义的事情。
    【解决方案2】:
    from datetime import datetime, time
    now = datetime.now()
    if 0 <= now.weekday() <= 4:
        print "it's a weekday"
        if time(8, 30) <= now.time() <= time(15):
            print "and it's in range"
    

    【讨论】:

    • 可以吗?当然。如果您对某些事情感到困惑,请问 - 对我来说看起来不言自明;-),并且 OP 证明他对日期时间功能有合理(如果不完整)的工作知识。
    • 只是询问,因为这出现在 VLQ 队列中,而我在队列中仅代码答案的标准程序是留下该评论。
    【解决方案3】:
    >>> import datetime
    >>> now = datetime.datetime.now()
    >>> now
    datetime.datetime(2013, 9, 19, 3, 39, 38, 459765)
    >>> 0 <= now.weekday() <= 4
    True
    >>> datetime.time(hour=8, minute=30) <= now.time() <= datetime.time(hour=15)
    False
    

    【讨论】:

      【解决方案4】:

      我不知道您是如何获得开始和结束时间的,但如果您将其限制为一天,请确保开始时间早于结束时间。例如,如果您有开始时间 = 1800 和结束时间 = 1200,那么您将找不到那一天之间的任何时间。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-08
        • 1970-01-01
        • 1970-01-01
        • 2017-11-18
        相关资源
        最近更新 更多