【问题标题】:Compare the time of datetime.now() object with time string将 datetime.now() 对象的时间与时间字符串进行比较
【发布时间】:2020-07-17 06:12:33
【问题描述】:

使用 Rouble 的建议和基于该建议的 Maulik Gangani 的示例:

How do I determine if current time is within a specified range using Python's datetime module?

我有两个时间字符串已使用 .strptime 转换为日期时间对象,如下所示:

timeStart = '0300'
timeStart = datetime.strptime(timeStart, '%H%M')

我现在有一个日期时间对象: timeNow = datetime.now()

我的问题是,除非我将 timeNow (日期时间对象)转换为字符串,然后使用 .strptime 再次返回,否则脚本将无法工作:

timeNow = datetime.now()
timeNow = datetime.strftime(timeNow, '%H%M')
timeNow = datetime.strptime(timeNow, '%H%M')

完整代码:

from datetime import datetime

def isNowInTimePeriod(startTime, endTime, nowTime):
    if startTime < endTime:
        return nowTime >= startTime and nowTime <= endTime
    else: #Over midnight
        return nowTime >= startTime or nowTime <= endTime


timeStart = '0300'
timeEnd = '1000'

timeEnd = datetime.strptime(timeEnd, '%H%M')
timeStart = datetime.strptime(timeStart, '%H%M')
timeNow = datetime.now()
timeNow = datetime.strftime(timeNow, '%H%M')
timeNow = datetime.strptime(timeNow, '%H%M')

我的问题是,如何格式化 timeNow = datetime.now() 以便我可以将其与 24 小时格式 '0000' 的字符串进行比较,而无需将 datetime.now() 转换为字符串并再次返回?

【问题讨论】:

  • 我尝试将我的计算机时间格式从上午/下午转换为 24 小时制,然后执行:dt.datetime.now(),这给了我输出:datetime.datetime(2020, 7, 17, 20, 55, 10, 262243)。这里清楚地显示日期:2020 年 7 月 17 日,时间为 20:55:10:262243,格式为 HH:MM:SS。

标签: python datetime


【解决方案1】:

你的代码不工作的原因,是因为除了时间之外,datetime(顾名思义)还持有有关日期的信息。

当你运行以下代码时:

timeStart = '0300'
timeStart = datetime.strptime(timeStart, '%H%M')

小时和分钟被转换,但其余部分(“日期”部分)被假定为纪元:

repr(timeStart)
# Output: 'datetime.datetime(1900, 1, 1, 3, 0)'

但是,当您运行 datetime.now() 时,它始终假定当前时间 + 日期:

>>> datetime.now()
datetime.datetime(2020, 7, 17, 8, 25, 18, 270848)

转换为字符串并从字符串返回的原因是,当您将日期时间转换为格式为'%H%M 的字符串时,您会丢失结果字符串中的日期部分。从那个转换回来,只有小时和分钟可以读取,所以你丢失了日期部分。

实际上,您应该使用datetime.time,而不是datetime.datetime 来比较时间。

使用strptime读取后,尝试使用.time()方法只提取时间部分,丢失日期部分:

timeStart = '0300'
timeStart = datetime.strptime(timeStart, '%H%M').time()

timeNow 部分也一样:

timeNow = datetime.now().time()

【讨论】:

    【解决方案2】:

    如果您调用datetime.strptime,如果您仅提供时间字符串,则会添加默认日期。 datetime.now() 会有今天的日期。您可以通过仅使用 datetime 对象的时间部分来删除它 - 您可以通过调用 time() 方法获得它,例如

    from datetime import datetime
    
    def isNowInTimePeriod(startTime, endTime, nowTime):
        if startTime < endTime:
            return nowTime >= startTime and nowTime <= endTime
        else: #Over midnight
            return nowTime >= startTime or nowTime <= endTime
    
    timeStart = '0300'
    timeEnd = '1000'
    
    timeEnd = datetime.strptime(timeEnd, '%H%M').time()
    timeStart = datetime.strptime(timeStart, '%H%M').time()
    timeNow = datetime.now().time()
    
    print(isNowInTimePeriod(timeStart, timeEnd, timeNow))
    # True (my current time is 0823)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-02
      • 1970-01-01
      • 2021-12-26
      • 2022-11-21
      • 1970-01-01
      相关资源
      最近更新 更多