前言
趁着国庆假期,把python中的关于时间、日期、日历的几个模块深入研究研究,一直以来都是模模糊糊。
一、关于时间&日期中的几个概念与理论知识介绍
- UNIX时间纪元:
UNIX系统认为1970年1月1日0点是时间纪元,所以我们常说的UNIX时间戳是以1970年1月1日0点为计时起点时间的(英国时间),最初计算机操作系统是32位,而时间也是用32位表示。32位能表示的最大值是2147483647。另外1年365天的总秒数是31536000,2147483647/31536000 = 68.1,也就是说32位能表示的最长时间是68年,而实际上到2038年01月19日03时14分07秒,便会到达最大时间,过了这个时间点,所有32位操作系统时间便会变为1000000000000000 0000000000000000,也就是1901年12月13日20时45分52秒,这样便会出现时间回归的现象,很多软件便会运行异常了。到这里,我想问题的答案已经出来了:因为用32位来表示时间的最大间隔是68年,而最早出现的UNIX操作系统考虑到计算机产生的年代和应用的时限综合取了1970年1月1日作为UNIXTIME的纪元时间(开始时间),至于时间回归的现象相信随着64为操作系统的产生逐渐得到解决,因为用64位操作系统可以表示到292,277,026,596年12月4日15时30分08秒。
- 时区(UTC):
现今全球共分为24个时区(东、西各12个时区)。规定英国(格林尼治天文台旧址)为中时区(零时区)、东1—12区,西1—12区。每个时区横跨经度15度,时间正好是1小时。最后的东、西第12区各跨经度7.5度,以东、西经180度为界。每个时区的中央经线上的时间就是这个时区内统一采用的时间,称为区时,相邻两个时区的时间相差1小时。
- 闰年(Leap Year):
闰年是历法中的名词,分为普通闰年和世纪闰年。 闰年(Leap Year)是为了弥补因人为历法规定造成的年度天数与地球实际公转周期的时间差而设立的。补上时间差的年份为闰年。闰年共有366天(1月~12月分别为31天、29天、31天、30天、31天、30天、31天、31天、30天、31天、30天、31天)。
1582年以来的置闰规则:
普通闰年:公历年份是4的倍数,且不是100的倍数的,为闰年(如2004年、2020年等就是闰年)。
世纪闰年:公历年份是整百数的,必须是400的倍数才是闰年(如1900年不是闰年,2000年是闰年)。
1582年以前的惯例:四年一闰;如果公元A年的A(正数)能被4整除,那么它就是闰年;如果公元前B年的B(正数)除以4余1,那么它也是闰年。
- 公元(格里高利历、西元):
公元,是纪年法称谓,为纪年体系。该纪年法是以耶稣诞生为公元元年,公元元年之前的称公元前。所谓的2021年就是从公元元年开始算起的两千零二十一年。
python中即从0001-1-1 开始计算:Construct a date from a proleptic Gregorian ordinal. January 1 of year 1 is day 1. Only the year, month and day are non-zero in the result.
- python中对时间的三种表示方法:
秒级时间戳:UninX时间纪元(1970-1-1 0:0:0)开始,到某个时间点的总的秒数,用一个整数表示时间。
格式化的时间字符串:人们易懂、通俗的描述方式。例如:2021-10-6、2021/10/6 12:30:30等。
struct_time类型的元组时间:struct_time(tm_year=2021, tm_mon=10, tm_mday=6, tm_hour=14, tm_min=30, tm_sec=50, tm_wday=3, tm_yday=256, tm_isdst=0),九个参数组成的元组。
- python中关于时间定义的几个界限值介绍:
年份:year (1-9999) ---->minday=1, maxday=3652059
月份:month (1-12)
日期:day (1-31)
小时:hour (0-23)
分钟:minute (0-59)
秒钟:second (0-59)
微秒:microsecond (0-999999)
月份全称:January、February、March、April、May、June、July、August、September、October、November、December
月份简称:Jan、Feb、Mar、Apr、May、Jun、Jul、Aug、Sep、Oct、Nov、Dec
星期全称:Monday、Tuesday、Wednesday、Thursday、Friday、Saturday、Sunday
星期简称:Mon、Tue、Wed、Thu、Fri、Sat、Sun
weekday,通常一星期第一天从周一开始,标记为0::Return day of the week, where Monday == 0 … Sunday == 6.
isoweekday, ISO一星期从周一开始,标记为1:Return day of the week, where Monday == 1 … Sunday == 7.
二、python中time、datetime、calendar、dateutil 、timezone几个模块的关系介绍
三、python中time介绍
1.time模块日期格式转换的三角关系图
该图来源于网络:https://www.jb51.net/article/49326.htm
2.API汇总
API&返回值 | 描述 |
localtime(secs: float | None = ...) -> struct_time: ... | time.localtime() # 返回当前时间的 struct_time类型 time.localtime(54555552) # 返回指定时间戳的 struct_time类型 |
gmtime(secs: float | None = ...) -> struct_time: ... | time.gmtime() #返回 0 时区 时间 的 struct_time类型 time.gmtime(54555552) # 返回指定时间戳的 0 时区 struct_time类型 |
time() -> float: ... | time.time() # 返回当前时间点时间戳,秒 |
mktime(t: _TimeTuple | struct_time) -> float: ... | time.mktime(time.localtime()) #将 struct_time类型时间转换为时间戳 |
sleep(secs: float) -> None: ... | #线程休眠时间(等待时间) |
clock: () -> float | time.clock(), 第一次#返回线程执行时间; 第二次#返回距离上次time.clock()到本次time.clock()执行时间,第三次等 |
asctime(t: _TimeTuple | struct_time = ...) -> str: ... | time.asctime() #将struct_time类型时间转换为固定字符串:Wed Oct 6 20:25:12 2021 time.asctime(time.localtime(54555552)) #将指定的struct_time类型时间转换为字符串 |
ctime: (secs: float | None = ...) -> str | time.ctime() #将当前时间点时间戳转换为字符串;为空,默认为 time.time() time.ctime(1232222) #将指定时间戳转换为字符串 |
strftime(format: str, t: _TimeTuple | struct_time = ...) -> str: ... | time.strftime('%Y-%m-%d %H:%M:%S')#将一个 struct_time类型时间转换为指定格式的字符串时间,若为空,则默认为time.localtime() time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(1212121212))#将一个 struct_time类型时间转换为指定格式的字符串时间 |
strptime(string: str, format: str = ...) -> struct_time: ... | time.strptime('2021-10-6','%Y-%m-%d') #将字符串时间转换为 struct_time类型时间 |
get_clock_info(name: str) -> SimpleNamespace: ... | |
monotonic() -> float: ... | |
perf_counter() -> float: ... | |
process_time() -> float: ... | |
ctime(secs: float | None = ...) -> str: ... |
3.API应用介绍
time模块应用代码例:
import time
# Python的time模块实现主要调用C库,
# time模块, VSCode集成解释性pyi文件,指导开发
print(time.localtime()) # 返回当前时间的 struct_time类型
print(time.localtime(54555552)) # 返回指定时间戳的 struct_time类型
print(time.gmtime()) #返回 0 时区 时间 的 struct_time类型
print(time.gmtime(54555552)) # 返回指定时间戳的 0 时区 struct_time类型
print(time.time()) # 返回当前时间点时间戳,秒
print(time.mktime(time.localtime())) #将 struct_time类型时间转换为时间戳
print("wait 10s! ...")
time.sleep(10) #线程休眠时间(等待时间)
print("go on ... ")
print("thread all time: %s" %time.clock()) #返回线程执行时间
time.sleep(10)
print("thread all2 time: %s" %time.clock())#返回距离上次time.clock()到本次time.clock()执行时间
print(time.asctime()) #将struct_time类型时间转换为固定字符串:Wed Oct 6 20:25:12 2021
print(time.asctime(time.localtime(54555552))) #将指定的struct_time类型时间转换为字符串
print(time.ctime()) #将当前时间点时间戳转换为字符串;为空,默认为 time.time()
print(time.ctime(1232222)) #将指定时间戳转换为字符串
print(time.strftime('%Y-%m-%d %H:%M:%S')) #将一个 struct_time类型时间转换为指定格式的字符串时间,若为空,则默认为time.localtime()
print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(1212121212))) #将一个 struct_time类型时间转换为指定格式的字符串时间
print(time.strptime('2021-10-6','%Y-%m-%d')) #将字符串时间转换为 struct_time类型时间
time.struct_time()
三、python中datetime模块中time
1.python中 datetime.time API介绍
API | 参数 | 返回值 | 类型 | 描述 |
__new__(cls, hour=0, minute=0, second=0, microsecond=0, tzinfo=None) | 实例化time | return self | 类静态方法,构造器 | 实例化时间 d_t = time(23, 59, 59, 999999,None) |
replace(self, hour=None, minute=None, second=None, microsecond=None, tzinfo=True) |
return time | 普通方法 | 返回新时间类型, d_t_new = d_t.replace(14, 30,20,8000, None) |
|
hour | return hour (0-23) | @property | d_t_hour = d_t.hour | |
minute | return minute (0-59) | @property | d_t_minute = d_t.minute | |
second | return second (0-59) | @property | d_t_second = d_t.second | |
microsecond | return microsecond (0-999999) | @property | d_t_microsecond = d_t.microsecond | |
tzinfo | return timezone info object | @property | d_t_tzinfo = d_t.tzinfo | |
utcoffset(self) | return UTC | 普通方法 | 返回时间的时区 d_t_utc =d_t.utcoffset() |
|
tzname(self) | return the timezone name | 普通方法 | 返回时间的时区名称 d_t_tzname =d_t.tzname() |
|
dst(self) | return dst; 夏令时:0 否; 1 是 |
普通方法 | 返回是否夏令时 d_t_dst =d_t.dst() |
|
isoformat(self) | return the time formatted according to ISO. | 普通方法 | 转换时间为ISO Str格式:'HH:MM:SS.mmmmmm+zz:zz', or 'HH:MM:SS+zz:zz' d_t_iso = d_t.isoformat() |
|
strftime(self, fmt) | fmt格式 | return str | 普通方法 | 格式化时间为字符串,格式:fmt d_t_str = d_t.strftime('%H:%M:%S') |
2.python中 datetime.time 应用示例
# -*- coding:utf-8 -*-
#时间
from datetime import time
# time.min = time(0, 0, 0)
# time.max = time(23, 59, 59, 999999)
# time.resolution = timedelta(microseconds=1)
d_time = time(23, 59, 59, 99999, None)
print(d_time