python-datetime模块简介

本文深入讲解Python的datetime模块,涵盖datetime、date、time、timedelta和tzinfo五大核心对象的用法,以及如何进行时间运算,包括时间差计算、时区处理和日期格式化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0.摘要

本文主要介绍datetime模块中五个核心对象:datetime(时间日期类型), date(日期类型), time(时间类型), tzinfo(时区类型),和timedelta(时间差类型),并介绍利用datetime模块进行时间运算的方法。

 

1.datetime

datetime对象可以用来表示精确的日期和时间,在实例化datetime对象时,year, month, day是必填项,hour, minute, second, microsecond(微秒), tzinfo(时区)是可选项。

import datetime

now = datetime.datetime.now()
print(now)    #2019-02-16 14:32:46.640383
spring_festival = datetime.datetime(year=2019, month=2, day=5)
print(spring_festival.day)   #5

 

2.date

date对象只能表示日期。date实例化时提供三个参数:year, month, day,且没有时区(tzinfo)属性的。

today = datetime.date.today()
print(today)   #2019-02-16
tomorrow = datetime.date(year=2019, month=2, day=17)
print(tomorrow) #2019-02-17

 

3.time

time对象只能用来表示时间。time对象实例化时提供三个参数:hour,minute,second,可以具有时区(tzinfo)属性。

six_ten = datetime.time(hour=6, minute=10, second=0)
print(six_ten)   #06:10:00

 

4.timedelta

timedelta对象表示一个时间段,timedelta对象可以通过手动实例化得到,也可以通过上述三个对象(datetime, date, time)相减得到。

import datetime
import time

time1 = datetime.datetime.now()
print(time1)    #2019-02-16 14:50:10.074213
time.sleep(10.5)
time2 = datetime.datetime.now()
print(time2)   #2019-02-16 14:50:20.575139
delta = time2 - time1
print(delta)  #0:00:10.500926
print(time2 == time1 + delta)  #True
time1 = datetime.datetime.now()
print(time1)    #2019-02-16 20:33:07.657745
time3 = time1 + datetime.timedelta(seconds=10)
print(time3)    #2019-02-16 20:33:17.657745

 

5.tzinfo

import datetime
import pytz

utc_tz = pytz.timezone("UTC")
print(utc_tz)
shanghai_tz = pytz.timezone('Asia/Shanghai')
print(shanghai_tz)
local_naive = datetime.datetime.now()
print(local_naive)   #2019-02-16 16:28:02.208383
local_aware = datetime.datetime.now().replace(tzinfo=shanghai_tz)
print(local_aware)   #2019-02-16 16:28:02.208383+08:06

tzinfo对象是用来表示该时区相对UTC时间差值,和该地区是否执行夏时令的对象。datetime模块所提供的的tzinfo对象是一个抽象基类,也就是说我们不应该直接实例化此对象, 而应该以此类为基类,定义出子类,然后再实例化以供使用。在子类化的时候,需要自定义很多方法,非常繁琐。还好python提供了一个pytz的库,里面自带了适合各个国家和时区的tzinfo对象,我们可以直接使用。

在python中,我们把tzinfo为空的datetime对象称为是aware的,把tzinfo不为空的datetime对象称为naive的。使用datetime模块时,除非手动指定tzinfo属性,否则,创建出来的datatime对象tzinfo属性都默认为空。

aware 对象具有关于应用规则和时间调整的充分的信息,例如时区和夏令时信息,来定位相对其他aware 对象的位置。aware对象用于表示时间的一个特定的时刻,它是明确无二的。

naive 对象没有充分的信息来明确地相对其他日期/时间定位它自己。一个 naive 对象表示的是世界协调时(UTC)、本地时间还是其它时区的时间完全取决于程序,就像一个特定的数字表示的是米、英里还是质量一样。

注意,aware类型的datetime对象,只能和aware类型的datetime对象进行运算(相减,大小比较等)。navie类型的datetime对象,只能和naive类型的datetime对象进行运算(相减,大小比较等)。aware类型和naive类型之间运算会报错:

 

6.时间计算

import datetime

now = datetime.datetime.now()
print("Now is ",now)  
#Now is  2019-02-16 16:28:46.576436

# 前一小时
d1 = now - datetime.timedelta(hours=1)
print("One hour ago is ",d1.strftime("%Y-%m-%d %H:%M:%S"))
# One hour ago is  2019-02-16 15:28:46

# 前一天
d2 = now - datetime.timedelta(days=1)
print("One day ago is ",d2.strftime("%Y-%m-%d %H:%M:%S"))
# One day ago is  2019-02-15 16:28:46

# 上周日
print("Today is ",now.strftime("%A"))  
# Today is  Saturday
d3 = now - datetime.timedelta(days=now.isoweekday())
print("Last Sunday is ",d3.strftime("%Y-%m-%d %H:%M:%S"))
# Last Sunday is  2019-02-10 16:28:46

# 上周一
d31 = d3 - datetime.timedelta(days=6)
print("Last Monday is ",d31.strftime("%Y-%m-%d %H:%M:%S"))
# Last Monday is  2019-02-04 16:28:46

# 上个月最后一天
d4 = now - datetime.timedelta(days=now.day)
print("Last day of last month is ",d4.strftime("%Y-%m-%d %H:%M:%S"))
# Last day of last month is  2019-01-31 16:28:46

# 上个月第一天
print("First day of last month is ",datetime.datetime(d4.year, d4.month, 1))
# First day of last month is  2019-01-01 00:00:00

其中,strftime形式为:

strftime(format[, tuple]) -> string

将指定的struct_time(默认为当前时间),根据指定的格式化字符串输出

 

python中时间日期格式化符号:

%y 两位数的年份表示(00-99)

%Y 四位数的年份表示(000-9999)

%m 月份(01-12)

%d 月内中的一天(0-31)

%H 24小时制小时数(0-23)

%I 12小时制小时数(01-12)

%M 分钟数(00=59)

%S 秒(00-59)

 

%a 本地简化星期名称

%A 本地完整星期名称

%b 本地简化的月份名称

%B 本地完整的月份名称

%c 本地相应的日期表示和时间表示

%j 年内的一天(001-366)

%p 本地A.M.或P.M.的等价符

%U 一年中的星期数(00-53)星期天为星期的开始

%w 星期(0-6),星期天为星期的开始

%W 一年中的星期数(00-53)星期一为星期的开始

%x 本地相应的日期表示

%X 本地相应的时间表示

%Z 当前时区的名称

%% %号本身

 

参考文献:

https://www.jianshu.com/p/1957c4cab0a3

https://www.cnblogs.com/guigujun/p/6149770.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值