Python时间格式操作总结
作者:Peter
起源:Python编程韶光
在生涯和事情中,我们每小我天天都在和光阴打交道:

早上什么时刻起床。
地铁几分钟来一趟。
正午什么时刻开端午休。
来日诰日是礼拜几。
间隔前次买衣服已经2个月呢。
引导让我给代码加上一个准时义务的功效,怎么办。
分歧的环境会遇到分歧的光阴问题:详细光阴点、光阴距离、礼拜等,无时不刻我们在和光阴碰撞。本文将应用Python对光阴相关的类,及其办法与属性等进行具体的讲授
1. 光阴戳 1.1光阴戳简介
在正式讲授光阴的相关函数之前,我们必需先一个观点:光阴戳。本文中特指unix
光阴戳。
光阴戳Timestamp是指在一连串的数据中参加辨识笔墨,如光阴或者日期等,用以保障当地数据更新次序和长途的同等。
unix
光阴戳是从1970年1月1日(UTC/GMT的午夜)开端所颠末的秒数,不斟酌闰秒。1970-01-01便是常常我们在MySQL中光阴为空的时刻,转化空的光阴戳之后获得的光阴。一个小时表现为UNIX光阴戳格局为:3600秒;一天表现为UNIX光阴戳为86400秒,闰秒不计算。详细的对比表如下:
1.2光阴戳转化网站
下面先容几个光阴戳和详细光阴之间互相转化的网站:
1、站长对象:https://tool.chinaz.com/tools/unixtime.aspx
2、在线对象:https://tool.lu/timestamp/
3、Json在线解析:https://www.sojson.com/unixtime.html
4、Unix光阴戳在线转换(菜鸟对象):https://c.runoob.com/front-end/852
5、北京光阴(光阴与光阴戳交换对象):http://www.beijing-time.org/shijianchuo/
先容完光阴戳的根本常识,下面重点讲授3个与光阴和日期相关的Python库:
calendar
time
datetime
2.calendar
calendar
的中辞意思是"大众日历公众,以是它实在得当进行日期,尤其因此日历的情势展现。
2.1模块内容
下面举例阐明:
2.2calendar
我们显示即将曩昔2020年的日历,使用默认的参数:
import calendar
year = calendar.calendar(2020)
print(year)
转变参数再来显示一次:
year = calendar.calendar(2020,w=3,l=1,c=8)
print(year)
我们发现整个日历变宽了,并且礼拜的英文也是3个字母来显示的,解释一下3个参数的寄义:
c:每月距离间隔
w:逐日宽度距离
l:每礼拜行数
此中每行长度为:21*w+18+2*c
,3个月一行
末了,看看即将到来的2021年日历:
2.3isleap(year)
该函数的作用是断定某个年份到底是不是闰年。假如是则返回True,不然返回的是False。
通俗年份可以或许被4整除,然则不克不及被100整除,称之为通俗闰年 年份是整百数的,必需可以或许被400整除,称之为世纪闰年2.4leapdays(y1,y2)
断定两个年份之间有若干个闰年,包括y1,然则不包括y2,相似Python切片中的包括头部不包括尾部
2.5month(year,month,w=2,l=1)
该函数返回的是year
年的month
月的日历,只有两行题目,一周一行。逐日距离宽度为w个字符,每行的长度为7*w + 6
,此中l是每礼拜的行数
起首看看默认后果;
接下来我们转变w和l两个参数:
1、转变w
,我们发现礼拜的表现酿成了3个字母;同时天天之间的距离变宽了(左右距离)
2、转变参数l
,我们发现每个礼拜之前的距离(上下)变宽了
2.6monthcalendar(year,month)
经由过程列表的情势返回year年month月的日历,列表中照样列表情势。每个子列表是一个礼拜。假如没有本月的日期则用0表现。每个子列表都是从礼拜1开端的,特色归纳综合如下:
每个子列表代表的是一个礼拜
从礼拜一到礼拜日,没有呈现在本月的日期用0取代
我们照样以2020年12月份为例:
和上面的日历进行对照,我们发现:呈现0的地位切实其实是没有呈现在12月份中
我们再看看2020年3月份的日历:
2.7monthrange(year,month)
该函数返回的成果是一个元组,元组中有两个数值(a,b)
数值a代表的是该月从礼拜几开端;划定6代表礼拜天,取值为0-6
数值b代表该月统共有若干天
经由过程一个例子来讲授,照样以2020年12月份为例:
成果中的1表现12月份从礼拜2开端(0-6,6代表礼拜日),该月统共31天
2.8weekday(y,m,d)
weekday办法是输入年代日,我们便可知道是日是礼拜几;返回值是0-6,0代表礼拜1,6代表礼拜天
经由过程一个例子来讲授,以12月12号为例:
双12是礼拜六,返回的成果是5,5代表的便是礼拜六,刚好吻合。
3.time
time模块是涉及到光阴功效中最常用的一个模块,在Python的相关光阴需求中常常会用到,下面详细讲授该模块的使用办法。
3.1模块内容
先看模块的整体使用
3.2time
time.time()
是获取当前的光阴,加倍严厉地说,是获取当前光阴的光阴戳。
再次懂得光阴戳:它因此1970年1月1日0时0份0秒为计时出发点,计算到当前的光阴长度(不斟酌闰秒)3.3localtime
time.localtime
是打印当前的光阴,获得的成果是光阴元组,详细寄义:
条记:成果是光阴元组
time.localtime
的参数默认是time.time()
的光阴戳,可以本身输入某个光阴戳来获取其对应的光阴
默认当前光阴戳
指定某个光阴戳
3.4gmtime
localtime()
获得的是当地光阴,假如必要国际化,使用gmtime()
,最好是使用格林威治光阴。
格林威治尺度光阴:位于英国伦敦郊区的皇家格林威治天文台的尺度光阴,本初子午线颠末那边。
3.5asctime
time.asctime
的参数为空时,默认是以time.localtime的值为参数,获得当前的日期、光阴、礼拜;另外,我们也可以本身设置参数,参数是光阴元组
使用当前光阴的默认光阴元组localtime
本身指定一个光阴元组
获取当前光阴的详细光阴和日期:
3.6ctime
ctime
的参数默认是光阴戳;假如没有,也可以指定一个光阴戳
3.7mktime
mktime()
也因此光阴元组为参数的,它返回的是光阴戳,相称于是localtime
的逆向进程:
3.8strftime
strftime()
是依照我们指定的格局将光阴元组转化为字符串;假如不指准时间元组,默认是当前光阴localtime()
。常用到的光阴格局见下表:
我们举例阐明:
字符串中的分隔符我们可以随意率性指定
可以同时显示年代日时分秒等
3.9strptime
strptime()
是将字符串转化为光阴元组,我们必要分外注意的是,它有两个参数:
待转化的字符串
光阴字符串对应的格局,格局便是上面表中提到的
4.datetime
固然time
模块已经可以或许办理许多的问题,然则现实事情和营业需求中必要更多的对象,让我们使用起来更便利和快捷,datetime
就是此中一个很好用的模块。datetime
模块中几个常用的类如下:
date
:日期类,常用属性:year/month/day
time
:光阴类,常用属性:hour/minute/second/microsecond
datetime
:日期光阴类
timedelta
:光阴距离,即两个光阴点之间的光阴长度
tzinfo
:时区类
4.1模块内容
4.2date
起首我们引入date
类,并创立一个日期工具:
1、然后我们可以操作这个日期工具的各类属性:后面加上()
print("大众当前日期:公众,today) # 当前日期
print("大众当前日期(字符串):"大众,today.ctime()) # 返回日期的字符串
print("大众光阴元组信息:"大众,today.timetuple()) # 当前日期的光阴元组信息
print("大众年:"大众,today.year) # 返回today工具的年份
print(公众月:"大众,today.month) # 返回today工具的月份
print("大众日:"大众,today.day) # 返回today工具的日
print("大众礼拜:公众,today.weekday()) # 0代表礼拜一,类推
print("大众公历序数:公众,today.toordinal()) # 返回公历日期的序数
print("大众年/周数/礼拜:公众,today.isocalendar()) # 返回一个元组:一年中的第几周,礼拜几
# 成果显示
当前日期: 2020-12-25
当前日期(字符串):Fri Dec 25 00:00:00 2020
光阴元组信息:time.struct_time(tm_year=2020, tm_mon=12, tm_mday=25, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=4, tm_yday=360, tm_isdst=-1)
年: 2020
月: 12
日: 25
礼拜: 4
公历序数: 737784
年/周数/礼拜: (2020, 52, 5)
2、date类中光阴和光阴戳的转换:
详细光阴的光阴戳转成日期:
3、格局化光阴相关,格局参照time模块中的strftime办法
from datetime import datetime, date, time
today = date.today()
print(today)
# 2020-12-26 默认衔接符号是-
print(today.strftime(公众%Y/%m/%d"大众)) # 指定衔接符
# 2020/12/26
print(today.strftime("大众%Y:%m:%d公众))
# 2020:12:26
print(today.strftime(公众%Y/%m/%d %H:%M:%S"大众)) # 转化为详细的光阴
# 2020/12/26 00:00:00
4、改动日期使用replace
办法
4.3time
time
类也是要天生time
工具,包括hour、minute、second、microsecond
,我们照样经由过程例子来进修:
from datetime import time
t = time(10,20,30,40)
print(t.hour) # 时分秒
print(t.minute)
print(t.second)
print(t.microsecond) # 微秒
# 成果
4.4datetime
10
20
30
40
datetime类包括date类和time类的全体信息,下面是类办法相关的:
from datetime import datetime
print(datetime.today())
print(datetime.now())
print(datetime.utcnow())# 返回当前UTC日期和光阴的datetime工具
print(datetime.fromtimestamp(1697302830)) # 光阴戳的datetime工具
print(datetime.fromordinal(699000) )
print(datetime.combine(date(2020,12,25), time(11,22,54))) # 拼接日期和光阴
print(datetime.strptime(公众2020-12-25公众,"大众%Y-%m-%d"大众))
# 成果
2020-12-25 23:24:42.481845
2020-12-25 23:24:42.482056
2020-12-25 15:24:42.482140
2023-10-15 01:00:30
1914-10-19 00:00:00
2020-12-25 11:22:54
2020-12-25 00:00:00
再看看相关工具和属性相关:
from datetime import datetime
d = datetime(2020,12,25,11,24,23)
print(d.date())
print(d.time())
print(d.timetz()) # 从datetime中拆分出详细时区属性的time
print(d.replace(year=2021,month=1)) # 替换
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"大众))
# 成果
4.5timedelta
2020-12-25
11:24:23
11:24:23
2021-01-25 11:24:23
time.struct_time(tm_year=2020, tm_mon=12, tm_mday=25, tm_hour=11, tm_min=24, tm_sec=23, tm_wday=4, tm_yday=360, tm_isdst=-1)
737784
4
5
(2020, 52, 5)
2020-12-25T11:24:23
2020-12-25 :11:24:23
timedelta
工具表现的是一个光阴段,即两个日期date
或者日期光阴datetime
之间的差;支撑参数:weeks、days、hours、minutes、seconds、milliseconds、microseconds
4.6tzinfo
当地光阴指的是我们体系自己设准时区的光阴,例如中国处于北京光阴,常说的东八区UTC+8:00
。datetime
类有一个时区属性tzinfo
。
tzinfo
是一个关于时区信息的类,是一个抽象的基类,不克不及直接被实例化来使用。它的默认值是None
,无法区分详细是哪个时区,必要我们强制指定一个之后能力使用。
由于自己体系的时区刚好在中国处于东八区,以是上述代码是可以或许正常运行的,成果也是OK的。那假如我们想切换到其他时区的光阴,该若何操作呢。这个时刻我们必要进行时区的切换。
1、我们先经由过程utcnow()
获取到当前的UTC光阴
utc_now = datetime.utcnow().replace(tzinfo=timezone.utc) # 指定utc时区
print(utc_now)
# 成果
2020-12-26 01:36:33.975427+00:00
2、经由过程astimezone()
将时区指定为我们想转换的时区,好比东八区(北京光阴):
# 经由过程astimezone切换到东八区
beijing = utc_now.astimezone(timezone(timedelta(hours=8)))
print(beijing)
# 成果
2020-12-26 09:36:33.975427+08:00
用同样的办法切到东九区,东京光阴:
# UTC时区切换到东九区:东京光阴
tokyo = utc_now.astimezone(timezone(timedelta(hours=9)))
print(tokyo)
# 成果
2020-12-26 10:36:33.975427+09:00
还可以直接从北京光阴切换到东京光阴:
# 北京光阴(东八区)直接切换到东京光阴(东九区)
tokyo_new = beijing.astimezone(timezone(timedelta(hours=9)))
print(tokyo_new)
# 成果
2020-12-26 10:36:33.975427+09:00
5.常用光阴转化
下面先容几个事情顶用到的光阴转化小技能:
光阴戳转日期
日期转光阴戳
格局化光阴
指定格局获取当前光阴
5.1光阴戳转成日期
光阴戳转成详细光阴,我们必要两个函数:
time.localtime
:将光阴戳转成光阴元组情势
time.strftime
:将光阴元组数据转成我们必要的情势
import time
now_timestamp = time.time() # 获取当前光阴的光阴戳
# 光阴戳先转成光阴元组,strftime在转成指定格局
now_tuple = time.localtime(now_timestamp)
time.strftime("大众%Y/%m/%d %H:%M:%S公众, now_tuple)
# 成果
'2020/12/26 11:19:01'
假设我们指定一个详细的光阴戳来进行转换:
import time
timestamp = 1608852741 # 指准时间戳
a = time.localtime(timestamp) # 得到光阴元组情势数据
print("大众光阴元组数据:公众,a)
time.strftime(公众%Y/%m/%d %H:%M:%S公众, a) # 格局化
# 成果
光阴元组数据:time.struct_time(tm_year=2020, tm_mon=12, tm_mday=25, tm_hour=7, tm_min=32, tm_sec=21, tm_wday=4, tm_yday=360, tm_isdst=0)
'2020/12/25 07:32:21'
假如我们不想指定详细的格局,只想获取光阴戳对应的光阴,直接经由过程time.ctime
即可:
import time
time.ctime(1608852741)
# 成果
5.2日期光阴转成光阴戳
'Fri Dec 25 07:32:21 2020'
日期光阴转成光阴戳格局,我们必要使用两个办法:
strptime()
:将光阴转换成光阴数组
mktime()
:将光阴数组转换成光阴戳
经由过程详细的案例来进修一下:
date = 公众2020-12-26 11:45:34"大众
# 1、光阴字符串转成光阴数组情势
date_array = time.strptime(date, "大众%Y-%m-%d %H:%M:%S"大众)
# 2、查看光阴数组数据
print("大众光阴数组:"大众, date_array)
# 3、mktime光阴数组转成光阴戳
time.mktime(date_array)
# 成果
光阴数组:time.struct_time(tm_year=2020, tm_mon=12, tm_mday=26, tm_hour=11, tm_min=45, tm_sec=34, tm_wday=5, tm_yday=361, tm_isdst=-1)
1608954334.0
5.3格局化光阴
事情需求中有时刻给定的光阴格局未必是我们可以或许直接使用,以是可能必要进行格局的转换,必要使用两个办法:
strptime()
:将光阴转换成光阴数组
strftime()
:从新格局化光阴
经由过程案例来进行进修:
import time
old = "大众2020-12-12 12: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)
# 成果
原格局光阴: 2020-12-12 12:28:45
新格局光阴: 20201212-12:28:45
5.4指定格局获取当前光阴
为了可以或许获取到指定格局确当前光阴,我们分为3个步调:
time.time()
:获取当前光阴
time.localtime()
:转成光阴元组
time.strftime()
:从新格局化光阴
经由过程一个案例来进修:
# 1、光阴戳
old_time = time.time()
# 2、光阴元组
time_array = time.localtime(old_time)
# 3、指定格局输出
new_time = time.strftime("大众%Y/%m/%d %H:%M:%S"大众, time_array)
print(new_time)
# 成果
6.总结
2020/12/26 11:56:08
本文经由过程各类案例具体先容了Python
中关于光阴输出和转化的3个模块:calendar、time、datetime
,末了总结了4个事情中常用的光阴转化技能,愿望对年夜家掌握Python中的光阴输出和转化有所赞助,不再被光阴困扰。
Python猫技术交流群开放啦。群里既有海内一二线年夜厂在人员工,也有海内外高校在读学生,既有十多年码龄的编程老鸟,也有中小学方才入门的新人,进修气氛优越。想入群的同窗,请在公号内回复『交流群』,获取猫哥的微信 (谢绝告白党,非诚勿扰。)~