【问题标题】:Python - Is current time within two datetime valuesPython - 当前时间在两个日期时间值内
【发布时间】:2018-06-05 11:16:49
【问题描述】:

我已经在这里环顾了一段时间,尝试了所有不同类型的公认答案,但它们与我自己的需求太无关了,而且 90% 需要静态输入当前日期,这是我不想做的事情

上下文

很简单。

获取西班牙的当前时间。

已经设置了一个变量,这是一个约定的开始时间。

已经设置了一个变量,这是一个约定的结束时间。

如果西班牙的当前时间在起止时间之间,则继续保存日志

线程检查了我的问题的解决方案

由于日期时间的静态类型,所有无用、被否决​​或不相关

Python current time

Compare dates Python

Convert string into datetime

Compare date and datetime

Check if time is between two days

Convert string into datetime

Compare if datetime.timedelta is between two values

到目前为止的代码

now_time_uk = datetime.datetime.now()
current_time_spain = now_time + datetime.timedelta(hours=1)
start = datetime.time(10, 50)
end = datetime.time(16, 00)

if current_time_spain >= start or current_time_spain <= end:
    print('Start logging')
else:
    print('No need to log')

上面的代码是从 S.O 上的一个线程中提取的,这是一个公认的答案,当我运行它时,它给出了一个 TypeError

TypeError: can't compare datetime.datetime to datetime.time

接受的答案代码

now_time_uk = datetime.datetime.now()
print(now_time_uk)
current_time_spain = now_time_uk + datetime.timedelta(hours=1)
start = datetime.time(10, 50)
end = datetime.time(17, 00)
print(current_time_spain.time())

if current_time_spain.time() >= start and current_time_spain.time() <= end:
    print('Start logging')
else:
    print('No need to log')

【问题讨论】:

    标签: python datetime


    【解决方案1】:

    就像错误所说的那样,您正在尝试将 datetime 对象与 time 对象进行比较,这是不可能的...幸运的是,datetime 对象具有用于转换为 time 对象的内置方法,并且是.time()。所以你可以替换:

    if current_time_spain >= start or current_time_spain <= end:
    

    if current_time_spain.time() >= start or current_time_spain.time() <= end:
    

    它应该可以工作。另一种方法是从一开始就将current_time_spain 设置为time 对象,或者另一种选择是将startend 时间设置为datetime 对象而不是time

    【讨论】:

    • 这是否足以涵盖结束时间在不同日期的情况? (例如:开始时间 06/05 晚上 10 点/结束时间 06/06 上午 3 点)?
    • 不,它不会,但那是因为您的逻辑也不这样做,22:00 高于 01:00 还是更低?它必须是一个或另一个,不能两者都是(否则它不会给你任何结果)。如果你需要像这样度过日子,我建议你使用我提到的第三个选项,并且只使用完整的 datetime 对象,而不仅仅是 time (这样你可以将 now 与 "tomorrow 凌晨 2 点”)
    • 我将添加日期时间对象作为迭代,由于转换为时间对象,基本功能现在可以工作
    【解决方案2】:

    您正在将 datetime 对象与日期和时间进行比较,只有 time ,如错误中所述

    datetime.datetime.now() 返回日期时间,而 datetime.time(10, 50) 返回时间。

    如果您只想比较时间,那么为什么不简单比较 now() 的小时和分钟

    【讨论】:

    • 约定的时间可能会根据服务器的活动而改变,可能会在一夜之间结束,所以它会从晚上 11 点开始,到第二天凌晨 3 点结束
    • 好吧,也许你可以从现在()开始用日、月、年创建一个日期时间对象,然后进行比较?在这种情况下,两者都是日期时间
    【解决方案3】:

    您不能在一个时间内比较日期时间,但您可以继续使用 TimeDelta 来创建 startend 日期进行比较。使用此解决方案,您的代码可能变为:

    now_time_uk = date time.datetime.now()
    current_time_spain = now_time + datetime.timedelta(hours=1)
    start_hours = 10
    start_minutes = 50
    end_hours = 16
    end_minutes = 0
    time_spain_start = current_time_spain + datetime.timedelta(hours=start_hours, minutes=start_minutes)
    time_spain_end = current_time_spain + datetime.timedelta(hours=end_hours, minutes=end_minutes)
    
    if current_time_spain >= time_spain_start or current_time_spain <= spain_time_end:
        print “Start logging”
    else:
        print “No need to log”
    

    通过这种方式,您还可以为 TimeDelta 对象的每个参数添加一个变量,以便为结束日期设置不同的时间,即使第二天是下一天或您想要或需要的任何时间。我们可以想象将所有变量 dayshoursminutesseconds 初始化为 0 值,所以您只需更改您需要的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-22
      • 2019-09-26
      • 1970-01-01
      • 1970-01-01
      • 2022-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多