https://www.cnblogs.com/awakenedy/articles/9182036.html
https://www.cnblogs.com/fclbky/articles/4098204.html
https://blog.csdn.net/sunjinjuan/article/details/79080068
https://www.cnblogs.com/lichunl/p/9098024.html
目录
在Python中表示时间的方式有:
- 时间戳:表示的是从1970年1月1日00:00开始按秒计算的偏移量。 time.time()用于获取当前时间戳,返回的是float类型。
- 格式化的时间字符串:‘1998-01-01’ time.strftime()用于实现格式化日期。
%y 两位数的年份表示(00-99) %m 月份(01-12) %Y 四位数的年份表示(000-9999) %d 月内中的一天(0-31) %H 24小时制小时数(0-23) %I 12小时制小时数(01-12) %M 分钟数(00-59) %S 秒(00-59) %a 本地简化星期名称(‘Sun’) %A 本地完整星期名称(‘Sunday’) %b 本地简化的月份名称(‘Sep’) %B 本地完整的月份名称 %c 本地相应的日期表示和时间表示 %j 年内的一天(001-366) %p 显示本地为A.M.还是P.M.的等价符 %x 本地相应的日期表示('09/22/19') %U 一年中的星期数(00-53)星期天为星期的开始 %X 本地相应的时间表示('21:17:55') %W 一年中的星期数(00-53)星期一为星期的开始 %Z 当前时区的名称 %w 星期几(0-6),星期天为星期的开始 %% %号本身 - 时间元组struct_time (共九个元素0-8):返回struct_time的函数主要有:gmtime()、localtime()、strptime()。
序号index 属性 值values 0 4位数年(tm_year) 2008 1 月(tm_mon) 1-12 2 日(tm_mday) 1-31 3 小时(tm_hour) 0-23 4 分钟(tm_min) 0到59 5 秒(tm_sec) 0到61 (60或61 是闰秒) 6 一周的第几日(tm_wday) 0到6 (0是周一) 7 一年的第几日(tm_yday) 1到366 (儒略历) 8 夏令时(tm_isdst) -1, 0, 1, -1是决定是否为夏令时的旗帜
注意:由于Python的time模块主要调用C库,因为这些函数的语义因平台而异,所以使用时最好查阅平台相关文档。
1、时间戳:
>>> import time
>>> time.time()
1569156835.5634894
2、格式化时间: time.strftime()
>>> time.strftime('%Y-%m-%d-%M-%S %A %j')
'2019-09-22-21-28 Sunday 265'
3、时间元组
>>> time.localtime()
time.struct_time(tm_year=2019, tm_mon=9, tm_mday=22,
tm_hour=21, tm_min=32, tm_sec=51, tm_wday=6,
tm_yday=265, tm_isdst=0)
>>> print(time.mktime(time.localtime(100000000)))
100000000.0
>>> print(time.strptime('1999-09-09'))
Traceback (most recent call last):
File "<pyshell#46>", line 1, in <module>
print(time.strptime('1999-09-09'))
File "D:\python\anzhuang\lib\_strptime.py", line 559, in _strptime_time
tt = _strptime(data_string, format)[0]
File "D:\python\anzhuang\lib\_strptime.py", line 362, in _strptime
(data_string, format))
ValueError: time data '1999-09-09' does not match format '%a %b %d %H:%M:%S %Y'
>>> print(time.strptime('1999-09-09','%Y-%m-%d'))
time.struct_time(tm_year=1999, tm_mon=9, tm_mday=9, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=252, tm_isdst=-1)
>>> print(time.strftime('%d/%m/%Y %H:%M:%S',time.localtime(100000000)))
03/03/1973 17:46:40
>>> time.asctime()
'Sun Sep 22 22:11:14 2019'
>>> time.ctime()
'Sun Sep 22 22:12:28 2019'
Time 模块
Time 模块包含了以下内置函数,既有时间处理的,也有转换时间格式的:
序号 | 函数及描述 |
---|---|
1 | time.altzone 返回格林威治西部的夏令时地区的偏移秒数。如果该地区在格林威治东部会返回负值(如西欧,包括英国)。对夏令时启用地区才能使用。 |
2 | time.asctime([tupletime]) 接受时间元组并返回一个可读的形式为"Tue Dec 11 18:07:14 2008"(2008年12月11日 周二18时07分14秒)的24个字符的字符串。 |
3 | time.clock( ) 用以浮点数计算的秒数返回当前的CPU时间。用来衡量不同程序的耗时,比time.time()更有用。 |
4 | time.ctime([secs]) 作用相当于asctime(localtime(secs)),未给参数相当于asctime() |
5 | time.gmtime([secs]) 接收时间戳(1970纪元后经过的浮点秒数)并返回格林威治天文时间下的时间元组t。注:t.tm_isdst始终为0 |
6 | time.localtime([secs]) 接收时间戳(1970纪元后经过的浮点秒数)并返回当地时间下的时间元组t(t.tm_isdst可取0或1,取决于当地当时是不是夏令时)。 |
7 | time.mktime(tupletime) 接受时间元组并返回时间戳(1970纪元后经过的浮点秒数)。 |
8 | time.sleep(secs) 推迟调用线程的运行,secs指秒数。 |
9 | time.strftime(fmt[,tupletime]) 接收以时间元组,并返回以可读字符串表示的当地时间,格式由fmt决定。 |
10 | time.strptime(str,fmt='%a %b %d %H:%M:%S %Y') 根据fmt的格式把一个时间字符串解析为时间元组。 |
11 | time.time( ) 返回当前时间的时间戳(1970纪元后经过的浮点秒数)。 |
12 | time.tzset() 根据环境变量TZ重新初始化时间相关设置。 |
time.sleep()函数:用于将当前线程交出,要求它等待系统将再次唤醒,如果写程序只有一个线程,这十几上就会阻塞进程,什么也不做。 或者理解为线程推迟指定的时间运行,单位为秒,表示进程挂起的时间。
日历(Calendar)模块
此模块的函数都是日历相关的,例如打印某月的字符月历。
星期一是默认的每周第一天,星期天是默认的最后一天。更改设置需调用calendar.setfirstweekday()函数。模块包含了以下内置函数:
序号 | 函数及描述 |
---|---|
1 | calendar.calendar(year,w=2,l=1,c=6) 返回一个多行字符串格式的year年年历,3个月一行,间隔距离为c。 每日宽度间隔为w字符。每行长度为21* W+18+2* C。l是每星期行数。 |
2 | calendar.firstweekday( ) 返回当前每周起始日期的设置。默认情况下,首次载入 calendar 模块时返回 0,即星期一。【配合setfirstweekday()作更改】 |
3 | calendar.isleap(year) 是闰年返回 True,否则为 False。 >>> print(calendar.isleap(2000)) 返回为:True >>> print(calendar.isleap(1900)) 返回为:False |
4 | calendar.leapdays(y1,y2) 返回在Y1,Y2两年之间的闰年总数。 |
5 | calendar.month(year,month,w=2,l=1) 返回一个多行字符串格式的year年month月日历,两行标题,一周一行。每日宽度间隔为w字符。每行的长度为7* w+6。l是每星期的行数。 |
6 | calendar.monthcalendar(year,month) 返回一个整数的单层嵌套列表。每个子列表代表一个星期的排列。Year年month月外的日期都设为0;范围内的日子都由该月第几日表示,从1开始。如1号为周六则第一个子列表为[0,0,0,0,0,1,2]。 |
7 | calendar.monthrange(year,month) 返回两个整数。第一个是该月首日是星期几的日期码,第二个是该月的天数日期码。日从0(星期一)到6(星期日);月从1到12。 |
8 | calendar.prcal(year,w=2,l=1,c=6) 相当于 print calendar.calendar(year,w=2,l=1,c=6)。 |
9 | calendar.prmonth(year,month,w=2,l=1) 相当于 print calendar.month(year,month,w=2,l=1) 。 |
10 | calendar.setfirstweekday(weekday) 设置每周的起始日期码。0(星期一)到6(星期日)。 |
11 | calendar.timegm(tupletime) 和time.gmtime相反:接受一个时间元组形式,返回该时刻的时间戳(1970纪元后经过的浮点秒数)。 |
12 | calendar.weekday(year,month,day) 返回给定日期的日期码。0(星期一)到6(星期日)。月份为 1(一月) 到 12(12月)。 |
Datetime模块
datatime模块重新封装了time模块,提供更多接口,其中包含如下类:
类名 | 功能说明 |
---|---|
date | 日期对象,常用的属性有year, month, day |
time | 时间对象 |
datetime | 日期时间对象,常用的属性有hour, minute, second, microsecond |
datetime_CAPI | 日期时间对象C语言接口 |
timedelta | 时间间隔,即两个时间点之间的长度 |
tzinfo | 时区信息对象 |
datetime模块中包含的常量: | |||
---|---|---|---|
量 | 功能说明 | 用法 | 返回值 |
MAXYEAR | 返回能表示的最大年份 | datetime.MAXYEAR | 9999 |
MINYEAR | 返回能表示的最小年份 | datetime.MINYEAR | 1 |
①、date类: datetime.date(year, month, day)
date. max/min | date对象所能表示的最大/最小日期 |
date.resolution | date对象表示日期的最小单位,这里单位为天 |
date.today() | 返回一个表示当前本地日期的date对象 |
date.fromtimestamp(timestamp) | 根据给定的时间戮,返回一个date对象 |
d1.year / d1.month / d1.day | 返回定义后的某个date(d1)的年/月/日 |
d1.replace(y,month,day) | 生成一个新的日期对象,用参数指定的年,月,日代替原有对象中的属性。(原有对象仍保持不变) |
d1.timetuple() | 返回日期对应的time.struct_time对象; |
d1.weekday() | 返回weekday,如果是星期一,返回0;如果是星期2,返回1,以此类推; |
d1.isoweekday() | 返回weekday,如果是星期一,返回1;如果是星期2,返回2,以此类推; |
d1.isocalendar(datetime.date.now() ) | 需传入一个date类型的参数,返回该参数对象的年year、本年度第几周、星期几(星期一返回1) |
d1.isoformat() | 返回格式如 'YYYY-MM-DD’ 的字符串; |
d1.strftime(fmt) | 和time模块format相同。返回自定义格式的时间字符串,fmt是自定义的时间格式。 |
>>> import datetime
>>> datetime.date.max
datetime.date(9999, 12, 31)
>>> print (datetime.date.min)
0001-01-01
>>> datetime.date.fromtimestamp(time.time())
datetime.date(2019, 9, 23)
>>> print( datetime.date.fromtimestamp(time.time()))
2019-09-23
>>> datetime.date.isocalendar(datetime.date.today())
(2019, 39, 1) # 表示今天是2019年中的第39周,星期一
>>> (datetime.date.today()).strftime('%Y-%m-%d %H:%M:%S')
'2019-09-23 00:00:00'
②、time类:datetime.time(hour[ , minute[ , second[ , microsecond[ , tzinfo] ] ] ] )
time. max/min | time类所能表示的最大/最小时间 |
time.resolution | 时间的最小单位,这里是 1 微秒 |
t1.hour / t1.minute / t1.second / t1.microsecond | 返回定义后的某个time(t1)的时/分/秒/毫秒 |
t1.replace(hour,[ , minute[ , second[ , microsecond[ , tzinfo] ] ] ] ) | 生成一个新的时间对象,用参数指定的时,分,秒,毫秒代替原有对象中的属性。(原有对象仍保持不变) |
t1.isoformat() | 返回格式如 'HH:MM:SS’ 的字符串; |
t1.strftime(fmt) | 和time模块format相同。返回自定义格式的时间字符串,fmt是自定义的时间格式。 |
>>> a = datetime.time(19, 35, 55,899)
>>> a.microsecond
899
>>> datetime.time.max
datetime.time(23, 59, 59, 999999)
>>> datetime.time.min
datetime.time(0, 0)
>>> a.isoformat()
'19:35:55.000899'
>>> a.strftime('%H:%M:%S')
'19:35:55'
③、datetime类:datetime相当于date和time结合起来。
datetime.datetime (year, month, day[ , hour[ , minute[ , second[ , microsecond[ , tzinfo] ] ] ] ] )
dt.year / month / day / hour / minute / second / microsecond / tzinfo | |
dt.date() / dt.time() | 获取date对象/ time对象 |
dt.replace(year[,month[,day[,hour[,mintue[,second[,microsecond[,tzinfo] ] ] ] ] ] ]) | |
dt.timetuple() / dt.utctimetuple() | dt.weekday() / dt.isocalendar() |
dt.ctime() | 返回一个日期时间的C格式字符串,等效于time.ctime(time.mktime(dt.timetuple())) |
datetime.today() | 返回一个表示当前本地时间的datetime对象; |
datetime.now([ tz ]) | 返回一个表示当前本地时间的datetime对象,如果提供了参数tz,则获取tz参数所指时区的本地时间; |
datetime.utcnow() | 返回一个当前utc时间的datetime对象; #格林威治时间 |
datetime.fromtimestamp(timestamp[,tz]) | 根据时间戮创建一个datetime对象,参数tz指定时区信息; |
datetime.utcfromtimestamp(timestamp[,tz]) | 根据时间戮创建一个datetime对象; |
datetime.combine(date, time) | 根据date和time,创建一个datetime对象; |
datetime.strptime(date_string,format) | 将格式字符串转换为datetime对象 ,fmt是自定义的时间格式。 |
④、timedelta类:timedelta类是用来计算二个datetime对象的差值的。
此类中包含如下属性:
1、days
:天数
2、microseconds
:微秒数(>=0 并且 <1秒)
3、seconds
:秒数(>=0 并且 <1天)
>>> today = datetime.date.today() #获取当前日期
>>> today
datetime.date(2019, 9, 23)
#获取上月最后一天的日期:timedelta(1)即为timedelta(days=1)
>>> mlast_day = datetime.date(today.year, today.month, 1) - datetime.timedelta(1)
>>> mlast_day
datetime.date(2019, 8, 31)
#获取时间差
>>> start = datetime.datetime.now()
>>> end = datetime.datetime.now()
>>> (end - start).seconds
26
>>> (end - start).microseconds
185029
#差值不止可以查看相差多少秒(seconds),还可以查看天(days), 微秒(microseconds)
#计算此时向后6小时的时间
>>> d1 = datetime.datetime.now()
>>> d2 = d1 + datetime.timedelta(hours = 6)
>>> d2
datetime.datetime(2019, 9, 24, 2, 18, 55, 913976)
#可以计算: 天(days), 小时(hours), 分钟(minutes), 秒(seconds), 微秒(microseconds)
#计算上一个周一和周日的日期
>>> today = datetime.date.today() #返回为:datetime.date(2019, 9, 23)
>>> today_weekday = today.isoweekday() #获取今天是周几的信息(周一为1,周五为5)
>>> last_sunday = today - datetime.timedelta(days=today_weekday)
#如:今天为周五则减去5就为上个周日; 返回为:datetime.date(2019, 9, 22)
>>> last_monday = last_sunday - datetime.timedelta(days=6)
#同理,上个周日减去6天即为上个周一的日期; 返回为:datetime.date(2019, 9, 16)
#指定一个日期,计算那个月的最后一天的日期以及那个月的总共天数
>>> date = datetime.date(2019,2,20)
>>> def lastrq(riqi):
if riqi.month == 12:
nextmonth1day = datetime.date(riqi.year + 1, 1, 1)
else:
nextmonth1day = datetime.date(riqi.year , riqi.month + 1, 1)
return nextmonth1day - datetime.timedelta(1)
>>> lastrq(date)
datetime.date(2019, 2, 28)
>>> lastrq(date).day
28
⑤、tzinfo时区类:tzinfo是关于时区信息的类,是一个抽象类,所以不能直接被实例化。