python模块包括标准模块、自定义模块和外部模块。时间模块是python的内部标准模块之一。通常用的是time和datetime模块。
一、time模块
time模块提供了各种时间相关的函数。time模块有三种表示形式:时间戳(timestamp)、字符串时间(format time)、结构化时间(struct_time)。
1.时间戳
时间戳表示从1970年1月1日0点0分0秒开始按秒计算的偏移量。一般整数部分有10位的小数。使用time.time()获取。
import time
time_stamp = time.time()
print(time_stamp)
输出结果:
>>> 1675236262.1582968
2.字符串时间
字符串时间,是按照需要的时间格式以字符串的方式返回当前的时间。使用time.strftime(format, p_tuple=None)获取,传参为日期时间格式化符号。
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 当前时区的名称
- %% %号本身
print(time.strftime("%Y-%m-%d %H:%M:%S"))
输出结果:
>>> 2023-02-01 15:48:24
3.结构化时间
结构化时间又称时间元组,这个时间元组共有9个整型内容,分别表示不同的时间含义。使用time.localtime()获取本地时间;或者使用time.gmtime()获取UTC时间(与英国伦敦的时间一致)。
- tm_year表示年
- tm_mon表示月
- tm_mday表示号
- tm_hour表示小时
- tm_min表示分种
- tm_sec表示秒
- tm_wday表示周几(但是是从0开始,比如星期一为0)
- tm_yday表示一年的第几天(从1开始,包括当天)
- tm_isdst表示是否是夏令时(默认为-1,0:表示正常格式,1:表示为夏令时格式,-1:表示根据当前的日期时间格式来判定)
print(time.localtime())
输出结果:
>>> time.struct_time(tm_year=2023, tm_mon=2, tm_mday=1, tm_hour=16, tm_min=10, tm_sec=53, tm_wday=2, tm_yday=32, tm_isdst=0)
print(time.gmtime())
输出结果:
>>> time.struct_time(tm_year=2023, tm_mon=2, tm_mday=1, tm_hour=8, tm_min=20, tm_sec=40, tm_wday=2, tm_yday=32, tm_isdst=0)
4.三种时间形式之间的转化
1)结构化时间的转化
结构化时间转时间戳:time.mktime(p_tuple),传入结构化时间。
struct_time = time.localtime()
print(struct_time)
print(time.mktime(struct_time))
>>> time.struct_time(tm_year=2023, tm_mon=2, tm_mday=10, tm_hour=21, tm_min=36, tm_sec=13, tm_wday=4, tm_yday=41, tm_isdst=0)
>>> 1676036173.0
结构化时间转字符串时间: time.strftime(format, p_tuple=None),传入时间日期格式化符号和结构化时间。
print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
输出结果:
>>> 2023-02-09 10:29:52
2)时间戳的转化
时间戳转结构化时间:time.localtime(),可以传入时间戳数值。
time_stamp = time.time()
print(time.localtime(time_stamp))
输出结果:
>>> time.struct_time(tm_year=2023, tm_mon=2, tm_mday=1, tm_hour=16, tm_min=22, tm_sec=3, tm_wday=2, tm_yday=32, tm_isdst=0)
时间戳转字符串时间是无法直接转换的。需要先将时间戳转化为结构化时间:time.localtime(time_stamp),再将结构化时间转化为字符串时间:time.strftime(format, p_tuple=None)。
time_stamp = time.time()
print(time.strftime("%Y-%m-%d", time.localtime(time_stamp)))
输出结果:
>>> 2023-02-01
3)字符串时间的转化
字符串时间转结构化时间:time.strptime(string, format),传入字符串时间和字符串时间的格式。
string_time = "2023-03-02"
print(time.strptime(string_time,'%Y-%m-%d'))
输出结果:
>>> time.struct_time(tm_year=2023, tm_mon=3, tm_mday=2, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=61, tm_isdst=-1)
字符串时间转时间戳也是不能直接转化的。需要先将字符串时间转为结构化时间:time.strptime(string, format),再将结构化时间转为时间戳:time.mktime(p_tuple)。
struct_time = time.strptime("2023-03-02",'%Y-%m-%d')
print(time.mktime(struct_time))
输出结果:
>>> 1677686400.0
4)补充
将结构化时间转化为本地时间字符串:time.asctime(p_tuple=None)。
print(time.asctime(time.localtime()))
输出结果:
>>> Thu Feb 9 10:55:09 2023
将时间戳转化为本地时间字符串:time.ctime(),和time.asctime(p_tuple=None)结果一样,不用传入结构化时间参数。
print(time.ctime())
输出结果:
>>> Thu Feb 9 10:57:16 2023
总结图:
5.time模块的时间计算
time模块的格式化时间和字符串时间是无法直接进行加减的,只能使用时间戳进行加减,最后再转换回struct_time时间或字符串时间,计算过程较为麻烦。
举例:
计算两个字符串时间的差值,需要先将两个字符串时间都转为结构化时间再转为时间戳;两个时间戳相减后,又因为时间戳表示的是一个偏移量,所有两个时间戳的差值还需要再减去时间戳的初值:1970年1月1号0时0分0秒。
import time
stamp1 = time.mktime(time.strptime("2023-02-10 08:30:00", "%Y-%m-%d %H:%M:%S"))
stamp2 = time.mktime(time.strptime("2023-02-11 12:30:00", "%Y-%m-%d %H:%M:%S"))
res = stamp2-stamp1
print(res)
struct_time = time.gmtime(res)
print(struct_time)
print("过去了%d年%d月%d天%d小时%d分钟%d秒" % (struct_time.tm_year - 1970, struct_time.tm_mon - 1, struct_time.tm_mday - 1, struct_time.tm_hour, struct_time.tm_min, struct_time.tm_sec))
# 减去初值
输出结果:
>>> 100800.0
>>> time.struct_time(tm_year=1970, tm_mon=1, tm_mday=2, tm_hour=4, tm_min=0, tm_sec=0, tm_wday=4, tm_yday=2, tm_isdst=0)
>>> 过去了0年0月1天4小时0分钟0秒
二、datetime模块
datetime模块也是python处理时间和日期的标准库。与time模块相比,datetime模块提供的接口更直观、易用,功能也更加强大。
datetime模块中有time类、date类、datetime类、timedelta类等。
1.datetime类
datetime类:表示日期时间的类,date类和time类的综合使用,可以处理年、月、日、时、分、秒,是datetime模块中比较常用的类,可以获取当前的日期和时间。
1)获取当前日期时间的datetime对象(没有时区信息):datetime.today()
from datetime import datetime
datetime1 = datetime.today()
print(datetime1)
print(type(datetime1))
输出结果:
>>> 2023-02-10 12:17:23.581385
>>> <class 'datetime.datetime'>
2)获取当前日期时间的datetime对象(有时区信息):datetime.now([tz]) ,如果没有使用tz作为参数,其结果与today方法一样;如果有时区信息,则返回的时区对应的时间。
from datetime import datetime
datetime1 = datetime.now()
print(datetime1)
print(type(datetime1))
输出结果:
>>> 2023-02-10 10:12:35.330442
>>> <class 'datetime.datetime'>
3)获取指定日期时间的datetime对象,datetime(year, month, *args),参数不填默认为0
datetime1 = datetime(2023, 2, 10, 10, 35)
print(datetime1)
print(type(datetime1))
输出结果:
>>> 2023-02-10 10:35:00
>>> <class 'datetime.datetime'>
4)将datetime对象转换为时间戳:strtime.timestamp()
now_time = datetime.now()
print(now_time)
print(type(now_time))
print(now_time.timestamp())
输出结果:
>>> 2023-02-10 11:38:28.214709
>>> <class 'datetime.datetime'>
>>> 1676000308.214709
5)将时间戳转换为datetime对象:datetime.fromtimestamp(strtime)
stamp_time = time.time()
print(stamp_time)
datetime1 = datetime.fromtimestamp(stamp_time)
print(datetime1)
print(type(datetime1))
输出结果:
>>> 1676000181.704188
>>> 2023-02-10 11:36:21.704188
>>> <class 'datetime.datetime'>
6)将字符串时间转换为datetime对象:datetime.strptime(date_string, format),传入参数为字符串时间和时间日期格式化符号。
time1 = datetime.strptime("2022-8-30", "%Y-%m-%d")
print(time1)
print(type(time1))
输出结果:
>>> 2022-08-30 00:00:00
>>> <class 'datetime.datetime'>
2.date类
date类:表示日期的类,主要用于处理年、月、日。date类对象结构为date(year, month, day),有year,month和day三个属性。
1)获取当前日期的date对象:date.today()
from datetime import date
date1 = date.today()
print(date1)
print(type(date1))
输出结果:
>>> 2022-08-30 00:00:00
>>> <class 'datetime.datetime'>
2)获取指定日期的date对象:date(year, month, day)
date1 = date(2023,2,1)
print(date1)
print(type(date1))
输出结果:
>>> 2023-02-01
>>> <class 'datetime.date'>
3)将时间戳转换为date对象:date.fromtimestamp(timestamp)
from datetime import date
from datetime import datetime
date1 = date.fromtimestamp(datetime.now().timestamp())
print(date1)
print(type(date1))
输出结果:
>>> 2023-02-10
>>> <class 'datetime.date'>
4)将"YYYY-MM-DD"格式的表示日期的字符串时间转换为date对象:date.fromisoformat(str)
date1 = date.fromisoformat("2023-02-03")
print(date1)
print(type(date1))
输出结果:
>>> 2023-02-03
>>> <class 'datetime.date'>
5)date对象的属性
date1 = date.today()
print(date1)print(date1.year)
print(date1.month)
print(date1.day
输出结果:
>>> 2023-02-10
>>> 2023
>>> 2
>>> 10
3.time类
time类:表示时间的类,主要用于处理时、分、秒。
time类对象结构为time([hour[, minute[, second[, microsecond[, tzinfo]]]]])。time对象所有的参数都是可选的(除tzinfo之外的参数不指定默认为0)。tzinfo可以是None或者是tzinfo子类的一个实例。
1)获取指定时间的time对象:time(hour, minute, second)
from datetime import time
time1 = time(8,10,12)
print(time1)
print(type(time1))
输出结果:
>>> 08:10:12
>>> <class 'datetime.time'>
2)将time对象转换为字符串时间:time.strftime(time, format)
from datetime import time
time1 = time.strftime(time(8,10,12), "%H:%M:%S")
print(time1)
print(type(time1))
输出结果:
>>> 08:10:12
>>> <class 'str'>
4.timedelta类
timedelata类:表示时间间隔,主要用于做时间加减。
timedelta类可以很方便地对datetime.date、 datetime.time和datetime.datetime对象做算术运算。
1)timedelta类的对象:timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, hours=0, weeks=0)
from datetime import timedelta
print(timedelta(2))
print(type(timedelta(2)))
输出结果:
>>> 2 days, 0:00:00
>>> <class 'datetime.timedelta'>
2)datetime对象的日期时间计算
获取后一天的日期时间,且加两小时
datetime1 = datetime1.today()
print(datetime1)
res = datetime1 + timedelta(days=1, hours=2)
print(res)
print(type(res))
输出结果:
>>> 2023-02-10 12:57:19.249039
>>> 2023-02-11 14:57:19.249039
>>> <class 'datetime.datetime'>
获取一天的日期时间,且加两小时
datetime1 = datetime1.today()
print(datetime1)
res = datetime1 + timedelta(days=-1, hours=2)
print(res)
print(type(res))
输出结果:
>>> 2023-02-10 13:01:03.517030
>>> 2023-02-09 15:01:03.517030
>>> <class 'datetime.datetime'>
两个日期时间相减
datetime1 = datetime(2023,2,10,8,30,0)
datetime2 = datetime(2023,2,10,9,0,0)
res = datetime2-datetime1
print(res)
print(type(res))
输出结果:
>>> 0:30:00
>>> <class 'datetime.timedelta'>
3)date对象的日期计算
获取后一天的日期
date1 = date.today()
print(date1)
res = date1 + timedelta(days=1)
print(res)
print(type(res))
输出结果:
>>> 2023-02-10
>>> 2023-02-11
>>> <class 'datetime.date'>
获取前一天的日期
date1 = date.today()
print(date1)
res = date1 + timedelta(days=-1)
print(res)
print(type(res))
输出结果:
>>> 2023-02-10
>>> 2023-02-09
>>> <class 'datetime.date'>
两个日期相减
date1 = date(2023,2,10)
date2 = date(2023,2,9)
res = date1-date2
print(res)
print(type(res))
输出结果:
>>> 1 day, 0:00:00
>>> <class 'datetime.timedelta'>