【问题标题】:Measuring Elapsed time using Python 2.7 time module使用 Python 2.7 时间模块测量经过的时间
【发布时间】:2016-03-17 00:50:46
【问题描述】:

我正在尝试使用 time 模块查找两次之间的差异,然后使用 strftime 将其转换为 datetime 格式,但是从 1970 年开始,我得到一个奇怪的经过时间输出,使用 python 查找经过时间的最佳方法是什么?

start_time = time()
info('My Start Time ' + datetime.fromtimestamp(start_time).strftime('%d-%m-%Y %H:%M:%S'))
sleep(5)
elapsed_time = time() - start_time
info('My Elapsed Time' + datetime.fromtimestamp(elapsed_time).strftime('%d-%m-%Y %H:%M:%S'))

输出是

 [2016-03-17 00:45:16.828277] INFO: Generic: My Start Time 17-03-2016 11:45:16 
 [2016-03-17 00:45:21.832503] INFO: Generic: My Elapsed Time 01-01-1970 10:00:05

【问题讨论】:

    标签: python python-2.7


    【解决方案1】:

    时间间隔与时间不同。将elapsed_time 之类的时间间隔转换为datetime 是没有意义的。

    使用datetime 模块的datetimetimedelta 对象可以大大简化您的脚本。当您从另一个中减去一个datetime 时,结果是一个timedelta

    from time import sleep
    from datetime import datetime
    
    start_time = datetime.now()
    print('My Start Time', start_time)
    sleep(5)
    
    stop_time = datetime.now()
    print('My Stop Time', stop_time)
    
    elapsed_time = stop_time - start_time
    print('My Elapsed Time', elapsed_time)    
    

    输出

    My Start Time 2016-03-17 12:28:01.262090
    My Stop Time 2016-03-17 12:28:06.265964
    My Elapsed Time 0:00:05.003874
    

    请参阅timedelta 的文档,了解更多关于您可以使用这些对象做什么的示例。

    【讨论】:

    • PM 2Ring 我之前尝试过这个解决方案,效果很好,我的问题是恢复时间,而我无法通过 timedelta 实现,因此我认为时间模块会有所帮助。您知道如何将秒、分钟和小时添加到 timedelta 对象吗?
    • @AftabNaveed 您可以相互添加/减去 timedelta 对象。复杂的例子:timedelta(hours=1, seconds=2) + timedelta(minutes=9, seconds=51),它给你一个datetime.timedelta(0, 4193)——然后你可以用datetime重新使用那个增量,例如:datetime(2000, 1, 1) + (timedelta(hours=1, seconds=2) + timedelta(minutes=9, seconds=51))给你:datetime.datetime(2000, 1, 1, 1, 9, 53)
    • 我通过使用与您的方法完全相同的 datetime 解决了这个问题,但在 timedelta 方面遇到了困难。返回的经过日期是时间增量类型,两个时间增量可以相减。
    【解决方案2】:

    这是我最喜欢的东西之一!你的问题是,就时间模块而言……时间从 1970 年 1 月 1 日开始!!请参阅文档here
    时间从这个日期开始计算,所以当您将经过的时间转换为日期时,您基本上是在说,给我 01/01/1970 + 我经过的时间。

    此外,我不确定将经过的时间作为日期是否真的是您想要的。你不想用小时、分钟等来衡量吗?如果你真的想要日期,你应该打电话给new_time = time.time(),然后将new_time转换成你想要的格式(不用费心将经过的时间计算为日期)

    【讨论】:

    • 这更有意义,我想在用户按下我的应用程序中的暂停按钮后经过几小时和几分钟,然后从它离开的地方恢复它,我认为你的解决方案非常接近我需要。
    【解决方案3】:

    您可能想做“开始时间”+“经过时间”,而不是根据“经过时间”制作最终时间戳:)

    start_time = time()
    info('My Start Time ' + datetime.fromtimestamp(start_time).strftime('%d-%m-%Y %H:%M:%S'))
    sleep(5)
    elapsed_time = time() - start_time
    info('My Elapsed Time' + datetime.fromtimestamp(elapsed_time + start_time).strftime('%d-%m-%Y %H:%M:%S'))
    

    这是因为 Python 的 Time 模块的纪元是 1970 年 1 月 1 日。调用 time() 测量自纪元以来的秒数(.strftime('%d-%m-%Y %H:%M:%S') 只是将秒数重新格式化为我们可以理解的日期)

    因此,当您找到elapsed_time 时,您会在第一次开始和分配变量的时间之间相差几秒钟。因此,datetime.fromtimestamp(elapsed_time) 输出 1970 年 1 月 1 日 10:00:05 是有意义的。其中elapsed_time 是 5,start_time 是 1458177108.6...您希望结果是 start_time 加上 elapsed_time(或者,简单地说,为什么不只是当前时间?)

    我希望这个解释是有道理的。以下是 Python 文档https://docs.python.org/2/library/time.html

    的更多解释

    【讨论】:

    • 这只是打印第二个time()调用的datetime不是elapsed_time间隔。
    • 感谢您的回答,但这不会使其等于当前时间:) 吗?
    猜你喜欢
    • 2011-04-06
    • 2016-10-07
    • 2023-02-26
    • 2011-11-17
    • 2017-07-13
    • 2021-03-01
    • 2019-12-30
    相关资源
    最近更新 更多