python中的时间处理模块

python中的时间处理

分享一篇文章,原文来自:https://blog.csdn.net/BF02jgtRS00XKtCx/article/details/78448799

python中处理时间的模块有三个,datetime, time, calendar,重点在于梳理出三个模块的设计脉络,便于在需要的时候能够去查找相应的方法。由于calendar模块使用不多未做总结。以下demo均为python3。

1 . 概述

datetime模块主要是用来表示日期的,就是我们常说的年月日时分秒,calendar模块主要是用来表示年月日,是星期几之类的信息,time模块主要侧重点在时分秒,粗略从功能来看,我们可以认为三者是一个互补的关系,各自专注一块。此处还有一个小点需要注意dateutil,弥补了datetime不能处理月份的问题,用法同datetime共同总结。

理论储备

学习time模块前,我们需要先知道几个与时间相关的概

  • epoch

    • 我们的时间基准点是什么时间?比如我说你身高1.8米,那这个身高是指相对于你站立的地面说的。这个时间基准点就是epoch,在Unix系统中,这个基准点就是1970年1月1日0点整那个时间点
  • GMT,UTC

    • 上面我们说epoch表示1970年的起始点,那这个1970年又是相对于哪个基准时间呢?一般来说,就是相对于格林尼治时间,也叫做GMT(Greenwich Mean Time)时间,还叫做UTC(Coordinated Universal Time),为啥一个时间基准有两个名字?历史上,先有的GMT,后有的UTC.

      UTC是我们现在用的时间标准,GMT是老的时间计量标准。UTC是根据原子钟来计算时间,而GMT是根据地球的自转和公转来计算时间。所以,可以认为UTC是真正的基准时间,GMT相对UTC的偏差为0。

      在实际中,我们的计算机中有一个硬件模块RCT,里面会实时记录UTC 时间,该模块有单独的电池供电,即使关机也不影响。有了epoch这个时间基准,又有了UTC这个基准的基准,我们就可以精确地表示一个时间了。

  • DST,tzone

    • 我们已经可以精确地表示一个时间,很多情况下,我们还是要根据地区实际情况对时间进行一个调整,最常见的就是时区(tzone),此时,当我们说3点10分这个时间该打球了,还需加上是哪个时区的3点10分才能精确说明一个时间。另外一个对时间做出调整的就是DST.

      DST 全称是Daylight Saving Time,为了充分利用日光,减少用电,人为地对时间做出一个调整,这取决于不同国家和地区的政策法规。比如说,假设你冬天7点天亮起床,但夏天6点天亮,那么在夏天到来时人为将时间加1个小时,这样就可以让你还是觉得7点起床,但实际上是提前一个小时了。

      那么一定要问一问,python是如何知道tzone和DST这两个的值呢?答案是通过环境变量。
      我们只以linux中TZ环境变量为例来说明一下。

      CST+08EDT,M4.1.0,M10.5.0,这个字符串用空格分开他们,分成三部分

      CST+08 EDT, M4.1.0, M10.5.0
      

      第一部分中的CST表示时区的名字,即China Standard Time,也就是我们说的北京时间,+8表示北京时间减去8小时就是UTC时间

      第二部分EDT表示DST的名字,我们说DST是因各个国家地区的政策法规不同而不同的,EDT后面也可以像CST后面一样加一个时间调整值,但由于我们国内只在86年到92年实行过一段时间DST,现在已经废止,所以后面不用加调整时间。

      第三部分表示的是实行DST的开始和结束时间,没有在查询具体细节。

2. time模块

import time
t = time.time() # 从epoch到现在的秒数(用浮点数表示),用的是UTC时间

我们想把上面获取的秒数转换为年月日时分秒的形式,这种转换分为两种情况:一种是用UTC时间,一种用我们时区调整后的时间,二者都返回一个类struct_time的实例这两个函数如果调用时不传参数,它们内部会调用time.time(),并用返回的秒数做转换

time.gmtime(t) # 时间戳转换为UTC时区(0时区)的struct_time
time.localtime(t) # 所在时区调整后的时间

相反的,python同样提供了将这两种struct_time转为秒数的方法。

import calendar
calendar.timegm() # 把UTC的struct_time(gmtime的返回对象)转为从epoch开始的秒数
time.mktime() # 用来把用时区调整过的struct_time(即localtime的返回对象)对象转为从epoch开始的秒数

在时间和表示时间的字符串之间进行转换,time模块中的strftime和strptime就是做这个的。

strftime 即 string format time,用来将时间格式化成字符串
strptime 即string parse time,用来将字符串解析成时间
asctime 用来将一个struct_time对象转为标准24字符的字符串
ctime 方法与asctime作用相同,只不过它接收的是秒数,在内部,会先把秒数通过localtime转为struct_time,再往后就与asctime一样了

import time
time.localtime(time.time()) # 时间元组
fmt = '%Y-%m-%d %H:%M:%S'
time.strftime(fmt[,tupletime]) # 接收时间元组,并返回以可读字符串表示的当地时间,格式由fmt决定。
time.strptime(str,fmt='%a %b %d %H:%M:%S %Y') # 根据fmt的格式把一个时间字符串解析为时间元组
ime.mktime(tupletime) # 接受时间元组并返回时间戳(1970纪元后经过的浮点秒数)
time.sleep(secs) # 线程推迟指定的时间运行。单位为秒
time.clock() # 这个需要注意,在不同的系统上含义不同。在UNIX系统上,它返回的是“进程时间”,它是用秒表示的浮点数(时间戳)。而在WINDOWS中,第一次调用,返回的是进程运行的实际时间。而第二次之后的调用是自第一次调用以后到现在的运行时间。(实际上是以WIN32上QueryPerformanceCounter()为基础,它比毫秒表示更为精确)
time.asctime([t]) # 把一个表示时间的元组或者struct_time表示为这种形式:'Sun Jun 20 23:21:05 2020'。如果没有参数,将会将time.localtime()作为参数传入
time.ctime([secs]) # 把一个时间戳(按秒计算的浮点数)转化为time.asctime()的形式。如果参数未给或者为None的时候,将会默认time.time()即当前时间戳为参数。它的作用相当time.asctime(time.localtime(secs))

小结:
time点time得秒数,结果传入gm, local time得struct_time。
要想变回原秒数你得传回calendar.timegm和time. mktime。
string f和string p格式化时间就靠他两个。
asctime ,ctime来助力,专门转字符串,前者接收struct_time,后者专门处理秒数

3. datetime模块

分享一篇文章:文章来自:https://www.jianshu.com/p/e8951a4aeb71

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容