前言
时间我们平常大部分都接触到,在生活上早上七点五十起床,七点五十就是时间;在开发中我们有时候对某些操作需要记录时间,新增操作时间字段,这又涉及到了时间。接下来我们简单对python的时间处理进行简单的总结。在工作中我们大部分用time或者datetime函数进行时间处理,今天我就总结这两模块外,再新增calendar,arrow这两位成员,好啦下面我们开始讲解。
time
time模块是涉及到时间功能中最常用的一个模块,在开发中我们使用很频繁的一个模块。
time
返回当前时间的时间戳(1970纪元后经过的浮点秒数)
>>>import time
>>>time.time()
1610867607.4679744
altzone
返回格林威治西部的夏令时地区的偏移秒数。如果该地区在格林威治东部会返回负值
>>>import time
>>>time.altzone
-32400
localtime
格式化当前时间戳,返回元组格式,另外注意的是可以传入参数,则从1970开始计算时间
>>>import time
>>>time.localtime()
time.struct_time(tm_year=2021, tm_mon=1, tm_mday=17, tm_hour=15, tm_min=16, tm_sec=30, tm_wday=6, tm_yday=17, tm_isdst=0)
>>>
>>>time.localtime(0)
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=8, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)
>>>time.localtime(1)
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=8, tm_min=0, tm_sec=1, tm_wday=3, tm_yday=1, tm_isdst=0)
>>>time.time()
>>>1610868273.6466053
>>>time.localtime(1610868273.6466053)
time.struct_time(tm_year=2021, tm_mon=1, tm_mday=17, tm_hour=15, tm_min=24, tm_sec=33, tm_wday=6, tm_yday=17, tm_isdst=0)
mktime
time mktime() 函数执行与gmtime(), localtime()相反的操作,它接收struct_time对象作为参数,返回用秒数来表示时间的浮点数
>>>import time
>>>time.mktime(time.localtime())
1610868588.0
gmtime
将格式化时间装换时间戳
>>>import time
>>>time.gmtime(time.time())
time.struct_time(tm_year=2021, tm_mon=1, tm_mday=17, tm_hour=7, tm_min=29, tm_sec=17, tm_wday=6, tm_yday=17, tm_isdst=0)
asctime
接受时间元组并返回一个可读的形式字符串,可以通过localtime也可以自己定义
>>>import time
>>>time.asctime(time.localtime())
'Sun Jan 17 15:33:29 2021'
>>>
>>>t = (2018,5,27,1,5,27,6,147,-1)
>>>time.asctime(t)
'Sun May 27 01:05:27 2018'
ctime
把一个时间戳(按秒计算的浮点数)转化为time.asctime()的形式(可读的形式字符串),默认当前时间,也可以手动传入
>>>import time
>>>time.ctime()
'Sun Jan 17 15:38:09 2021'
>>>time.ctime(time.time())
'Sun Jan 17 15:38:17 2021'
strftime
按照我们指定的格式将时间元组转化为字符串;如果不指定时间元组,默认是当前时间localtime()
时间格式如下
>>>import time
>>>time.strftime("%y-%m-%d")
'21-01-17'
strptime
将字符串转化为时间元组(与strftime相反),需要传入参数:待转化的字符串, 时间字符串对应的格式(如上图所示)
>>>import time
>>>time.strptime(time.strftime("%y-%m-%d"),"%y-%m-%d")
time.struct_time(tm_year=2021, tm_mon=1, tm_mday=17, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=6, tm_yday=17, tm_isdst=-1)
sleep
推迟调用线程的运行, 需要传入参数
>>>import time
>>>time.sleep(5)
datetime
date
日期对象(年月日)
1- 相关属性
>>>datetime.date.today().year # 年
2021
>>>datetime.date.today().month #月
1
>>>datetime.date.today().day #日
17
>>>datetime.date.today() #当天日期
datetime.date(2021, 1, 17)
>>>datetime.date.today().ctime() # 返回日期的字符串
'Sun Jan 17 00:00:00 2021'
>>>datetime.date.today().weekday() # 星期几
6
>>>datetime.date.today().toordinal() # 返回公历日期的序数
737807
>>>datetime.date.today().isocalendar() # 返回一个元组:一年中的第几周,星期几
(2021, 2, 7)
2- 时间转换
>>>import datetime
>>>datetime.date.today().toordinal() # 转换时间戳
737807
>>>datetime.date.fromordinal(737807) # 转换时间
datetime.date(2021, 1, 17)
>>>datetime.date.fromtimestamp(time.time()) # 时间戳转时间
datetime.date(2021, 1, 17)
>>>datetime.date.today().strftime("%Y-%m-%d") # 转换具体格式
'2021-01-17'
>>>a = datetime.date(2020,1,1) # 修改日期
>>>a.replace(2021,1,17)
datetime.date(2021, 1, 17)
time
时间对象(时分秒)
>>>import datetime
>>>datetime.time(1,1,1).hour #时
1
>>>datetime.time(1,1,1).minute #分
1
>>>datetime.time(1,1,1).second # 秒
1
datetime
包含date类和time类,这个方法我们开发时候经常用
from datetime import datetime, date, time
print("当天时间:", datetime.today())
print("当天时间:",datetime.now())
print("国际当前时间:",datetime.utcnow()) # 返回当前UTC日期和时间的datetime对象
print("时间戳转时间",datetime.fromtimestamp(1610888455)) # 时间戳的datetime对象
print(datetime.fromordinal(699000))
print("拼接时间",datetime.combine(date(2021, 1, 17), time(22, 21, 51))) # 拼接日期和时间
print(datetime.strptime("2020-12-25", "%Y-%m-%d"))
d = datetime(2021,1,17,22,24,23)
print("当前日期:", d.date())
print("当前时间:", d.time())
print("返回时间:", d.timetz()) # 从datetime中拆分出具体时区属性的time
print("时间替换", d.replace(year=2021,month=1, day=18)) # 替换
print(d.timetuple()) # 时间元组
print(d.toordinal()) # 和date.toordinal一样
print("第几周",d.weekday())
print("星期", d.isoweekday())
print(d.isocalendar()) # 返回那年,第几周, 周几
print(d.isoformat())
print(d.strftime("%Y-%m-%d :%H:%M:%S"))
############返回
当天时间: 2021-01-17 21:03:52.467134
当天时间: 2021-01-17 21:03:52.467601
国际当前时间: 2021-01-17 13:03:52.467601
时间戳转时间 2021-01-17 21:00:55
1914-10-19 00:00:00
拼接时间 2021-01-17 22:21:51
2020-12-25 00:00:00
当前日期: 2021-01-17
当前时间: 22:24:23
返回时间: 22:24:23
时间替换 2021-01-18 22:24:23
time.struct_time(tm_year=2021, tm_mon=1, tm_mday=17, tm_hour=22, tm_min=24, tm_sec=23, tm_wday=6, tm_yday=17, tm_isdst=-1)
737807
第几周 6
星期 7
(2021, 2, 7)
2021-01-17T22:24:23
2021-01-17 :22:24:23
timedelta
一个时间段,即两个日期date
或者日期时间datetime
之间的差;支持参数:weeks、days、hours、minutes、seconds、milliseconds、microseconds
>>>from datetime import date, datetime, timedelta
>>>td = datetime.today()
>>>td
datetime.datetime(2021, 1, 17, 21, 12, 1, 106864)
>>>td +timedelta(hours=1) # 加一小时
datetime.datetime(2021, 1, 17, 22, 12, 1, 106864)
>>>td +timedelta(minutes=1) # 加一分
datetime.datetime(2021, 1, 17, 21, 13, 1, 106864)
>>>td +timedelta(weeks=1) # 加一周
datetime.datetime(2021, 1, 24, 21, 12, 1, 106864)
>>>datetime.now() - datetime(2021, 1,1,1,1,)
datetime.timedelta(days=16, seconds=72789, microseconds=620600)
>>>de = datetime.now() - datetime(2021, 1,1,1,1,) #时间差
>>>de.days #差的天数
16
>>>de.seconds #差的描述 指的是整天差的
72798
>>>de.total_seconds() # 全部的秒数
1455198.618413
tzinfo
本地时间指的是我们系统本身设定时区的时间,例如中国处于北京时间,常说的东八区UTC+8:00
。
from datetime import datetime, timezone, timedelta
now_t = timezone(timedelta(hours=8)) #创建时区
print("创建时区:" ,now_t )
now = datetime.now()
print("现在时间:", now)
# 加8小时
new = now.replace(tzinfo=timezone(timedelta(hours=8)))
print(("加8小时时区:", new))
now = datetime.utcnow().replace(tzinfo=timezone.utc) # 指定utc时区
print(now)
bj = now.astimezone(timezone(timedelta(hours=8))) # 通过astimezone切换到东八区
print("bj:", bj)
tk = now.astimezone(timezone(timedelta(hours=9))) # UTC时区切换到东九区:东京时间
print("tk:", tk)
tk_new = bj.astimezone(timezone(timedelta(hours=9))) # 北京时间(东八区)直接切换到东京时间(东九区)
print("tk_new:", tk_new)
calendar
此模块的函数都是日历相关的,例如打印某月的字符月历
calendar
返回一个多行字符串格式的year年年历,3个月一行,间隔距离为c, 每日宽度间隔为w字符,l是每星期行数。
import calendar
print(calendar.calendar(2021, w=2, l=1, c=6))
返回数据
2021
January February March
Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
1 2 3 1 2 3 4 5 6 7 1 2 3 4 5 6 7
4 5 6 7 8 9 10 8 9 10 11 12 13 14 8 9 10 11 12 13 14
11 12 13 14 15 16 17 15 16 17 18 19 20 21 15 16 17 18 19 20 21
18 19 20 21 22 23 24 22 23 24 25 26 27 28 22 23 24 25 26 27 28
25 26 27 28 29 30 31 29 30 31
April May June
Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
1 2 3 4 1 2 1 2 3 4 5 6
5 6 7 8 9 10 11 3 4 5 6 7 8 9 7 8 9 10 11 12 13
12 13 14 15 16 17 18 10 11 12 13 14 15 16 14 15 16 17 18 19 20
19 20 21 22 23 24 25 17 18 19 20 21 22 23 21 22 23 24 25 26 27
26 27 28 29 30 24 25 26 27 28 29 30 28 29 30
31
July August September
Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
1 2 3 4 1 1 2 3 4 5
5 6 7 8 9 10 11 2 3 4 5 6 7 8 6 7 8 9 10 11 12
12 13 14 15 16 17 18 9 10 11 12 13 14 15 13 14 15 16 17 18 19
19 20 21 22 23 24 25 16 17 18 19 20 21 22 20 21 22 23 24 25 26
26 27 28 29 30 31 23 24 25 26 27 28 29 27 28 29 30
30 31
October November December
Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
1 2 3 1 2 3 4 5 6 7 1 2 3 4 5
4 5 6 7 8 9 10 8 9 10 11 12 13 14 6 7 8 9 10 11 12
11 12 13 14 15 16 17 15 16 17 18 19 20 21 13 14 15 16 17 18 19
18 19 20 21 22 23 24 22 23 24 25 26 27 28 20 21 22 23 24 25 26
25 26 27 28 29 30 31 29 30 27 28 29 30 31
firstweekday
返回当前每周起始日期的设置。默认情况下,首次载入 calendar 模块时返回 0,即星期一。
import calendar
print(calendar.firstweekday())
>>> 0
isleap
是闰年返回 True,否则为 False。
import calendar
print(calendar.isleap(2000))
>>>True
leapdays(a,b)
返回在a,b两年之间的闰年总数。(左开右闭原则)
import calendar
print(calendar.leapdays(2000,2021))
month
该函数返回的是year
年的month
月的日历,只有两行标题,一周一行。每日间隔宽度为w个字符,每行的长度为7*w + 6
,其中l是每星期的行数
import calendar
print(calendar.month(2021, 1, w=2, l=1))
January 2021
Mo Tu We Th Fr Sa Su
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
monthcalendar
返回一个整数的单层嵌套列表。每个子列表装载代表一个星期的整数。Year年month月外的日期都设为0;范围内的日子都由该月第几日表示,从1开始。
import calendar
print(calendar.monthcalendar(2021,1))
>>>[[0, 0, 0, 0, 1, 2, 3], [4, 5, 6, 7, 8, 9, 10], [11, 12, 13, 14, 15, 16, 17], [18, 19, 20, 21, 22, 23, 24], [25, 26, 27, 28, 29, 30, 31]]
monthrange
该函数返回的结果是一个元组,元组中有两个数值(a,b),
数值a代表的是该月从星期几开始;规定6代表星期天,取值为0-6,数值b代表该月总共有多少天
import calendar
print(calendar.monthrange(2021,1))
>>>(4, 31)
weekday
weekday方法是输入年月日,我们便可知道这天是星期几;返回值是0-6,0代表星期1,6代表星期天
import calendar
print(calendar.weekday(2021,1,3))
>>>6
arrow
Arrow是一个Python库,为创建,操作,格式化和转换日期,时间和时间戳提供了一种明智的,人性化的方法
简单例子
import arrow
utc = arrow.utcnow() # 获取世界标准时间
print("获取世界标准时间:",utc)
now = arrow.now() # 获取本地时间
print("获取本地时间:",now)
print("获取指定时区的时间:",arrow.now('US/Pacific'))
arw = arrow.now() # 实例化
print("当前时间:", arw)
print("当前年:", arw.year)
print("当前月:", arw.month)
print("当前天:", arw.day)
print("当前时:", arw.hour)
print("当前分:", arw.minute)
print("当前秒:", arw.second)
print("获取时间戳:", arw.timestamp)
print("当前年:", arw.float_timestamp)
print("浮点数时间戳:", arw.replace(hour=20,minute=00))
返回結果
当前时间: 2021-01-17T22:02:47.878933+08:00
当前年: 2021
当前月: 1
当前天: 17
当前时: 22
当前分: 2
当前秒: 47
获取时间戳: 1610892167
当前年: 1610892167.878933
浮点数时间戳: 2021-01-17T20:00:47.878933+08:00
获取世界标准时间: 2021-01-17T13:56:41.079536+00:00
获取本地时间: 2021-01-17T21:56:41.079536+08:00
获取指定时区的时间: 2021-01-17T05:56:41.193846-08:00
时间迁移
import arrow
arw = arrow.now() # 实例化
print("当前时间:", arw)
print("往后偏移一年:", arw.shift(years=+1))
print("往前偏移三天:", arw.shift(years=-1))
print("往后偏移一月:", arw.shift(months=+1))
print("往前偏移一月:", arw.shift(months=-1))
print("往后偏移一周:", arw.shift(weeks=+1))
print("往前偏移一周:", arw.shift(weeks=-1))
print("往后偏移三天:", arw.shift(days=+3))
print("往前偏移三天:", arw.shift(days=-3))
print("往后偏移三分钟:", arw.shift(minutes=+3))
print("往前偏移三分钟:", arw.shift(minutes=-3))
print("往后偏移三秒:", arw.shift(seconds=+3))
print("往前偏移三秒:", arw.shift(seconds=-3))
结果
当前时间: 2021-01-17T22:07:08.786150+08:00
往后偏移一年: 2022-01-17T22:07:08.786150+08:00
往前偏移三天: 2020-01-17T22:07:08.786150+08:00
往后偏移一月: 2021-02-17T22:07:08.786150+08:00
往前偏移一月: 2020-12-17T22:07:08.786150+08:00
往后偏移一周: 2021-01-24T22:07:08.786150+08:00
往前偏移一周: 2021-01-10T22:07:08.786150+08:00
往后偏移三天: 2021-01-20T22:07:08.786150+08:00
往前偏移三天: 2021-01-14T22:07:08.786150+08:00
往后偏移三分钟: 2021-01-17T22:10:08.786150+08:00
往前偏移三分钟: 2021-01-17T22:04:08.786150+08:00
往后偏移三秒: 2021-01-17T22:07:11.786150+08:00
往前偏移三秒: 2021-01-17T22:07:05.786150+08:00
时间格式化
import arrow
arw = arrow.now() # 实例化
print("当前时间:", arw)
print("无格式输出:", arw.format())
print("有格式输出", arw.format('YYYY-MM-DD HH:mm:ss'))
print("返回日期和时间的ctime格式化表示", arw.ctime())
print("以整数形式返回星期几(0-6)", arw.weekday())
print("以整数形式返回一周中的ISO日(1-7)", arw.isoweekday())
print("返回3元组(ISO年,ISO周数,ISO工作日)", arw.isocalendar())
print("返回日期的格雷戈里序数", arw.toordinal())
print("直接生成Arrow对象:", arrow.Arrow(2017, 2, 1))
print("字符串转换成Arrow对象:",arrow.get("2017-01-20 11:30", "YYYY-MM-DD HH:mm"))
print("时间戳转arrow:", arrow.get(1485937858.659424))
当前时间: 2021-01-17T22:17:02.283292+08:00
无格式输出: 2021-01-17 22:17:02+08:00
有格式输出 2021-01-17 22:17:02
返回日期和时间的ctime格式化表示 Sun Jan 17 22:17:02 2021
以整数形式返回星期几(0-6) 6
以整数形式返回一周中的ISO日(1-7) 7
返回3元组(ISO年,ISO周数,ISO工作日) (2021, 2, 7)
返回日期的格雷戈里序数 737807
直接生成Arrow对象: 2017-02-01T00:00:00+00:00
字符串转换成Arrow对象: 2017-01-20T11:30:00+00:00
时间戳转arrow: 2017-02-01T08:30:58.659424+00:00
常用转换
时间戳转日期
time
import time
now_timestamp = time.time() # 获取当前时间的时间戳
# 时间戳先转成时间元组,strftime在转成指定格式
now_tuple = time.localtime(now_timestamp)
print(time.strftime("%Y-%m-%d %H:%M:%S", now_tuple))
datetime
import datetime, time
timeStamp = time.time()
date_now = datetime.datetime.fromtimestamp(timeStamp)
print(date_now.strftime("%Y-%m-%d %H:%M:%S"))
arrow
import time, arrow
timeStamp = time.time()
date_now = arrow.get(timeStamp)
print(date_now.format("YYYY-MM-DD HH:mm:ss"))
日期转时间戳
import time
# 字符类型的时间
tss1 = '2021-1-17 23:40:00'
# 转为时间数组
timeArray = time.strptime(tss1, "%Y-%m-%d %H:%M:%S")
# 转为时间戳
timeStamp = int(time.mktime(timeArray))
print ("时间戳:", timeStamp)
格式化时间
import time
old = "2021-1-17 23:28:45"
# 1、转换成时间数组
time_array = time.strptime(old, "%Y-%m-%d %H:%M:%S")
# 2、转换成新的时间格式(20201212-20:28:54)
new = time.strftime("%Y--%m--%d %H:%M:%S",time_array) # 指定显示格式
print("原格式时间:",old)
print("新格式时间:",new)