【问题标题】:Subtracting Dates With Python用 Python 减去日期
【发布时间】:2012-08-21 00:23:50
【问题描述】:

我正在开发一个简单的程序来告诉人们他们活了多久。

我知道如何获取当前日期,并知道他们的生日。唯一的问题是我没有办法减去两个日期,我知道减去两个日期的方法,但不幸的是它不包括小时、分钟或秒。

我正在寻找一种可以减去两个日期并将差值返回到第二个日期的方法,而不仅仅是日期。

【问题讨论】:

标签: python date time


【解决方案1】:

从您的日期创建一个datetime.datetime

datetime.datetime.combine(birthdate, datetime.time())

现在您可以从datetime.datetime.now() 中减去它。

>>> from datetime import date, datetime, time
>>> bday = date(1973, 4, 1)
>>> datetime.now() - datetime.combine(bday, time())
datetime.timedelta(14392, 4021, 789383)
>>> print datetime.now() - datetime.combine(bday, time())
14392 days, 1:08:13.593813

【讨论】:

    【解决方案2】:
    from datetime import datetime
    
    birthday = datetime(1988, 2, 19, 12, 0, 0)
    diff = datetime.now() - birthday
    print diff
    # 8954 days, 7:03:45.765329
    

    【讨论】:

    【解决方案3】:

    当减去两个datetime 对象时,您将得到一个新的datetime.timedelta 对象。

    from datetime import datetime
    x = datetime.now()
    y = datetime.now()
    delta = y - x
    

    它将为您提供微秒分辨率的时差。

    有关更多信息,请查看official documentation

    【讨论】:

    • 那不会以秒为单位计算总差(秒数以一天中的秒数为最大值)
    【解决方案4】:

    使用 UTC 时间,否则在 DST 转换期间以秒为单位的时间会倒退:

    from datetime import datetime
    
    born = datetime(1981, 12, 2) # provide UTC time
    age = datetime.utcnow() - born
    print(age.total_seconds())
    

    如果您的程序在与一个人的出生地不同的地方(时区)运行的计算机上运行,​​或者如果该地方的时间规则自生日以来发生了变化,那么您也不能使用本地时间。它可能会引入几个小时的错误。

    如果你想考虑闰秒,那么这项任务几乎是不可能的。

    【讨论】:

    • total_seconds() 对我来说是一个更好的答案,因为无论如何只要使用 .seconds 就会给我一个肯定的答案。所以不适合 if x > 0: 条件
    【解决方案5】:
    import datetime
    born = datetime.date(2002, 10, 31)
    today = datetime.date.today()
    age = today - born
    
    print(age.total_seconds())
    

    输出:463363200.0

    【讨论】:

      【解决方案6】:

      由于 DateTime.DateTime 是一个不可变类型的方法,像这些总是产生一个新对象,两个 DateTime 对象的差异产生一个 DateTime.timedelta 类型:

      from datetime import date,datetime,time,timedelta
      dt=datetime.now()
      print(dt)
      dt2=datetime(1997,7,7,22,30)
      print(dt2)
      delta=dt-dt2
      print(delta)
      
      print(int(delta.days)//365)
      print(abs(12-(dt2.month-dt.month)))
      print(abs(dt.day))
      

      输出 timedelta(8747,23:48:42.94) 或当你测试代码时将是什么天数表明时间增量编码的偏移量为 8747 天 23 小时 48 分钟 ...

      输出

         2021-06-19 22:27:36.383761
          1997-07-07 22:30:00
          8747 days, 23:57:36.383761
          23  Year
          11  Month
          19  Day
      

      【讨论】:

        猜你喜欢
        • 2022-01-10
        • 1970-01-01
        • 2011-05-09
        • 1970-01-01
        • 1970-01-01
        • 2022-01-21
        • 2015-08-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多