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

2024-12-09 08:30:00
admin
原创
136
摘要:问题描述:我有以下方法:# 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大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用