繁体   English   中英

将 datetime.now() object 的时间与时间字符串进行比较

[英]Compare the time of datetime.now() object with time string

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

如何使用 Python 的 datetime 模块判断当前时间是否在指定范围内?

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

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

我现在有一个日期时间 object: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() 转换为字符串然后再转换回来?

如果您调用datetime.strptime ,如果您只提供时间字符串,则会添加默认日期。 datetime.now()将有今天的日期。 您可以通过仅使用日期时间 object 的时间部分来删除它 - 您可以通过调用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)

您的代码之所以不起作用,是因为除了时间之外, datetime时间(顾名思义)还包含有关日期的信息。

当您运行以下代码时:

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

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

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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM