【发布时间】:2010-12-03 04:13:23
【问题描述】:
获取明天日期的最简洁和最 Pythonic 的方法是什么?一定有比在天上加一个、在月底处理天数等更好的方法。
【问题讨论】:
获取明天日期的最简洁和最 Pythonic 的方法是什么?一定有比在天上加一个、在月底处理天数等更好的方法。
【问题讨论】:
datetime.date.today() + datetime.timedelta(days=1) 应该可以解决问题
【讨论】:
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)
【讨论】:
不处理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
【讨论】:
time.strftime 处理闰秒:见注 2:docs.python.org/library/time.html#time.strftime 和注 3:docs.python.org/library/datetime.html#strftime-behavior
即使是基本的time 模块也可以处理这个问题:
import time
time.localtime(time.time() + 24*3600)
【讨论】:
对于与服务器打交道的人时间戳
获取昨天的时间戳:
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
【讨论】: