【问题标题】:Cleanest and most Pythonic way to get tomorrow's date?获取明天日期的最简洁和最 Pythonic 的方式?
【发布时间】:2010-12-03 04:13:23
【问题描述】:

获取明天日期的最简洁和最 Pythonic 的方法是什么?一定有比在天上加一个、在月底处理天数等更好的方法。

【问题讨论】:

    标签: python datetime date time


    【解决方案1】:

    datetime.date.today() + datetime.timedelta(days=1) 应该可以解决问题

    【讨论】:

      【解决方案2】:

      timedelta 可以处理添加天、秒、微秒、毫秒、分钟、小时或周。

      >>> import datetime
      >>> today = datetime.date.today()
      >>> today
      datetime.date(2009, 10, 1)
      >>> today + datetime.timedelta(days=1)
      datetime.date(2009, 10, 2)
      >>> datetime.date(2009,10,31) + datetime.timedelta(hours=24)
      datetime.date(2009, 11, 1)
      

      正如评论中所问的,闰日没有问题:

      >>> datetime.date(2004, 2, 28) + datetime.timedelta(days=1)
      datetime.date(2004, 2, 29)
      >>> datetime.date(2004, 2, 28) + datetime.timedelta(days=2)
      datetime.date(2004, 3, 1)
      >>> datetime.date(2005, 2, 28) + datetime.timedelta(days=1)
      datetime.date(2005, 3, 1)
      

      【讨论】:

        【解决方案3】:

        不处理leap seconds tho:

        >>> from datetime import datetime, timedelta
        >>> dt = datetime(2008,12,31,23,59,59)
        >>> str(dt)
        '2008-12-31 23:59:59'
        >>> # leap second was added at the end of 2008, 
        >>> # adding one second should create a datetime
        >>> # of '2008-12-31 23:59:60'
        >>> str(dt+timedelta(0,1))
        '2009-01-01 00:00:00'
        >>> str(dt+timedelta(0,2))
        '2009-01-01 00:00:01'
        

        该死的。

        编辑 - @Mark:文档说“是”,但代码说“没那么多”:

        >>> time.strptime("2008-12-31 23:59:60","%Y-%m-%d %H:%M:%S")
        (2008, 12, 31, 23, 59, 60, 2, 366, -1)
        >>> time.mktime(time.strptime("2008-12-31 23:59:60","%Y-%m-%d %H:%M:%S"))
        1230789600.0
        >>> time.gmtime(time.mktime(time.strptime("2008-12-31 23:59:60","%Y-%m-%d %H:%M:%S")))
        (2009, 1, 1, 6, 0, 0, 3, 1, 0)
        >>> time.localtime(time.mktime(time.strptime("2008-12-31 23:59:60","%Y-%m-%d %H:%M:%S")))
        (2009, 1, 1, 0, 0, 0, 3, 1, 0)
        

        我认为 gmtime 或 localtime 会采用 mktime 返回的值并将原始元组返回给我,其中 60 作为秒数。而这个测试表明,这些闰秒会逐渐消失......

        >>> a = time.mktime(time.strptime("2008-12-31 23:59:60","%Y-%m-%d %H:%M:%S"))
        >>> b = time.mktime(time.strptime("2009-01-01 00:00:00","%Y-%m-%d %H:%M:%S"))
        >>> a,b
        (1230789600.0, 1230789600.0)
        >>> b-a
        0.0
        

        【讨论】:

        【解决方案4】:

        即使是基本的time 模块也可以处理这个问题:

        import time
        time.localtime(time.time() + 24*3600)
        

        【讨论】:

        • 这在美国夏令时的边界上失败了,因为在这些边界上,一天将有 ​​23 小时,而一天将有 ​​25 小时。这也没有考虑闰秒。
        • @CharlesWood:这个答案可能会返回一个不同的小时(在某些时区)意味着它可能会返回一个不同的日期(不是明天),但它总是返回那个时间正好提前 24 小时(接受的答案返回午夜(从现在开始的未知小时))。我看不出闰秒如何改变这里的结果,除非在 23:59:60 和 00:00:00 具有相同时间戳的系统上的闰秒期间调用。
        • 没错,从现在起总是 24 小时,但这不是问题所在。 OP 想知道如何获取明天的日期。闰秒只是吹毛求疵;)
        • @CharlesWood:是的。我刚刚澄清它不会在 23、25 小时内返回。是的,它可能会返回错误的日期(不是明天,例如“巴西/东部”时区的“2014-10-18 23:00:00”)。相关:Given the current time in UTC, how do you determine the start and end time of the day in a particular timezone?.
        • @J.F.Sebastian 对,我只是想指出 日子并不总是 24 小时。难怪处理日期如此困难。甚至很难就它们进行交流:/
        【解决方案5】:

        对于与服务器打交道的人时间戳

        获取昨天的时间戳:

        yesterdaytimestamp = datetime.datetime.today() + datetime.timedelta(days=-1)
        

        获取今天的时间戳:

        currenttimestamp = datetime.datetime.now().timestamp()
        

        获取明天的时间戳:

        tomorrowtimestamp = datetime.datetime.today() + datetime.timedelta(days=1)
        

        打印:

        print('\n Yesterday TimeStamp is : ', yesterdaytimestamp.timestamp(), 
            '\n Today TimeStamp is :', currenttimestamp, 
            '\n Tomorrow TimeStamp is: ', tomorrowtimestamp.timestamp())
        

        输出:

        Yesterday TimeStamp is :  1632842904.110993 
        Today TimeStamp is       :  1632929304.111022 
        Tomorrow TimeStamp is    :  1633015704.11103
        

        【讨论】:

          猜你喜欢
          • 2022-01-21
          • 2019-12-02
          • 2023-03-30
          • 1970-01-01
          • 2011-01-09
          • 1970-01-01
          • 1970-01-01
          • 2014-05-22
          • 2022-01-26
          相关资源
          最近更新 更多