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 当前时区的名称
%% %号本身
参考文献: