【问题标题】:python time + timedelta equivalentpython时间+ timedelta等效
【发布时间】:2010-10-13 23:12:03
【问题描述】:

我正在尝试做这样的事情:

time() + timedelta(hours=1)

然而,Python doesn't allow it,显然是有充分理由的。

有人有简单的解决方法吗?

相关:

【问题讨论】:

  • python 使事情复杂化。

标签: python


【解决方案1】:

解决方法:

t = time()
t2 = time(t.hour+1, t.minute, t.second, t.microsecond)

如果您不需要那么高的精度,也可以省略微秒。

【讨论】:

  • 是的,很好的答案。我应该让它变得更棘手,比如:time() + timedelta(minutes=30)
  • 如果t == time(23,59) 则此方法行不通。当您将1 添加到t.hour 时,您将获得ValueError: hour must be in 0..23
  • 更正了语法错误。对于 23:59 的情况,问题是计算的真正意图是什么,在这种情况下你真正想要得到什么结果。我认为它应该保持在同一天(或给出错误),否则您通常首先会有日期时间......
  • 这个方法对我造成了错误,因为我在 10 月 31 日添加了 1 天。因此,您应该使用 datetime.timedelta(days=1) 为 datetime 对象添加一天。您将避免调试土地。
  • 虽然这个答案缺少关键信息,但我认为这是最好的“默认”方法。其他答案也缺少关键信息,但不是错误,而是隐含“溢出”到下一个/上一个日期,这可能更加关键(隐藏的错误很难找到)。具体来说,在我的用例中,这不是我想要的,例如,如果我想在 t == time(23, 59) 上增加 1 小时,我希望拥有 time.max
【解决方案2】:

这有点讨厌,但是:

from datetime import datetime, timedelta

now = datetime.now().time()
# Just use January the first, 2000
d1 = datetime(2000, 1, 1, now.hour, now.minute, now.second)
d2 = d1 + timedelta(hours=1, minutes=23)
print d2.time()

【讨论】:

  • +1:用于datetime 模块。否则需要手动处理溢出错误等。
【解决方案3】:

解决方案在您的问题中的the link that you provided

datetime.combine(date.today(), time()) + timedelta(hours=1)

完整示例:

from datetime import date, datetime, time, timedelta

dt = datetime.combine(date.today(), time(23, 55)) + timedelta(minutes=30)
print dt.time()

输出:

00:25:00

【讨论】:

  • 感觉有点像通过无关信息来增强数据的变通方法。如果today() 是切换到夏令时的前一天,并且时间增量延伸到不同的时区,会发生什么情况?此代码是否受语言环境影响?
  • @bluenote10 一个天真的日期时间对象只是一个整数微秒,根据预测的公历分解。换句话说,答案中的代码在任何本地时区的 DST 转换期间都可以正常工作。 date.today() 用于支持正时间增量和负时间增量。 date.min 适用于正时间增量。
  • @J.F.Sebastian:这令人放心,感谢您的更新。如果一个应该是纯的函数有副作用,它仍然让我感到畏缩。 9999 年的人也不会喜欢这个;)。
  • @bluenote10 实用胜过纯洁。我怀疑datetime.MAXYEAR 将在 9999 中保持 9999。
【解决方案4】:

如果值得为您的项目添加另一个文件/依赖项,我刚刚编写了一个小类,它扩展了 datetime.time 并具有算术能力。如果你过了午夜,它就会绕过去:

>>> from nptime import nptime
>>> from datetime import timedelta
>>> afternoon = nptime(12, 24) + timedelta(days=1, minutes=36)
>>> afternoon
nptime(13, 0)
>>> str(afternoon)
'13:00:00'

可从 PyPi 以 nptime(“非学究时间”)的形式获得,或在 GitHub 上:https://github.com/tgs/nptime

文档位于http://tgs.github.io/nptime/

【讨论】:

  • 太棒了。这节省了往返日期时间世界的往返行程。
【解决方案5】:

您可以将 time() 更改为 now() 以使其工作

from datetime import datetime, timedelta
datetime.now() + timedelta(hours=1)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多