Python中的datetime模块(第3节)


datetime模块

datetime模块也是Python的一个标准库,提供了一些日期和时间的处理功能。datetime模块是以类的方式提供多种日期和时间表达方式,常用的类包括datetime.datetime、datetime.date、datetime.time、datetime.timedelta和datetime.tzinfo,可以用来处理日期、时间以及时间的算术运算。datatime模块是在time模块的基础之上做了封装,提供更加丰富和易用的功能,适合日常编程中对日期和时间的操作。在实际应用中,推荐优先使用datetime模块,因为它提供了更直观和易用的接口。

datetime模块包括两个常量:datetime.MINYEARdatetime.MAXYEARdatetime.MINYEAR的值是1,表示datetime模块所能支持的最小年份。datetime.MAXYEAR的值是9999,表示datetime模块所能支持的最大年份。

1、datetime.date类

datetime.date类主要用于处理年、月、日等日期,datetime.date类的构造函数需要传入3个参数:year,month和day。其中year不能小于1,也不能大于9999,month和day两个参数都必须是有效且真实存在的数字,任何一个参数超出了有效日期,程序都会抛出ValueError异常。例如:

动手练一练:

import datetime

date = datetime.date(2022,8,15)
print(date)                      # 输出 2022-08-15
today = datetime.date.today()
print(today)                     # 返回当天日期
print(today.weekday())           # 返回当前星期数,星期一为0,星期二为1,依次类推
print(today.isoweekday())        # 返回当前星期数,星期一为1,星期二为2,依次类推
print(date.isoformat())          # 返回日期为ISO格式,即“YYYY-MM-DD”的字符串
print(date.strftime("%Y-%m-%d")) # 格式化输出日期
print(date.strftime("%y-%b-%d")) # 格式化输出日期

执行以上代码,输出结果为:

2022-08-15
2024-04-14
6
7
2022-08-15
2022-08-15
22-Aug-15

2、datetime.time类

datetime.time类表示一天中的(本地)时间,例如:

动手练一练:

import datetime

a = datetime.time()
print(a)

b = datetime.time(hour=6, minute=28, second=41, microsecond=0, tzinfo=None)
print(b)

执行以上代码,输出结果为:

00:00:00
06:28:41

上面的例子中,构造函数datetime.time(hour=0, minute=0, second=0, microsecond=0, tzinfo=None),其中所有的参数都是可选的,tzinfo默认值为None,其他的参数默认值为0。

datetime.time类的属性包括:

time.hour:小时,取值0 ~ 23

time.minute:分钟,取值0 ~ 59

time.second:秒,取值0 ~ 59

time.microsecond:微秒,取值0~999999

datetime.time类中包括两个常量min和max,datetime.time.min表示datetime.time类支持的最小值,datetime.time.max表示datetime.time类支持的最大值,例如:

动手练一练:

import datetime

print(datetime.time.min)
print(datetime.time.max)

执行以上代码,输出结果为:

00:00:00
23:59:59.999999

datetime.time类同样可以格式化日期字符串,例如:

动手练一练:

import datetime

b = datetime.time(hour=6, minute=28, second=41, microsecond=456, tzinfo=None)

print(b.isoformat())  # 返回时间为ISO格式,即HH:MM:SS的字符串
print(b.strftime("%H:%M:%S"))  # 格式化输出时间
print(b.strftime("%p %I:%M:%S:%f"))  # 格式化输出时间

执行以上代码,输出结果为:

06:28:41.000456
06:28:41
AM 06:28:41:000456

上面的例子中,isoformat()函数可以返回ISO格式的时间字符串,即HH:MM:SS的字符串,strftime()函数可以格式化输出时间。

3、datetime.datetime类

datetime.datetime类是表示日期和时间的类,是datetime模块中date类和time类的结合体,包括date类与time类的所有信息,date类和time类中具有的方法和属性,datetime.datetime类都具有。例如:

动手练一练:

import datetime

d = datetime.datetime(year=2022,month=6,day=9,hour=15,second=23)
print(d)

执行以上代码,输出结果为:

2022-06-09 15:00:23

这里需要注意的是,datetime.datetime类中的year、month、day这3个参数是必须的,其余参数是可选的,默认为0。

datetime.datetime.today()函数返回一个当前本地时间的datetime.datetime类的对象。

动手练一练:

import datetime

d = datetime.datetime.today()
print(d)

执行以上代码,输出结果为:

2024-04-14 10:52:37.936403

上面的例子中,datetime.datetime.today()函数可以获取当前的日期和时间。

datetime.datetime.now(tz=None)函数也是返回一个当前本地时间的datetime.datetime类的对象,tz=None参数是可选的,表示时区信息,当不指定时区时,datetime.datetime.now()和datetime.datetime.today()是一样的结果,如果指定时区,则返回指定时区的时间,例如:

动手练一练:

import datetime

print(datetime.datetime.now())
print(datetime.datetime.today())

执行以上代码,输出结果为:

2024-04-14 11:41:55.481717
2024-04-14 11:41:55.481717

datetime.datetime.utcnow()函数返回一个当前UTC时间的datetime对象,可以获取现在的格林威治时间,例如:

动手练一练:

import datetime

print(datetime.datetime.utcnow())  # 输出 现在的格林威治时间
print(datetime.datetime.now())  # 输出 当前本地时间

执行以上代码,输出结果为:

2024-04-14 03:57:44.473281
2024-04-14 11:57:44.473281

上面的例子中,datetime.datetime.utcnow()函数可以获取现在的格林威治时间,比中国当前本地时间慢8个小时。

datetime.datetime.fromtimestamp()函数可以根据时间戳创建一个datetime对象,可选参数tz指定时区信息。例如:

动手练一练:

import datetime

print(datetime.datetime.fromtimestamp(1234567890, tz=None))
print(datetime.datetime.fromtimestamp(1234567890))

执行以上代码,输出结果为:

2009-02-14 07:31:30
2009-02-14 07:31:30

datetime.datetime.now()函数返回的datetime.datetime类的对象中,可以使用date()函数获取date对象,time()函数获取time对象。例如:

动手练一练:

import datetime

a = datetime.datetime.now()
print(a)
print(a.date())
print(a.time())

执行以上代码,输出结果为:

2024-04-14 12:30:01.858155
2024-04-14
12:30:01.858155

上面的例子中,date对象和time对象可以从datetime.datetime类的对象中分离出来,也可以通过combine方法合并成新的datetime对象,例如:

动手练一练:

import datetime

a = datetime.date(2023, 6, 15)
b = datetime.time(9, 15, 27)
d = datetime.datetime.combine(a, b)
print(d)

执行以上代码,输出结果为:

2023-06-15 09:15:27

strftime()函数可以格式化输出日期时间,例如:

动手练一练:

import datetime

a = datetime.date(2023, 6, 15)
b = datetime.time(9, 15, 27)
d = datetime.datetime.combine(a, b)
print(d.strftime("%Y-%m-%d %H:%M:%S"))
print(d.strftime("%y-%m-%d %p %I:%M:%S"))

执行以上代码,输出结果为:

2023-06-15 09:15:27
23-06-15 AM 09:15:27

4、datetime.timedelta类

datetime.timedelta类表示时间间隔,即两个时间点之间的长度,datetime.timedelta类的属性包含:日期、秒、微妙、毫秒、分钟、小时和星期,所有的属性都是可选的并且默认值是0。当程序想要表示一段时间,比如几年、几个月、几天、几小时或几分钟,而不是一个特定的时间点时,timedelta非常有用。例如:

动手练一练:

import datetime

a = datetime.datetime(2022,5,16,10,22,36)
b = a + datetime.timedelta(weeks=-2) # 减掉两个星期
c = a + datetime.timedelta(days=10)  # 增加10天

print(a)      # 输出 2022-05-16 10:22:36
print(b)      # 输出 2022-05-02 10:22:36
print(c)      # 输出 2022-05-26 10:22:36
print(a - b)  # 输出 14 days, 0:00:00
print(c - a)  # 输出 10 days, 0:00:00

执行以上代码,输出结果为:

2022-05-16 10:22:36
2022-05-02 10:22:36
2022-05-26 10:22:36
14 days, 0:00:00
10 days, 0:00:00

5、datetime.timezone类

datetime.timezone类是tzinfo的子类,所以也可以使用datetime.timezone类来实现想要的时区信息。datetime.timezone()这个构造函数包括两个参数,允许你定义一个特定的时区,其中第一个参数表示与协调世界时(UTC)的偏移量,而第二个参数可选,用于为时区指定一个名称,例如:

动手练一练:

import datetime

# 创建一个时区对象,表示UTC+8
a = datetime.timezone(datetime.timedelta(hours=8), name='中国/北京时间')
c = datetime.timezone(datetime.timedelta(hours=0), name='英国/格林威治')

# 创建一个带有时区信息的日期时间对象
b = datetime.datetime(2023, 7, 19, 5, 36, 22, tzinfo = a)
a1 = datetime.datetime.now(a)
c1 = datetime.datetime.now(c)

# 打印结果
print(f"日期时间对象 {b}, 所处时区:{a}")
print(a1)
print(c1)

执行以上代码,输出结果为:

日期时间对象 2023-07-19 05:36:22+08:00 所处时区中国/北京时间
2024-04-14 14:11:27.190136+08:00
2024-04-14 06:11:27.190136+00:00