时间的划分
由于时间在全世界范围内的不同,会受到时区,政治因素和夏令时的影响。比如说,我认为现在是2021年的11月6日,但是,在世界的其他地方,今天可能是5日或者是7日,没有办法准确的确定现时此刻到底是什么时间。
因此,我们将时间划分为简单时间和准确时间。简单时间仅仅是一个时间,只针对你所在的地区有效,并不关心该时间在全世界中是什么时间。而准确时间必须要做更详细的记录,以此来确定,现在的时间,在全世界各个地方,到底是什么时间。
所以,不难看出,准确时间是非常有价值,但是它难以理解。而简单时间更容易被理解和使用。因此本文将重点讲述如何使用简单时间,而不考虑使用准确时间。
datetime总体认识
除去用于记录准确时间的timezone部分不谈,我们能够用上的datetime中的内容,大致分为了这样几个部分。
datetime.date
一个简单的日期,假设我们现在使用的日历在万年以内有效,包含year, month, day等属性
datetime.time
一个理想化的时间,假设每一天都有86400秒,包含hour, minute, second, microsecond等属性
datetime.datetime
一个简单的日期和时间,既记录了今天是哪一天,又记录了现在是什么时间
datetime.timedelta
用于表示两个时间对象之间的时间间隔,用作计算
注意:时间的转换规则如下所示
year 年,1年中有12个月
month 月,1月中可能有28,29,30或者31日,具体要看情况而定。
特别的:一般如果冲腾讯会员,腾讯会直接把1个月理解为31天,在提供包月服务的时候,你也可以参考腾讯的做法。
hour 小时,1天中有24个小时
minute 分钟,1小时中有60分钟
second 秒,1分钟中有60秒
millisecond 毫秒,1秒中有1000毫秒
microsecond 微秒,1秒中有1百万微秒,1毫秒中有1000微秒
datetime.date
date的使用方式非常简单,初始化的时候,只要按照顺序传入year, month, day即可。
import datetime
d = datetime.date(2021, 11, 6)
print(d) # 结果为:2021-11-06
print(d.year) # 结果为:2021
print(d.month) # 结果为:11
print(d.day) # 结果为:6
常用的方法
date.weekday() 返回一个整数代表今天是星期几,0代表星期一,6代表星期日
date.isoweekday() 返回一个整数代表今天是星期几,但是此时1代表星期一,7代表星期日
date.strftime() 格式化字符串
注意,weekday()和isoweekday()的功能是一样的,是按照不同的习惯方式,进行了表示。
import datetime
d = datetime.date(2021, 11, 6)
print(d.weekday()) # 结果为:5,但是是星期六的意思
print(d.isoweekday()) # 结果为:6,表示星期六的意思
date可以使用strftime(),具体方法请看下边的日期格式化字符串,不过注意的是,如果在date中调用了时间,默认会显示0时0分0秒
datetime.time
初始化时,需要依次传入hour, minute, second, microsecond,其中hour是必须的
时间可以进行比较大小,但是不同类型的时间不可以比较(这里指的是简单时间不能与准确时间进行比较大小)
import datetime
d1 = datetime.time(23, 11, 22)
d2 = datetime.time(11, 21, 32)
print(d1 < d2) # 结果为False
time可以使用strftime(),具体方法请看下边的日期格式化字符串,不过注意的是,如果在time中调用了日期,默认会显示1900年1月1日
datetime.datetime
初始化需要传入year, month, day, hour, minute, second, microsecond,其中year, month, day是必须的
除此以外,还可以通过几种常用方法创建datetime对象
datetime.today() 通过现在的时间创建datetime对象
datetime.fromtimestamp(timestamp) 通过时间戳创建datetime对象
datetime.combine(date, time) 通过合并date和time对象,得到datetime对象
datetime.strptime(data_str, format) 通过时间字符串,得到datetime对象
使用方法如下
import datetime
import time
d1 = datetime.datetime.today() # 直接通过现在的时间,创建datetime对象
d2 = datetime.datetime.fromtimestamp(time.time()) # 通过时间戳,创建datetime对象
t1 = datetime.date(2021, 11, 6)
t2 = datetime.time(21, 33, 2)
d3 = datetime.datetime.combine(t1, t2) # 通过合并date对象和time对象,创建datetime对象
d4 = datetime.datetime.strptime("2021-11-06", "%Y-%m-%d") # 通过反向拆分时间字符串,创建datetime对象
print("d1:", d1)
print("d2:", d2)
print("d3:", d3)
print("d4:", d4)
datetime可以使用strftime(),具体方法请看下边的日期格式化字符串
datetime.timedelta
timedelta可以用来方便的进行时间的计算,参数全都是可选的,因此建议以关键字参数的形式传入,会比较清晰,默认全都是0,总共有这些参数,days, seconds, micorseconds, milliseconds, minutes, hours, weeks,参数可以是浮点数,整数,正数,负数
timedelta中,还有一些方法,可以帮助你快速的计算这段时间相当于多少秒,然后你可以通过秒,去换算成你想要的时间
timedelta.total_seconds()
比如,计算几天以后,可以选择这样做
import datetime
d = datetime.datetime.today() # 将时间初始化为现在的时间
dt = datetime.timedelta(days=10) # 初始化一段时间,为10天
d += dt # 计算10天后,是什么时候
print(d)
日期格式化字符串
常用的格式化方式
%a 缩写的星期几的表示方式,如Sun, Mon
%A 完整的星期几的表示方式,如Sunday, Monday
%b 月份的缩写,如Jan, Feb
%B 月份的全写,如January, February
%w 用整数表示星期几,0代表星期日,6代表星期六
%d 补零的十进制数表示日子,比如01, 02
%m 补零的十进制数表示月份,比如01, 02
%y 补零的十进制数表示年份,比如21, 22
%Y 世纪年份,比如2021, 2022
%H 24小时制的小时
%I 12小时制的小时,无法确定上下午
%p 上午或者下午,比如AM, PM
%M 补零后十进制表示分钟,比如01, 02
%S 补零后十进制表示秒数,比如01, 02
%f 补零后十进制表示微秒,比如000000, 000001
%j 补零后十进制的一年中的第几天,比如001, 002
%U 补零后十进制的一年中的第几周,第一个星期日以前算第0周
%W 补零后十进制的一年中的第几周,第一个星期一以前算第0周
%c 本地化的日期与时间
%x 本地化的日期
%X 本地化的时间
根据这些格式化方式,瞎老弟我自己组建了一些表示方式,仅供参考
1,2021-11-06
"%Y-%m-%d"
2,21/11/06
"%y/%m/%d"
3,2021-11-06 21:11:06
"%Y-%m-%d %H:%M:%S"
4,2021年11月06日
"%Y年%m月%d日"
5,2021/11/06 9:11:06 PM
"%Y/%m/%d %I:%M:%S %p"
6,2021.11.06
"%Y.%m.%d"
7,21:11:06
"%H:%M:%S"
8,Saturday, November 06
"%A, %B %d"
9,今天是11月06日,2021年的第44周,第310天
"今天是%m月%d日,%Y年的第%W周,第%j天"
使用方式,将写好的格式化字符串直接复制到strftime()里面即可