判断日期时间之间是否已过去 24 小时

2024-12-09 08:30:00
admin
原创
137
摘要:问题描述:我有以下方法:# last_updated is a datetime() object, representing the last time this program ran def time_diff(last_updated): day_period = last_updated.r...

问题描述:

我有以下方法:

# last_updated is a datetime() object, representing the last time this program ran
def time_diff(last_updated):
    day_period = last_updated.replace(day=last_updated.day + 1, 
                                      hour=1,
                                      minute=0,  
                                      second=0,
                                      microsecond=0)
    delta_time = day_period - last_updated
    hours = delta_time.seconds // 3600
    # make sure a period of 24hrs have passed before shuffling
    if hours >= 24:
        print "hello"
    else:
        print "do nothing"

我想要了解是否已经过去了 24 小时last_updated,如何用 Python 来实现呢?


解决方案 1:

如果last_updated是一个简单的 datetime 对象,表示 UTC 时间:

from datetime import datetime, timedelta

if (datetime.utcnow() - last_updated) > timedelta(hours=24): 
    # more than 24 hours passed

如果last_updated是当地时间(简单(不了解时区)日期时间对象):

import time

DAY = 86400
now = time.time()
then = time.mktime(last_updated.timetuple())
if (now - then) > DAY:
    # more than 24 hours passed

如果last_updated是一个不明确的时间,例如夏令时 (DST) 结束转换期间的时间(许多时区每年一次),那么有一半的机会mktime()返回错误的结果(例如,偏差一小时)。

time.mktime()如果 Ctime库未在给定平台上使用历史时区数据库,并且本地时区的 UTC 偏移量与last_updated现在不同,则也可能会失败。它可能适用于去年所有时区的三分之一以上。Linux、OS X、Windows 的最新版本都有 tz 数据库(我不知道旧 Windows 版本是否适用于这些过去的日期)。

注意:这样写可能很诱人datetime.now() - last_updated(类似于 UTC 的情况),但是如果 UTC 偏移量在last_updated时间上不同(在许多时区都有可能),那么它肯定会在所有平台上失败。mktime()基于 tz 的解决方案至少在某些平台上可以利用 tz 数据库,因此它可以处理因任何原因导致的 UTC 偏移量的变化。

为了便于移植,你可以安装 tz 数据库。它由pytzPython 中的模块提供。tzlocal可以返回pytz与当地时区相对应的时区:

from datetime import datetime, timedelta
from tzlocal import get_localzone # $ pip install tzlocal

tz = get_localzone() # local timezone
then = tz.normalize(tz.localize(last_updated)) # make it timezone-aware
now = datetime.now(tz) # timezone-aware current time in the local timezone
if (now - then) > timedelta(hours=24):
    # more than 24 hours passed

即使 UTC 偏移量在过去不同,它也能正常工作。但它不能(以及time.mktime())修复模糊时间(默认tz.localize()选择时间)。被调用来调整不存在的时间,例如,那些与 DST 转换开始相对应的时间(它不应该影响结果)。is_dst=False`tz.normalize()`

上述代码假设last_updated是一个简单的日期时间对象(没有关联的时区信息)。如果last_updated是感知日期时间对象,则很容易将其转换为 UTC:

from datetime import datetime, timedelta

then_in_utc = last_updated.replace(tzinfo=None) - last_updated.utcoffset()
if (datetime.utcnow() - then_in_utc) > timedelta(hours=24):
    # more than 24 hours passed

一般说明:您现在应该明白为什么人们建议使用 UTC 时间并仅使用本地时间进行显示。

解决方案 2:

只是为了澄清一些事情,因为我认为我们并不是所有人都使用了timePython 库。当您使用时datetime,这在 Django 中是一种非常常见的做法,如果您像这样进行比较:

if (now - then) > DAY:

它将遭遇巨大失败。这是因为你无法datetime.timedelta与之相比int

解决方案是将对象转换为秒。
例如:

from datetime import datetime

then = datetime_object
now = datetime.now()

if (now - then).total_seconds() > NUMBER_OF_SECONDS:
    # do something

希望我能够帮助到遇到此问题的人。

谢谢

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1579  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1355  
  信创产品在政府采购中的占比分析随着信息技术的飞速发展以及国家对信息安全重视程度的不断提高,信创产业应运而生并迅速崛起。信创,即信息技术应用创新,旨在实现信息技术领域的自主可控,减少对国外技术的依赖,保障国家信息安全。政府采购作为推动信创产业发展的重要力量,其对信创产品的采购占比情况备受关注。这不仅关系到信创产业的发展前...
信创和国产化的区别   8  
  信创,即信息技术应用创新产业,旨在实现信息技术领域的自主可控,摆脱对国外技术的依赖。近年来,国货国用信创发展势头迅猛,在诸多领域取得了显著成果。这一发展趋势对科技创新产生了深远的推动作用,不仅提升了我国在信息技术领域的自主创新能力,还为经济社会的数字化转型提供了坚实支撑。信创推动核心技术突破信创产业的发展促使企业和科研...
信创工作   9  
  信创技术,即信息技术应用创新产业,旨在实现信息技术领域的自主可控与安全可靠。近年来,信创技术发展迅猛,对中小企业产生了深远的影响,带来了诸多不可忽视的价值。在数字化转型的浪潮中,中小企业面临着激烈的市场竞争和复杂多变的环境,信创技术的出现为它们提供了新的发展机遇和支撑。信创技术对中小企业的影响技术架构变革信创技术促使中...
信创国产化   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用