【问题标题】:Datetime wrong deduction日期时间错误扣除
【发布时间】:2021-11-25 13:19:37
【问题描述】:

问题陈述

pythondatetime模块好像有个bug,下面的代码sn-p应该是不言自明的:

import datetime 

dep = datetime.datetime(2021, 9, 11, 7, 25)
arr = datetime.datetime(2021, 9, 11, 12, 35)

print(f"expected: -5h10m, real: {dep - arr}")
print(f"expected: 5h10m, real: {arr - dep}")

我用 python 3.10 得到了什么:

expected: -5h10m, real: -1 day, 18:50:00
expected: 5h10m, real: 5:10:00

问题

是错误还是功能?如果是错误,我能做些什么来修复它?

【问题讨论】:

  • 如果您将18h50min 添加到-1 day 中,您将得到准确的-5h10minprint 没有显示您对负时间的预期,但信息仍然正确。
  • 这是正确的,不是错误,在 3.10 之前也是这样

标签: python datetime timedelta


【解决方案1】:

这是一个特征 - 从datetime 中减去datetime 会得到一个timedelta 对象,该对象已被标准化,因此只有负值可以是days。 该行为已记录在案,例如。这里:https://pl.python.org/docs/lib/datetime-timedelta.html

【讨论】:

    【解决方案2】:

    我称之为效果

    expected: -5h10m, real: -1 day, 18:50:00
    expected: 5h10m, real: 5:10:00
    

    glitch,因为它仅限于查看,而两个增量保持相同的秒数并且等于它们的对立面,可以如下检查

    import datetime 
    dep = datetime.datetime(2021, 9, 11, 7, 25)
    arr = datetime.datetime(2021, 9, 11, 12, 35)
    delta1 = dep - arr
    delta2 = arr - dep
    print(delta1.total_seconds()) # -18600.0
    print(delta2.total_seconds()) # 18600.0
    print(delta1 == -delta2) # True
    print(delta2 == -delta1) # True
    print(delta1 + delta2) # 0:00:00
    

    【讨论】:

      【解决方案3】:

      您可以查看 datetime 对象中减法的实现,但它本质上与下面的代码执行相同的操作。

      import datetime
      
      dep = datetime.datetime(2021, 9, 11, 7, 25)
      arr = datetime.datetime(2021, 9, 11, 12, 35)
      dep_days = dep.toordinal()
      arr_days = dep.toordinal()
      dep_secs = dep.second + dep.minute * 60 + dep.hour * 3600
      arr_secs = arr.second + arr.minute * 60 + arr.hour * 3600
      
      day_diff = dep_days - arr_days
      sec_diff = dep_secs - arr_secs
      micro_diff = dep.microsecond - arr.microsecond
      
      base = datetime.timedelta(day_diff,sec_diff,micro_diff)
      
      print(base)
      

      timedelta 告诉您时间倒退一天,然后前进 18 小时 50 分钟,这实际上只是意味着倒退 24 小时 + 18 小时 50 = 5 小时 10 分钟

      如果您只从字符串表示的角度对此感兴趣,则可以将其包装在一个简单的函数中,该函数将为您提供时差的相对字符串表示

      import datetime
      
      def relative_time_str(delta: datetime.timedelta):
          neutral = datetime.timedelta()
          if delta < neutral:
              return f"-{neutral - delta}"
          return f"{delta}"
      
      
      dep = datetime.datetime(2021, 9, 11, 7, 25)
      arr = datetime.datetime(2021, 9, 11, 12, 35)
      
      
      print(f"expected: -5h10m, real: {relative_time_str(dep - arr)}")
      print(f"expected: 5h10m, real: {relative_time_str(arr - dep)}")
      

      输出

      expected: -5h10m, real: -5:10:00
      expected: 5h10m, real: 5:10:00
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-17
        • 1970-01-01
        • 1970-01-01
        • 2019-06-30
        • 2012-01-11
        • 2015-06-17
        相关资源
        最近更新 更多