转自:https://www.cnblogs.com/fclbky/articles/4098204.html
datetime 模块提供了各种类用于操作日期和时间,该模块侧重于高效率的格式化输出
在 Python 中,与时间处理有关的模块包括:time,datetime 以及 calendar
datetime 模块定义了两个常量:
- datetime.MINYEAR - date 和 datetime 对象所能支持的最小年份,object.MINYEAR 的值为 1
- datetime.MAXYEAR - date 和 datetime 对象所能支持的最大年份,object.MAXYEAR 的值为 9999
datetime 模块中定义的类(前四个下方有详解):
- datetime.date - 表示日期的类,常用属性:year, month, day
- datetime.time - 表示时间的类,常用属性:hour, minute, second, microsecond, tzinfo
- datetime.datetime - 表示日期和时间的类,常用属性: year, month, day, hour, minute, second, microsecond, tzinfo
- datetime.timedelta - 表示时间间隔,即两个时间点(date,time,datetime)之间的长度
- datetime.tzinfo - 表示时区的基类,为上方的 time 和 datetime 类提供调整的基准
- datetime.timezone - 表示 UTC 时区的固定偏移,是 tzinfo 基类的实现
注:上边这些类的对象是不可变的
上边这些类的从属关系:
- object
- timedelta
- tzinfo
- timezone
- time
- date
- datetime
timedelta 对象
timedelta 对象表示两个日期或时间之间的间隔
- datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)
以上所有的参数都是可选的(默认为 0),参数的可以是整数或浮点数,正数或负数。
内部的存储单位只有 days(天)、seconds(秒)、microseconds(毫秒),其他单位均先转换后再存储:
- 1 millisecond -> 1000 microseconds
- 1 minutes -> 60 seconds
- 1 hours -> 3600 seconds
- 1 weeks -> 7 days
而 days、seconds 和 microseconds 为了不产生时间表示上的歧义,将根据以下范围自动“进位”:
- 0 <= microseconds < 1000000
- 0 <= seconds < 3600 * 24(1小时的秒数 * 24小时)
- -999999999 <= days <= 999999999
timedelta 类属性:
- timedelta.min - timedelta 对象负值的极限,timedelta(-999999999)
- timedelta.max - timedelta 对象正值的极限,timedelta(days=999999999, hours=23, minutes=59, seconds=59, microseconds=999999)
- timedelta.resolution - 两个 timedelta 不相等的对象之间最小的差值,timedelta(microseconds=1)
请注意,在正常情况下,timedelta.max > -timedelta.min,-timedelta.max 无意义。
timedelta 实例属性(只读):
属性 | 取值范围 |
timedelta.days | -999999999 ~ 999999999 |
timedelta.seconds | 0 ~ 86399 |
timedelta.microseconds | 0 ~ 999999 |
timedelta 对象支持的操作:
操作 | 结果 |
t1 = t2 + t3 | t2 和 t3 的和,随后:t1 - t2 == t3 and t1 - t3 == t2 为 True(注1) |
t1 = t2 - t3 | t2 和 t3 的差,随后:t1 == t2 - t3 and t2 == t1 + t3 为 True(注1) |
t1 = t2 * i 或 t1 = i * t2 | 对象乘以一个整数,随后:t1 // i == t2 为 true;且 i != 0 |
t1 = t2 * f 或 t1 = f * t2 | 对象乘以一个浮点数,结果四舍五入到精度 timedelta.resolution(注1) |
f = t2 / t3 | t2 和 t3 的商(注3),返回一个 float 对象 |
t1 = t2 / f 或 t1 = t2 / i | 对象除以一个整数或浮点数,结果四舍五入到精度 timedelta.resolution |
t1 = t2 // i 或 t1 = t2 // t3 | 对象地板除一个整数或浮点数,结果舍去小数,返回一个整数(注3) |
t1 = t2 % t3 | t2 和 t3 的余数,返回一个 timedelta 对象(注3) |
q, r = divmod(t1, t2) | 计算 t1 和 t2 的商和余数,q = t1 // t2(注3),r = t1 % t2,q 是一个整数,r 是一个 timedelta 对象 |
+t1 | 返回一个 timedelta 对象,且值相同(注2) |
-t1 | 等同于 timedelta(-t1.days, -t1.seconds, -t1.microseconds),并且相当于 t1 * -1(注1、4) |
abs(t) | 当 t.days >= 0 时,等同于 +t;当 t.days < = 时,等同于 -t(注2) |
str(t) | 返回一个字符串,按照此格式:[D day[ s ], ][H]H:MM:SS[.UUUUUU] |
repr(t) | 返回一个字符串,按照此格式:datetime.timedelta(D[, S[, U]]) |
注1:这是准确的,但可能会溢出
注2:这是准确的,并且不会溢出
注3:除数为 0 会引发 ZeroDivisionError 异常
注4:-timedelta.max 是无意义的
timedelta 实例方法:
timedelta.total_seconds()
- 返回 timedelta 对象所包含的总秒数,相当于 td / timedelta(seconds=1)
请注意,对于非常大的时间间隔(在大多数平台上是大于270年),这种方法将失去微秒(microsecond)精度
timedelta 用法示例:
- # 爱学习,爱鱼C工作室
- >>> from datetime import timedelta
- >>> year = timedelta(days=365)
- >>> another_year = timedelta(weeks=40, days=84, hours=23,
- ... minutes=50, seconds=600) # adds up to 365 days
- >>> year.total_seconds()
- 31536000.0
- >>> year == another_year
- True
- >>> ten_years = 10 * year
- >>> ten_years, ten_years.days // 365
- (datetime.timedelta(3650), 10)
- >>> nine_years = ten_years - year
- >>> nine_years, nine_years.days // 365
- (datetime.timedelta(3285), 9)
- >>> three_years = nine_years // 3;
- >>> three_years, three_years.days // 365
- (datetime.timedelta(1095), 3)
- >>> abs(three_years - ten_years) == 2 * three_years + year
- True