本系列【文档学习】记录了博主学习Python3.7.2中的各个模块的笔记。官方文档。
本文记录了三个与日期和时间相关的模块:time、datetime和calendar。更新于2019.03.12。
time——时间访问和变换
本模块提供了多样的与时间相关的函数。与之相关的函数包括datetime和calendar。
尽管这个模块一直存在,但不是所有平台都能够调用所有函数。大多数定义在这个模块中的函数需要有相同名称的C library functions。建议参考平台文件(platform documentation),因为这些函数在不同平台有不同的语义。
下面阐述了一些术语和约定。
- epoch是开始时间的节点,取决于平台。对于Unix,epoch是1970年1月1日0点(UTC)。查找给定平台的epoch可以看time.gmtime(0)。下图是博主电脑上显示的运行结果:
- seconds表示从epoch到现在流逝的秒数,通常排除leap seconds(闰秒)。在POSIX-compilant系统(诸如Linux,macOS,BSD等)平台上,总时间里面已经减去了闰秒。
- 这个模块中的函数不能处理在epoch以前或很久以后的未来的时间,未来时间的截止时间由C library定义,对于32位系统,通常是2038年。
- 千禧虫(Year 2000 (Y2K))问题:Python基于的是平台的C library,通常没有千禧虫问题,因为所有的时间在内部都是以秒计算的。函数strptime()在给定
%y
格式代码时可以解析2-digit年。当解析2-digit年时,其根据POSIX和ISO C standards将69-99映射成1969-1999年,将0-68映射成2000-2068年。
>>> import time
>>> time.strptime("30 Nov 00", "%d %b %y") # doctest: +NORMALIZE_WHITESPACE
time.struct_time(tm_year=2000, tm_mon=11, tm_mday=30, tm_hour=0, tm_min=0,
tm_sec=0, tm_wday=3, tm_yday=335, tm_isdst=-1)
- UTC是Corrdinated Universal Time(世界通用时,正式名称是Greenwich Mean Time或GMT),首字母缩写UTC不是错误,而是英语和法语的妥协。
- DST是Daylight Saving Time(夏令时),根据时区调整(通常)本年中的一个小时。DST规则很“玄幻”(由当地法律规定),而且每年可能不同。C library有一个保存你了local rules的table(考虑灵活性,通常从系统文件中读取)。
- 不同real-time函数的精度可能根据表达其值的unit的不同而变化。比如,在大多数Unix系统中,钟每秒只走50或100次。
- 另一方面,time()和sleep()的精度要比对应的Unix中的高:时间由floating point numbers表述,time()返回能实现的最高精度(当Unix系统的gettimeofday()可获得时使用),而sleep()则可以接受一个非零分数(Unix的select()函数用于实现这个)
- 由gmtime(),localtime()和strptime()返回的值,和asctime(),mktime()和strftime()可以接受的值,是一个有9个整数的sequence。
去struct_time看这些东西的描述。
从版本3.3开始,扩展成当平台提供对应的struct_tm
成员时,struct_time可以提供tm_gmtoff和tm_zone属性。
版本3.6开始,struct_time属性tm_gmtoff和tm_zone在所有平台都可以了。 - 用下面的函数实现不同时间表达之间的转换。
From | To | Use |
---|---|---|
从epoch开始的秒 | UTC内的struct_time | gmtime() |
从epoch开始的秒 | 当地时间的struct_time | localtime() |
UTC内的struct_time | 从epoch开始的秒 | calendar.timegm() |
当地时间的struct_time | 从epoch开始的秒 | mktime() |
函数
这一部分记录了time模块中包括的某些函数,看更多函数的说明请到官方文档。
time.asctime([t])
将元祖(tuple)或struct_time描述的时间由gmtime()或localtime()转换成如下形式的string:‘Sun Jun 20 23:21:05 1993’。如果不提供,当前时间将由localtime()返回。当地信息不被asctime()使用。
time.time() -> float
以浮点数形式返回从epoch开始的秒。具体epoch的日期和闰秒由平台决定。在Windows和大多数Unix系统中,epoch是1970年1月1日0点0分0秒(UTC),闰秒不计入时间。这个通常指向Unix time。查看给定平台的具体epoch请调用gmtime(0)
。
注意即使时间总是返回一个浮点数,但不是所有的系统都提供精度高于1秒的时间。尽管这个函数通常返回非下降的值,但是当系统时间在两次函数调用中间被置成之前的时间了,第二次调用也会返回小于第一次调用的值。
time()返回的数通常在UTC中被转换成一个更常用的时间格式(比如年、月、日、小时等)传递给gmtime()函数或将当地时间传递给localtime()函数。这两种情况下,都返回一个struct_time object,之后calendar date中的元素可以以attribute的形式被处理了。
class time.struct_time
提供下面的值:
Index | Attribute | Values |
---|---|---|
0 | tm_year | 比如1993 |
1 | tm_mon | 范围1到12 |
2 | tm_mday | 范围1到31 |
3 | tm_hour | 范围0到23 |
4 | tm_min | 范围0到59 |
5 | tm_sec | 范围0到61(看strftime()描述中的**(2)**) |
6 | tm_wday | 范围0到6,周一是0 |
7 | tm_yday | 范围1到366 |
8 | tm_isdst | 0、1或-1(看下面) |
N/A | tm_zone | 时区名称的缩写 |
N/A | tm_gmtoff | UTC秒以东的偏置(offset east of UTC) |
datetime
博主暂时没用到,后续更新。官方文档。
calendar
博主暂时没用到,后续更新。官方文档。
更多内容,欢迎加入星球讨论。