datetime模块,在python中使用日期和时间

537 阅读6分钟

时间的划分

由于时间在全世界范围内的不同,会受到时区,政治因素和夏令时的影响。比如说,我认为现在是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()里面即可