所以,可以认为UTC是真正的基准时间,GMT相对UTC的偏差为0。
在实际中,我们的计算机中有一个硬件模块RCT,里面会实时记录UTC 时间,该模块有单独的电池供电,即使关机也不影响。
有了epoch这个时间基准,又有了UTC这个基准的基准,我们就可以精确地表示一个时间了。
(3)DST, tzone
尽管我们已经可以精确地表示一个时间,很多情况下,我们还是要根据地区实际情况对时间进行一个调整,最常见的就是时区,tzone,相信大家都比较熟悉。
此时,当我们说5点5分这个时间时,还需加上是哪个时区的5点5分才能精确说明一个时间。
另外一个对时间做出调整的就是DST.
DST 全称是Daylight Saving Time,是说,为了充分利用日光,减少用电,人为地对时间做出一个调整,这取决于不同国家和地区的政策法规。比如说,假设你冬天7点天亮起床,但夏天6点天亮,那么在夏天到来时人为将时间加1个小时,这样就可以让你还是觉得7点起床,但实际上是提前一个小时了。
那么,好奇的我们,一定要问一问,python是如何知道tzone和DST这两个的值呢?答案是通过环境变量。
这里我们只以linux为例来说明一下。
在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的开始和结束时间,我们就不细解读了。
(4)时间的表示,获取,转换
time模块中获取时间的基本方法是
t = time.time()
它返回的是从epoch到现在的秒数(用浮点数表示),用的是UTC时间。
我们自然而然地想把这个秒数转为年月日时分秒的形式,而这种转换又分两种,一种还是用UTC时间,一种用我们所在时区进行调整后的时间。
time模块给我们提供了两个方法,
time. gmtime(t)
time.localtime(t)
二者都返回一个类struct_time的实例,该实例具有如下属性:
相比用秒数表示的时间,这样的表示更适合我们理解。
这两个函数如果调用时不传参数,它们内部会调用time.time(),并用返回的秒数做转换。
相反的,python同样提供了将这两种struct_time转为秒数的方法。
calendar.timegm()方法用来把UTC的struct_time(gmtime的返回对象)转为从epoch开始的秒数
time.mktime()用来把用时区调整过的struct_time(即localtime的返回对象)对象转为从epoch开始的秒数
也就是说mktime方法会先找到系统中的时区和DST信息,并利用这个信息对struct_time进行调整后再换算成秒数。
另一种常见的需求是在时间和表示时间的字符串之间进行转换。
time模块中的strftime和strptime就是做这个用的。
看名字大家就应该知道它们的含义,
strftime 即 string format time,用来将时间格式化成字符串
strptime 即string parse time,用来将字符串解析成时间。
需要注意的是,这里的时间都是struct_time对象。
关于怎么格式化时间,是很简单的知识,这里就借用官网文档的内容了。
除了这两个函数,time模块中还提供了两个简便方法,来帮助将时间转为字符串
asctime用来将一个struct_time对象转为标准24字符的字符串,如下所示:
Sun Jun 20 23:21:05 1993
ctime方法与asctime作用相同,只不过它接收的是秒数,在内部,会先把秒数通过localtime转为struct_time,再往后就与asctime一样了。
以上就是time模块的核心内容,我尝试用一个口诀帮助记忆这些API
time点time得秒数
传入gm, local time得struct_time
要想变回原秒数
你得传回calendar.timegm和time. mktime
string f和string p
格式化时间靠哥俩
你要还是嫌费事
asctime ,ctime来助力
专门帮你转字符串
前者接收struct_time
后者专门处理秒数
分工合作不费力
学好time模块基本功
做个时间的明白人!
下面,我们要开始学习datetime模块。
3.datetime模块
(1)概览
time模块解决了时间的获取和表示,datetime模块则进一步解决了快速获取并操作时间中的年月日时分秒信息的能力。
简单说,该模块核心的类就三个,date类表示年月日,time类表示时分秒毫秒,这里不要和time模块搞混淆了。一句顺口溜可以帮助记清这个情况:
time里面没time
藏在datetime里
编的是不是不咋地?嗯,我也这么觉得。
datetime类就是date和time的组合。
有一点需要提前说明一下,time类和datetime类都有一个属性,它的值是一个tzinfo对象,里面包含了该time或者datetime的时区信息,一般称这个time或者datetime对象是aware的,它能够准确换算成自epoch开始的秒数。
如果该属性设置为None,那么,这时的time对象或者datetime对象就没有时区信息,具体它表示的是local time还是utc time,需要我们自己在程序中去决定。
这里我们所说的local time是指我们所在时区的时间, utc time指的就是国际标准时间,也就是格林尼治时间。下文同。
请记住一点,date中是没有时区信息的。
(2)从创建datetime开始
创建datetime对象,我最常用的办法如下
dt=datetime.datetime.fromtimestamp(time.time())
收集整理了一份《2024年最新Python全套学习资料》免费送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Python知识点,真正体系化!
加入社区:https://bbs.youkuaiyun.com/forums/4304bb5a486d4c3ab8389e65ecb71ac0
fe4e9.png)
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Python知识点,真正体系化!
加入社区:https://bbs.youkuaiyun.com/forums/4304bb5a486d4c3ab8389e65ecb71ac0