最干净利落的明天约会方式?

什么是得到明天约会的最干净和最 Python 的方式?必须有一个更好的方法比增加一天,处理天在月底等。

121087 次浏览

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)

不能处理 闰秒:

>>> 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'

该死。

编辑 -@马克: 医生说“是的”,但代码说“不是那么多”:

>>> 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模块也可以处理这个问题:

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

使用 today()没有任何错误,如果 选择答案中所示,那就是您需要的范围。

Today () + datetime.timedelta (days = 1)

或者,如果您或其他使用您的代码的人可能需要更精确地处理明天的日期,可以考虑使用 datetime.now()而不是 today()。这肯定会使代码更简单、更易读:

datetime.datetime.now() + datetime.timedelta(days=1)

返回类似这样的结果:

datetime.datetime(2022, 2, 17, 19, 50, 19, 984925)

这样做的好处是,您现在可以以简洁、人性化的方式使用 Datetime 属性:

类 datetime.datetime

A combination of a date and a time. Attributes: year, month, day, hour, minute, second, microsecond, and tzinfo.

例子

你可以很容易地用 date()把它转换成一个日期对象:

import datetime
tomorrow = datetime.datetime.now() + datetime.timedelta(days=1)
print(f"Tomorrow's date is {tomorrow.date()}")

tomorrow.date()易于使用,并且对于阅读你的代码的人来说非常清楚,它返回的是明天的日期。上面的输出看起来是这样的:
Tomorrow's date is 2022-02-17

如果以后在代码中您只需要当天的日期号码,那么现在可以使用 tomorrow.day:

print(f"Tomorrow is the {tomorrow.day}rd")

它会返回类似这样的结果:
Tomorrow is the 17rd

这是一个愚蠢的示例,但是您可以看到访问这些属性是多么有用,并且还可以保持代码的可读性。很容易理解,tomorrow.day返回天数。

需要处理明天约会开始的确切时间吗? 现在可以替换小时、分钟、秒和微秒:

# Replace all attributes except day with 0.
midnight = tomorrow.replace(
hour=0,
minute=0,
second=0,
microsecond=0)
# Print midnight as the beginning of tomorrow's date.
print(f"{midnight}")

阅读上面的代码,应该可以清楚地看到正在替换 tomorrow的哪些属性。当打印 midnight时,它将输出:
2022-02-17 00:00:00

需要知道离明天的日期还有多少时间吗? 现在这样的事情是可能的,简单的,可读的:

print(f"{midnight - datetime.datetime.now()}")

输出是明天的日期开始的微秒时间: 3:14:28.158331

人们可能希望用很多方式来处理明天的约会。通过从一开始就确保这些属性可用,您可以编写更具可读性的代码,并避免以后不必要的工作。

对于这种情况,您只想计算时间戳

import time
tomorrow = (int(time.time() / 86400) + 1) * 86400