多起村干部被灭门案,需要反思了!

高铁打人者身份被曝光,人脉资源碾压普通人!却遇到了硬茬

OPPO芯片业务解散不一定是坏事

明确了!任期届满后,他不再寻求连任!

去泰国看了一场“成人秀”,画面尴尬到让人窒息.....

生成图片,分享到微信朋友圈

自由微信安卓APP发布,立即下载! | 提交文章网址
查看原文

time与datetime | 第14期

青衣极客 青衣极客 2020-01-09

     开发与实际问题相关的项目时,难免会需要处理时间信息。在python中,开发者可以使用多个内置模块处理时间,这些内置模块在一些功能上可能存在重合点,但是需要了解这些模块的侧重点差异。本文就讨论一下python中处理时间最常用的time和datetime这两个模块。time模块侧重点是处理与操作系统更接近的时间,其依赖的基本数据结构是时间戳和结构化的时间数据。需要知道的是,time所提供的功能的具体使用可能在不同的操作系统中存在差异。为了保证跨平台的通用性,可以使用datetime模块来进行时间的处理。datetime提供的功能更加符合人们对时间的思维习惯,因此在处理日常时间时更加方便和直观。最后还会讨论一下时区相关的问题,如果所开发的程序需要进行国际化的话,时区应该是必须要了解的。

1. time模块

      time提供了丰富的接口来获取时间戳,以及时间戳与结构化时间数据之间的转换。在python2中还常常使用clock函数,不过在python3.3之后就不建议使用了。time.time()用于获取时间戳,该时间戳是相对于1970年1月1日的秒数。使用time.gmtime()函数可以将时间戳转换为0时区的结构化数据。time.localtime()函数可以将时间戳转换为本地时区的结构化数据。time.ctime()函数可以将时间戳转换为人类可读的形式。还有一些其他函数的功能和使用方法在以下的演示中说明。

import time
ts = time.time() # 获取当前时间戳,相对于1970年1月1日print('时间戳:{}'.format(ts))
print(time.gmtime(ts)) # UTC时区的时间
time_st = time.localtime(ts) # 本地时区的时间print('本地时间结构化数据:', time_st)
print(time.ctime(ts)) # 将时间戳转换为人类可读的格式
print(time.asctime(time_st)) # 将时间结构化数据转换为人类可读的格式
print(time.mktime(time_st)) # 将时间结构化数据转换为时间戳
# 将时间结构化数据按指定格式转换为人类可读的格式print(time.strftime('%Y%m%d %H:%M:%S', time_st))
# 将人类可读格式的时间转换为结构化数据print(time.strptime('2019-10-22 12:00:00', '%Y-%m-%d %H:%M:%S'))
# 获取程序启动到当前的时间print(time.perf_counter())

Output:

时间戳:1571736657.198418time.struct_time(tm_year=2019, tm_mon=10, tm_mday=22, tm_hour=9, tm_min=30, tm_sec=57, tm_wday=1, tm_yday=295, tm_isdst=0)本地时间结构化数据: time.struct_time(tm_year=2019, tm_mon=10, tm_mday=22, tm_hour=17, tm_min=30, tm_sec=57, tm_wday=1, tm_yday=295, tm_isdst=0)Tue Oct 22 17:30:57 2019Tue Oct 22 17:30:57 20191571736657.020191022 17:30:57time.struct_time(tm_year=2019, tm_mon=10, tm_mday=22, tm_hour=12, tm_min=0, tm_sec=0, tm_wday=1, tm_yday=295, tm_isdst=-1)2418.215584949

2. datetime模块

      datetime提供了比较高阶的时间处理接口,甚至可以直接进行时间运算,这对于需要计算时间数据的项目而言能够提升不少效率。datetime提供了时间戳与datetime数据结构相互转换的接口,这对于沟通这两个常用模块而言是非常不错的。timedelta提供了时间差的数据结构,这为时间的计算提供了友好的基础。在一些第三方模块中,虽然自定义了时间处理,但实际上仍然是使用python内建的datetime,比如django。掌握datetime对于熟练处理第三方模块中的时间也是至关重要的。

import datetimeprint('time转换为datetime:{}'.format(datetime.datetime.fromtimestamp(time.time())))tn1 = datetime.datetime.now()print('当前时间:{}'.format(tn1))ti1 = datetime.timedelta(days=2)print('时间间隔:{}, type(ti1)={}'.format(ti1, type(ti1)))print('时间运算:tn1+ti1={}'.format(tn1+ti1))tn2 = datetime.datetime.now()td = tn2-tn1print('时间差:{}, type(td)={}'.format(td, type(td)))print('datetime转换为time:{}'.format(tn2.timestamp()))

Output:

time转换为datetime:2019-10-22 17:40:52.079558当前时间:2019-10-22 17:40:52.079733时间间隔:2 days, 0:00:00, type(ti1)=<class 'datetime.timedelta'>时间运算:tn1+ti1=2019-10-24 17:40:52.079733时间差:0:00:00.000265, type(td)=<class 'datetime.timedelta'>datetime转换为time:1571737252.079998

3. 时区

      在上面的演示中,其实已经提到了一些时区的概念,比如0时区。我们知道,同一时刻在不同时区中的时间读数是不一样的,但是不同时区使用的时间戳是一样的,都是以第0时区来进行定义的。比如我们可以使用utcfromtimestamp函数将时间戳转换为0时区的datetime,我们也可以对datetime对象的时区进行修改。以下演示说明了时区的修改方法以及修改之后的表现。

print('在0时区将time转换为datetime:{}'.format(datetime.datetime.utcfromtimestamp(time.time())))tz_8 = datetime.timezone(datetime.timedelta(hours=8))now = datetime.datetime.now()now_8 = now.replace(tzinfo=tz_8)print('东8区时间:{}'.format(now_8))tz_9 = datetime.timezone(datetime.timedelta(hours=9))print('东9区时间:{}'.format(now.replace(tzinfo=tz_9)))

Output:

在0时区将time转换为datetime:2019-10-22 10:27:39.248067东8区时间:2019-10-22 18:27:39.248538+08:00东9区时间:2019-10-22 18:27:39.248538+09:00

      到此,关于python中time与datetime这两个与时间相关的模块就讨论完毕。事实上,我们常用的时间大概是两大类,一类是测量程序运行时间的,另一类是表征现实时间的。对于第一类需求,直接适应time.time()函数即可,对于第二类需求直接使用datetime就行,至于其他的接口并不是太常用。如果需要开发一些网络应用,时区还是需要了解一些,即使不显式使用时区,也可以避免开发过程中遇到与时区相关的错误。


github链接:https://github.com/cnbluegeek/notebook/tree/master

欢迎对python和人工智能感兴趣的朋友加入微信群讨论和交流:


    文章有问题?点此查看未经处理的缓存