【问题标题】:How to add delta to python datetime.time?如何将增量添加到 python datetime.time?
【发布时间】:2012-09-09 00:57:07
【问题描述】:

发件人:

http://docs.python.org/py3k/library/datetime.html#timedelta-objects

一个 timedelta 对象表示一个持续时间,两个之间的差 日期或时间。

那么为什么我会出错:

>>> from datetime import datetime, timedelta, time
>>> datetime.now() + timedelta(hours=12)
datetime.datetime(2012, 9, 17, 6, 24, 9, 635862)
>>> datetime.now().date() + timedelta(hours=12)
datetime.date(2012, 9, 16)

>>> datetime.now().time() + timedelta(hours=12)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'datetime.time' and 'datetime.timedelta'

【问题讨论】:

    标签: python datetime time timedelta


    【解决方案1】:

    datetime.time 对象 do not support additiondatetime.timedeltas。

    虽然有一个自然定义,时钟算术。 你可以这样计算:

    import datetime as dt
    now = dt.datetime.now()
    delta = dt.timedelta(hours = 12)
    t = now.time()
    print(t)
    # 12:39:11.039864
    
    print((dt.datetime.combine(dt.date(1,1,1),t) + delta).time())
    # 00:39:11.039864
    

    dt.datetime.combine(...) 将 datetime.time t 提升到 datetime.datetime 对象,然后添加增量,并将结果返回到 datetime.time 对象。

    【讨论】:

    • 工作量很大。我只想计算一个时间偏移,python :)。但是这是解决方案,谢谢。
    • 这里要注意的一点是,如果t 小于delta,那么你最终会得到dt.date(1,1,0),即OverflowError: date value out of range 。解决此问题的一种方法是增加dt.date(...) 中的值。但这仍然是一个必须小心的问题。
    • 这是一个老帖子,当时的Python版本是什么?可能是 2。我正在使用 Python 3 并遇到同样的问题。真正令人失望的事实是,我在没有在控制台上使用整个解决方法的情况下尝试了它,它运行良好,然后将它放入我的代码中,它完全失败了。这真的非常非常非常可悲。无论如何,所述的解决方法都有效。
    【解决方案2】:

    上面所有的解决方案都太复杂了,OP已经证明我们可以在datetime.datetimedatetime.timedelta之间进行计算,所以为什么不这样做:

    (datetime.now() + timedelta(hours=12)).time()

    【讨论】:

    • 你的方式显示一个 datetime.datetime 对象。他有一个 datetime.time 对象
    • 这给出了不同的结果:datetime.datetime(2012, 9, 17, 6, 24, 9, 635862) 而不是 datetime.date(2012, 9, 16, 12)
    【解决方案3】:

    这是一个将time 添加到timedelta 的函数:

    def time_plus(time, timedelta):
        start = datetime.datetime(
            2000, 1, 1,
            hour=time.hour, minute=time.minute, second=time.second)
        end = start + timedelta
        return end.time()
    

    只要您不以跨越午夜边界的方式添加时间,这将提供预期的结果。

    【讨论】:

      【解决方案4】:

      这将如何工作? datetime.datetime.now().time() 只返回小时、分钟、秒等,.time() 返回的没有日期信息,只有时间。

      那么,18:00:00 + 8 hours 应该返回什么?
      这个问题没有答案,这就是为什么你不能添加时间和时间增量。

      换句话说:

      18:28:44, Sep. 16, 2012 + 8 hours #makes sense: it's 2:28:44, Sep. 17, 2012
      18:28:44 + 8 hours # Doesn't make sense.
      

      【讨论】:

      • 虽然您的一般观点是正确的,但下午 6 点 + 5 小时 = 晚上 11 点,所以这是一个不好的例子,.time() 不会返回时间戳——时间戳通常包含足够的信息来得出日期,datetime.time 对象没有。
      • @agf,是的,我实际上正在编辑我的帖子:)。我也会更改时间戳的使用!
      • 好的,我明白解释我会习惯的。称我为愚蠢的,但在我的推理中,仅在日期上增加几个小时应该会在两者中的任何一个中引发异常:) 但是这种形式并不紧凑。我认为在一天(24 小时)内增加时间是可能的。我怎样才能在当前状态下实现这一点,比如将 2h33m 添加到 now()?
      • @xliiv unubtu 的回答会给你这个:)
      【解决方案5】:

      可以将 datetime.time 对象拆分为可以添加的单独整数组件。 不需要 timedelta 例如:

      from datetime import datetime, time
          time_now = datetime.now().time()
          twelve_hours_time =  time(time_now.hour + 12, time_now.minute)
      

      【讨论】:

      • 这可能会导致小时部分 >23 或分钟 >59,然后你会得到一个ValueError。在进行加法时,最简单的方法是使用日期时间而不是时间。我有一些用例,我只是让一个虚拟 datetime.datetime(1, 1, 1, hour, minute) 进行 timedelta 加法然后转换为时间。
      猜你喜欢
      • 2017-06-20
      • 2022-10-25
      • 2019-11-15
      • 2021-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-01
      相关资源
      最近更新 更多