True
也可以计算它们之间的“距离”,差多少天或者多少秒。
print(d2 - d1)
92 days, 0:00:00
两个日期对象相减得到的是一个 timedelta 对象,
type(d2 - d1)
datetime.timedelta
看着 timedelta 顾名思义写成数学符号就是 Δt,如果将日期用符号 t 表示,那么 Δt 不就代表日期差吗?用 .days 字段查看具体的天数差。
(d2 - d1).days
92
日期 d2 减去日期 d1 得到 timedelta,那么把 timedelta 加回 d1 应该得到 d2。
首先从 datetime 包中引入 timedelta 对象。
from datetime import timedelta
从上面结果可知 d1 和 d2 相差 92 天,用 timedelta() 对象并设定 days=92 来定义 td,加回 d1 得到 d2。
td = timedelta(days=92)print(d1 + td)
2020-06-20
日期格式
日期的格式有很多种,在展示中如果不确定用哪种格式,建议用标准格式 .isoformat()。
d = date(2014, 1, 11)print( type(d), d )
2014-01-11
如果需要特定格式,那么用 strftime(),从其函数名 str-f-time 就可以猜到它是用一个字符串 (are) 来代表时间 (time) 的格式 (f)。
print( d.isoformat() )
2014-01-11
调整日期格式可去 https://strftime.org/ 查看详细信息,比如
还原 ISO 格式。
print( d.strftime('%Y-%m-%d') )
2014-01-11
自定义格式。
print( d.strftime('%b %d, %Y (%a)') )
Jan 11, 2014 (Sat)
2日期时间
年、月、日可以组成日期,时、分、秒可以组成时间。日期加上时间才是完整的信息。Python 里对日期时间定义的更细,还带微秒和时区。
时间对象和上面 date 对象相对应的是 time 对象,还是从 datetime 包里引入。
from datetime import time
回想上面
date(year, month, day)
类比
time(hour, minute ,second)
来创建时间。
t = time(8, 32, 21)print( type(t), t )
08:32:21
日期时间对象
但单单一个时间对象没什么还实用价值,一般是联合日期定义一个日期时间 datetime 对象。
datetime 对象里的参数包括年、月、日、时、分、秒、微秒和时区。微秒在高频交易才用得到,时区在下贴细讲。
datetime( year, month, day,
hour, minute, second,
macrosecond, tzinfo )
代码如下:
dt = datetime(2014, 1, 11, 8, 32, 21, 1031)print( type(dt), dt )
2014-01-11 08:32:21.001031
可在 replace() 函数设置年、月、日、时、分、秒、微秒来重设时间。记着重设完要做赋值动作,因为 replace 不是一个原地 (in-place) 动作。
dt_hr = dt.replace(minute=0, second=0, microsecond=0)print(dt_hr)
日期时间之差
上节已介绍过两个日期对象相减得到一个 timedelta 对象,延伸一下,两个日期时间对象相减得到也是一个 timedelta 对象。
用 datetime 对象来创建女儿和儿子 (姐弟俩) 的生日 (精确到秒)。
daughter_bday = datetime(2014, 1, 11, 8, 32, 21)son_bday = datetime(2018, 12, 2, 21, 58, 52)
计算他们生日相隔的 timedelta 对象。
duration = son_bday - daughter_bdaytype(duration)
datetime.timedelta
姐弟俩相隔 1500000 多秒,1786 天,4.89 年。
print(duration.total_seconds())print(duration.days)print(duration.total_seconds()/(3600*24*365))
154358791.0
1786
4.894685153475393
在弟弟生日上加一秒,用 timedelta 对象并设置 seconds=1。
delta1 = timedelta(seconds=1)print(son_bday)print(son_bday+delta1)
2018-12-02 21:58:52
2018-12-02 21:58:53
在弟弟生日上加一小时一秒,用 timedelta 对象并设置 hours=2, seconds=1。
delta2 = timedelta(hours=2, seconds=1)print(son_bday)print(son_bday+delta2)
2018-12-02 21:58:52
2018-12-02 23:58:53
用 timedelta 对象不仅可以加在日期得到未来的时间,还可以将里面的参数定义复制得到过去的时间。
delta3 = timedelta(weeks=-1)print(son_bday+delta3)print(son_bday)print(son_bday-delta3)
2018-11-25 21:58:52
2018-12-02 21:58:52
2018-12-09 21:58:52
3总结
Python 中有日期对象 date,时间对象 time,和日期时间对象 datetime。
本帖讲的东西很基础,但它们都是为了理解之后的时区 (timezone)、 夏令时 (day saving time) 和日期计数惯例 (daycount convention) 这些难点。
哦,对了,如果你想知道当前的日期时间,用 .now() 或者 .today()。
print( datetime.now() )print( datetime.today() )
2020-06-23 15:17:40.522769
2020-06-23 15:17:40.522769
Stay Tuned!