个人的datetime记录:
2020年8月15日重新更新
Python的time与datetime一直没有好好的深入记录过,今天想到了,先把time的一些基本功能记下来。
首先先上time.time与time.ctime(其实ctime应该与time.asctime一起用比较好):
time.ctime与time.asctime都是格式化输出简单的时间字符串,但操作的对象不同,一个是操作时间戳timestamp,一个是操作时间元祖struct_time
既然说到timestamp可以从time.time返回从1970年1月1日0:00到现在的过的时间总秒,类型为浮点型。time.localtime()可以返回struct_time对象(时间精度只能到秒)。
In [34]: timestamp
Out[34]: 1597476594.6344671
In [35]: struct_time = time.localtime()
In [36]: struct_time
Out[36]: time.struct_time(tm_year=2020, tm_mon=8, tm_mday=15, tm_hour=15, tm_min=30, tm_sec=28, tm_wday=5, tm_yday=228, tm_isdst=0)
In [37]:
现在通过time.ctime与time.asctime来简单格式化输出时间。timestamp与struct_time返回的都是本地时间。
In [37]: time.ctime(timestamp)
Out[37]: 'Sat Aug 15 15:29:54 2020'
In [38]: time.asctime(struct_time)
Out[38]: 'Sat Aug 15 15:30:28 2020'
In [39]:
time.localtime与time.ctime都可以接收时间戳参数,且返回本地时间。
In [39]: time.localtime(0)
Out[39]: time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=8, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)
In [40]: time.ctime(0)
Out[40]: 'Thu Jan 1 08:00:00 1970'
In [41]: t0 = time.localtime(0)
In [42]: time.asctime(t0)
Out[42]: 'Thu Jan 1 08:00:00 1970'
In [43]:
获取格林威治时间也就是0时区的时间,可以通过time.gmtime(),里面可以添加时间戳.
In [57]: time.gmtime()
Out[57]: time.struct_time(tm_year=2020, tm_mon=8, tm_mday=15, tm_hour=7, tm_min=45, tm_sec=40, tm_wday=5, tm_yday=228, tm_isdst=0)
In [58]: time.gmtime(timestamp)
Out[58]: time.struct_time(tm_year=2020, tm_mon=8, tm_mday=15, tm_hour=7, tm_min=29, tm_sec=54, tm_wday=5, tm_yday=228, tm_isdst=0)
In [59]: time.localtime()
Out[59]: time.struct_time(tm_year=2020, tm_mon=8, tm_mday=15, tm_hour=15, tm_min=46, tm_sec=8, tm_wday=5, tm_yday=228, tm_isdst=0)
time.gmtime返回的也是struct_time,只不过这个返回的时间为0时区的时间。当然,你也可以通过自己的时区与零时区进行加减法运算进行计算。time模块里面,除了时间戳为
浮点型数字,可以进行加减运算,另外的对象不能进行大小比较
struct_time可以指定格式化输出,也可以转换成timestamp,同时struct_time的输出,里面的各个参数也有一些特殊的意义。
time.struct_time(tm_year=2020, tm_mon=8, tm_mday=15, tm_hour=15, tm_min=50, tm_sec=29, tm_wday=5, tm_yday=228, tm_isdst=0)
参数tm_wday为星期几,从0开始星期一就是0,星期日为6,tm_yday=1为一年中的第几天,m_isdst = 1 的时候表示时间是夏令时,值为0的时候表示非夏令时
比较有用的是星期几还有一年中的第几天。
开始做格式化输出:
%a Locale的缩写工作日名称。
%A Locale的整个工作日名称。
%b 语言环境的缩写月份名称。
%B Locale的完整月份名称。
%c 语言环境的适当日期和时间表示。
%d 一个十进制数字[01,31]。
%H 小时(24小时制),十进制数[00,23]。
%I 小时(12小时制)十进制数[01,12]。
%j 一年中的十进制数[001,366]。
%m 月为十进制数[01,12]。
%M 以十进制数分钟[00,59]。
%p Locale相当于AM或PM。 (1)
%S 秒为十进制数[00,61]。 (2)
%U 年的星期数(星期日为星期的第一天)为十进制数[00,53]。在第一个星期日之前的新的一年的所有天被认为是在第0周。 (3)
%w 工作日为十进制数[0(星期日),6]。
%W 年的星期数(星期一作为星期的第一天)作为十进制数[00,53]。在第一个星期一之前的新的一年中的所有天被认为是在第0周。 (3)
%x 语言环境的适当日期表示。
%X 语言环境的适当时间表示。
%y 年,无世纪作为十进制数[00,99]。
%Y 年份以世纪为十进制数。
%z 指示与+ HHMM或-HHMM形式的UTC / GMT的正或负时差的时区偏移,其中H表示十进制小时数字,M表示十进制分数字[-23:59,+23:59]。
%Z 时区名称(如果没有时区,则不包含字符)。
%% 字面值'%'字符。
In [63]: time.strftime?
Docstring:
strftime(format[, tuple]) -> string
Convert a time tuple to a string according to a format specification.
See the library reference manual for formatting codes. When the time tuple
is not present, current time as returned by localtime() is used.
Commonly used format codes:
%Y Year with century as a decimal number.
%m Month as a decimal number [01,12].
%d Day of the month as a decimal number [01,31].
%H Hour (24-hour clock) as a decimal number [00,23].
%M Minute as a decimal number [00,59].
%S Second as a decimal number [00,61].
%z Time zone offset from UTC.
%a Locale's abbreviated weekday name.
%A Locale's full weekday name.
%b Locale's abbreviated month name.
%B Locale's full month name.
%c Locale's appropriate date and time representation.
%I Hour (12-hour clock) as a decimal number [01,12].
%p Locale's equivalent of either AM or PM.
Other codes may be available on your platform. See documentation for
the C library strftime function.
Type: builtin_function_or_method
In [64]: time.strftime("%Y-%m-%d %X")
Out[64]: '2020-08-15 16:01:03'
In [65]: time.strftime("%Y-%m-%d %X", time.localtime())
Out[65]: '2020-08-15 16:01:37'
In [66]:
从示例可以看出来,传入两个参数,第一个参数是必填的,格式化输出的格式要求,第二个参数默认为current struct_time,当然你也可以添加自己定义的struct_time
把struct_time转换成timestamp相对简单多了,只需要再mktime里面传入struct_time就可以了
In [68]: time.mktime?
Docstring:
mktime(tuple) -> floating point number
Convert a time tuple in local time to seconds since the Epoch.
Note that mktime(gmtime(0)) will not generally return zero for most
time zones; instead the returned value will either be equal to that
of the timezone or altzone attributes on the time module.
Type: builtin_function_or_method
In [69]: time.mktime(time.localtime())
Out[69]: 1597478852.0
In [70]: time.time()
Out[70]: 1597478856.857926
In [71]:
最后还有一个把时间戳与字符串转化为struct_time的,第一个已经介绍了通过time.localtime传入参数
第二个通过time.strptime可以实现
In [71]: time.strptime?
Docstring:
strptime(string, format) -> struct_time
Parse a string to a time tuple according to a format specification.
See the library reference manual for formatting codes (same as
strftime()).
Commonly used format codes:
%Y Year with century as a decimal number.
%m Month as a decimal number [01,12].
%d Day of the month as a decimal number [01,31].
%H Hour (24-hour clock) as a decimal number [00,23].
%M Minute as a decimal number [00,59].
%S Second as a decimal number [00,61].
%z Time zone offset from UTC.
%a Locale's abbreviated weekday name.
%A Locale's full weekday name.
%b Locale's abbreviated month name.
%B Locale's full month name.
%c Locale's appropriate date and time representation.
%I Hour (12-hour clock) as a decimal number [01,12].
%p Locale's equivalent of either AM or PM.
Other codes may be available on your platform. See documentation for
the C library strftime function.
Type: builtin_function_or_method
In [72]: str_time = '2011-05-05 16:37:06'
In [73]: time.strptime('2011-05-05 16:37:06', '%Y-%m-%d %X')
Out[73]: time.struct_time(tm_year=2011, tm_mon=5, tm_mday=5, tm_hour=16, tm_min=37, tm_sec=6, tm_wday=3, tm_yday=125, tm_isdst=-1)
注意这个里面必须填写两个参数,第一个为输入被转换的时间字符串,第二个为转换的格式,必须对应。
这个图可以比较直观的看到一些方法的使用.
下面是Python3标准库的一些知识
time.monotonic用来计算相对时间,因为time.time读取的是计算机时间,如果计算机时间调整的化,会对相对时间差发生变化,该函数可以避免发生。
从时间精度来看,还是time.time的精度高。
import time
t1 = time.time()
tt1 = time.monotonic()
time.sleep(0.5)
t2 = time.time()
tt2 = time.monotonic()
print(t2 - t1)
print(tt2 - tt1)
# 0.5024559497833252
# 0.502452992
time.perf_counter跟上面的monotonic实际我使用差不多,主要用于测试性能时测试,该函数具体运行出来的数值,只能用于比较计算,不能用于绝对时间。该函数时间精度与monotoni一样。
import time
t1 = time.time()
tt1 = time.monotonic()
ttt1 = time.perf_counter()
time.sleep(0.5)
t2 = time.time()
tt2 = time.monotonic()
ttt2 = time.perf_counter()
print(t2 - t1)
print(tt2 - tt1)
print(ttt2 - ttt1)
# 0.5030510425567627
# 0.503047529
# 0.503047695