python 时间模块(time ,datetime,calendar)

时间:2022-08-24 21:42:27

  Python中提供了时间相关的内置模块,我们主要用的是:time模块、datetime模块和calendar模块

⽇期格式化的标准:

%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 当前时区的名称
%% %号本身

 

一、时间相关的术语

  • UTC time Coordinated Universal Time,世界协调时,又称 格林尼治天文时间、世界标准时间。与UTC time对应的是各个时区的local time,东N区的时间比UTC时间早N个小时,因此UTC time + N小时 即为东N区的本地时间;而西N区时间比UTC时间晚N个小时,即 UTC time - N小时 即为西N区的本地时间; 中国在东8区,因此比UTC时间早8小时,可以以UTC+8进行表示。

  • epoch time 表示时间开始的起点;它是一个特定的时间,不同平台上这个时间点的值不太相同,对于Unix而言,epoch time为 1970-01-01 00:00:00 UTC。

  • timestamp(时间戳) 也称为Unix时间 或 POSIX时间;它是一种时间表示方式,表示从格林尼治时间1970年1月1日0时0分0秒开始到现在所经过的毫秒数,其值为float类型。 但是有些编程语言的相关方法返回的是秒数(Python就是这样),这个需要看方法的文档说明。需要说明的是时间戳是个差值,其值与时区无关。

一、time模块

  1、时间戳(timestamp):时间戳使用的是从1970年01月01日 00点00分00秒到现在一共经过了多少秒。。。使用的是float来表示。

import time
# time.time() 表示时间戳
s=time.time()#1542167172.0260832  数据库中存储采用的是这种时间

  2、格式化时间(strftime):这个时间主要可以把时间进行任意的格式化输出。

import time
s2=time.strftime("%Y-%m-%d  %H:%M:%S") #2018-11-14  19:27:47

  3、结构化时间(struct_time):这个时间主要可以把时间分类划分。

time.struct_time(tm_year=2018, tm_mon=11, tm_mday=14, tm_hour=12, tm_min=3, tm_sec=9, tm_wday=2, tm_yday=318, tm_isdst=0)

  4、三种时间之间的转换

  时间戳 -> 结构化时间:time.localtime( 时间戳)、time.gmtime( 时间戳)

import time
s=time.localtime(18888888) #时区问题  gmtime :格林尼治时间
# time.struct_time(tm_year=1970, tm_mon=8, tm_mday=7, 
# tm_hour=22, tm_min=54, tm_sec=48, tm_wday=4, tm_yday=219, tm_isdst=0)

  结构化时间 -> 格式化时间:time.strftime(时间格式,结构化时间)

import time
s=time.localtime()
s2=time.strftime("%Y-%m-%d %H:%M:%S",s)
print(s2) #2018-11-14 19:47:30

  格式化时间 ->结构化时间:time.strptime(格式化时间,相应的格式字符串)

import time
s1="1995-3-15 03:29:37"
struct_s1=time.strptime(s1,"%Y-%m-%d %H:%M:%S")
print(struct_s1)
#time.struct_time(tm_year=1995, tm_mon=3, tm_mday=15, #tm_hour=3, tm_min=29, tm_sec=37, tm_wday=2, tm_yday=74, #tm_isdst=-1)

  结构化时间 -> 时间戳:time.mktime(结构化时间)

import time
s=time.localtime()
s2=time.mktime(s)
print(s2)#1542196252.0

  5、时间差的计算  

计算时间差
# 假定给两个时间
import time
s1="2017-9-20 03:29:37"
s2="2018-3-15 12:3:55"
# # 格式化时间 -> 结构化时间
struct_s1=time.strptime(s1,"%Y-%m-%d %H:%M:%S")
struct_s2=time.strptime(s2,"%Y-%m-%d %H:%M:%S")
# 结构化时间 -> 时间戳
s1_chou=time.mktime(struct_s1)
s2_chou=time.mktime(struct_s2)
time_cha=abs(s2_chou-s1_chou)
# 时间戳-> 结构化时间
new_time=time.gmtime(time_cha)
# time.struct_time(tm_year=1996, tm_mon=7, tm_mday=29, tm_hour=17, tm_min=1, tm_sec=19, tm_wday=0, tm_yday=211, tm_isdst=0)
y_cha=new_time.tm_year-1970
m_cha=new_time.tm_mon-1
d_cha=new_time.tm_mday-1
H_cha=new_time.tm_hour
M_cha=new_time.tm_min
S_cha=new_time.tm_sec
print("两个时间相隔 %s 年 %s 月 %s 日 %s 时 %s 分 %s 秒"% (y_cha,m_cha,d_cha,H_cha,M_cha,S_cha))

import time
true_time=time.mktime(time.strptime('2017-09-11 08:30:00','%Y-%m-%d %H:%M:%S'))
time_now=time.mktime(time.strptime('2017-09-12 11:00:00','%Y-%m-%d %H:%M:%S'))
dif_time=time_now-true_time
struct_time=time.gmtime(dif_time)
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))
#

  利用时间戳计算时、分、秒

hours=dif_time//3600
minute=dif_time%3600//60
secend=dif_time%3600%60

print("过去了 %s 小时 %s 分钟 %s秒"%(hours,minute,secend))

 

二、datetime模块

 

三、calendar模块

  1、calendar.calendar(year,w=2,l=1,c=6) 返回某年的日历,每日宽度w字符,每行21*w+8+2*c,i表示星期

python 时间模块(time ,datetime,calendar)

 

 

  2、calendar.firstweekday( )  返回当前每周起始日期的设置。默认情况下,首次载入caendar模块时返回0,即星期一。

  3、calendar.isleap(year) 判断是否为润年

  4、calendar.leapdays(y1,y2)  返回[y1, y2)润年总数

  5、calendar.month(year,month,w=2,l=1) 返回某年某月的的日历

  6、calendar.monthcalendar(year,month) 返回某年某月日历,以列表形式显示

  7、calendar.setfirstweekday(weekday)   设置每周的起始日期码。0(星期一)到6(星期日)。

  8、calendar.timegm(tupletime)  和time.gmtime相反:接受一个时间元组形式,返回该时刻的时间辍

             (1970纪元后经过的浮点秒数)。

  9、calendar.weekday(year,mouth,day) 返回星期码,0表示星期1