鱼C论坛

 找回密码
 立即注册
查看: 81275|回复: 104

[扩展阅读] time 模块详解(时间获取和转换)

  [复制链接]
发表于 2014-8-24 17:40:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
time 模块 -- 时间获取和转换

time 模块提供各种时间相关的功能

在 Python 中,与时间处理有关的模块包括:time,datetime 以及 calendar


必要说明:

  • 虽然这个模块总是可用,但并非所有的功能都适用于各个平台。
  • 该模块中定义的大部分函数是调用 C 平台上的同名函数实现,所以各个平台上实现可能略有不同。


一些术语和约定的解释:

  • 时间戳(timestamp)的方式:通常来说,时间戳表示的是从 1970 年 1 月 1 日 00:00:00 开始按秒计算的偏移量(time.gmtime(0))此模块中的函数无法处理 1970 纪元年以前的日期和时间或太遥远的未来(处理极限取决于 C 函数库,对于 32 位系统来说,是 2038 年)
  • UTC(Coordinated Universal Time,世界协调时)也叫格林威治天文时间,是世界标准时间。在中国为 UTC+8
  • DST(Daylight Saving Time)即夏令时的意思
  • 一些实时函数的计算精度可能低于它们建议的值或参数,例如在大部分 Unix 系统,时钟一秒钟“滴答”50~100 次


时间元祖(time.struct_time):

gmtime(),localtime() 和 strptime() 以时间元祖(struct_time)的形式返回。

索引值(Index)属性(Attribute) 值(Values)
0 tm_year(年) (例如:2015)
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(见下方注1)
6 tm_wday(星期几) 0 ~ 6(0 表示星期一)
7 tm_yday(一年中的第几天) 1 ~ 366
8 tm_isdst(是否为夏令时) 0, 1, -1(-1 代表夏令时)

注1:范围真的是 0 ~ 61(你没有看错哦^_^);60 代表闰秒,61 是基于历史原因保留。


time.altzone

返回格林威治西部的夏令时地区的偏移秒数;如果该地区在格林威治东部会返回负值(如西欧,包括英国);对夏令时启用地区才能使用。


time.asctime([t])

接受时间元组并返回一个可读的形式为"Tue Dec 11 18:07:14 2015"(2015年12月11日 周二 18时07分14秒)的 24 个字符的字符串。


time.clock()

用以浮点数计算的秒数返回当前的 CPU 时间。用来衡量不同程序的耗时,比 time.time() 更有用。

Python 3.3 以后不被推荐,由于该方法依赖操作系统,建议使用 perf_counter() 或 process_time() 代替(一个返回系统运行时间,一个返回进程运行时间,请按照实际需求选择)


time.ctime([secs])

作用相当于 asctime(localtime(secs)),未给参数相当于 asctime()


time.gmtime([secs])

接收时间辍(1970 纪元年后经过的浮点秒数)并返回格林威治天文时间下的时间元组 t(注:t.tm_isdst 始终为 0)


time.daylight

如果夏令时被定义,则该值为非零。


time.localtime([secs])

接收时间辍(1970 纪元年后经过的浮点秒数)并返回当地时间下的时间元组 t(t.tm_isdst 可取 0 或 1,取决于当地当时是不是夏令时)


time.mktime(t)

接受时间元组并返回时间辍(1970纪元后经过的浮点秒数)


time.perf_counter()

返回计时器的精准时间(系统的运行时间),包含整个系统的睡眠时间。由于返回值的基准点是未定义的,所以,只有连续调用的结果之间的差才是有效的。


time.process_time()

返回当前进程执行 CPU 的时间总和,不包含睡眠时间。由于返回值的基准点是未定义的,所以,只有连续调用的结果之间的差才是有效的。


time.sleep(secs)

推迟调用线程的运行,secs 的单位是秒。


time.strftime(format[, t])

把一个代表时间的元组或者 struct_time(如由 time.localtime() 和 time.gmtime() 返回)转化为格式化的时间字符串。如果 t 未指定,将传入 time.localtime()。如果元组中任何一个元素越界,将会抛出 ValueError 异常。

format 格式如下:

格式 含义 备注
%a 本地(locale)简化星期名称
%A 本地完整星期名称
%b 本地简化月份名称
%B 本地完整月份名称
%c 本地相应的日期和时间表示
%d 一个月中的第几天(01 - 31)
%H 一天中的第几个小时(24 小时制,00 - 23)
%l 一天中的第几个小时(12 小时制,01 - 12)
%j 一年中的第几天(001 - 366)
%m 月份(01 - 12)
%M 分钟数(00 - 59)
%p 本地 am 或者 pm 的相应符 注1
%S 秒(01 - 61) 注2
%U 一年中的星期数(00 - 53 星期天是一个星期的开始)第一个星期天之前的所有天数都放在第 0 周 注3
%w 一个星期中的第几天(0 - 6,0 是星期天) 注3
%W 和 %U 基本相同,不同的是 %W 以星期一为一个星期的开始
%x 本地相应日期
%X 本地相应时间
%y 去掉世纪的年份(00 - 99)
%Y 完整的年份
%z 用 +HHMM 或 -HHMM 表示距离格林威治的时区偏移(H 代表十进制的小时数,M 代表十进制的分钟数)
%Z 时区的名字(如果不存在为空字符)
%% %号本身

注1:“%p”只有与“%I”配合使用才有效果。
注2:范围真的是 0 ~ 61(你没有看错哦^_^);60 代表闰秒,61 是基于历史原因保留。
注3:当使用 strptime() 函数时,只有当在这年中的周数和天数被确定的时候 %U 和 %W 才会被计算。

举个例子:
  1. # I love FishC.com!
  2. >>> import time as t
  3. >>> t.strftime("a, %d %b %Y %H:%M:%S +0000", t.gmtime())
  4. 'a, 24 Aug 2014 14:15:03 +0000'
复制代码


time.strptime(string[, format])

把一个格式化时间字符串转化为 struct_time。实际上它和 strftime() 是逆操作。

举个例子:
  1. # I really love FishC.com!
  2. >>> import time as t
  3. >>> t.strptime("30 Nov 14", "%d %b %y")
  4. time.struct_time(tm_year=2014, tm_mon=11, tm_mday=30, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=6, tm_yday=334, tm_isdst=-1)
复制代码


time.time()

返回当前时间的时间戳(1970 纪元年后经过的浮点秒数)


time.timezone

time.timezone 属性是当地时区(未启动夏令时)距离格林威治的偏移秒数(美洲 >0;大部分欧洲,亚洲,非洲 <= 0)


time.tzname

time.tzname 属性是包含两个字符串的元组:第一是当地非夏令时区的名称,第二个是当地的 DST 时区的名称。



评分

参与人数 6荣誉 +24 鱼币 +25 贡献 +15 收起 理由
团子_大家族 + 5 + 5 + 3 爱了爱了
TheOne000 + 3 + 3 + 2
space-magician + 4 + 5 + 3 鱼C有你更精彩^_^
1404461012 + 5 + 5 + 3 感谢楼主无私奉献!
七磅 + 5 + 5 + 3 感谢楼主无私奉献!
Ruide + 2 + 2 + 1 Merci.

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-8-25 22:11:30 | 显示全部楼层
感谢楼主分享!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

头像被屏蔽
发表于 2014-8-27 08:16:31 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

发表于 2014-8-29 15:47:19 | 显示全部楼层
前几天还在找,就有了,赞
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2014-10-3 14:27:54 | 显示全部楼层
学习了,最好有实例
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2014-10-14 15:13:17 | 显示全部楼层
今天先看点,要用是再查找
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-12-31 11:27:42 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-1-15 14:31:43 | 显示全部楼层
老规矩,先顶后看,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-2-21 16:16:22 | 显示全部楼层
顶啊,之前看过有人做一个钟表就是用time模块
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-6-21 22:54:28 | 显示全部楼层
看了一遍,不知道记忆可以保持几天!!
果然还是希望有一本可以查阅的python大全~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

发表于 2015-6-23 10:38:43 | 显示全部楼层
{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-10-4 19:17:51 | 显示全部楼层
感精答
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-10-4 22:35:35 | 显示全部楼层
看后很有收获{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-10-6 16:47:05 | 显示全部楼层
time.process_time() 方法精度不够用怎么办,只有小数点后6位
time.time()精度为什么有22位
怎么提升计时器的精度
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-11-2 21:41:48 | 显示全部楼层
看一遍看不懂,多看几遍
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-11-19 14:24:25 | 显示全部楼层
已看完,以后会常用到,多谢分享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-23 09:09:25 | 显示全部楼层
奋斗ing
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-3-17 17:22:03 | 显示全部楼层
import time as t

class m:
    def __str__(self):
        return self.prompt

    __repr__ = __str__

    #定义时间相加
    def __add__(self,other):
        tips = '相加之后,总共运行了'
        result = []
        print(other.lasted)
        print(self.lasted)
        for index in range(6):
            result.append(self.lasted[index] + other.lasted[index])
            print(index)
            if result[index]:
                tips += (str(result[index]) + self.un[index])
        return tips
            
   
    #定义参数
    def __init__(self):
        self.begin = 0
        self.end = 0
        self.lasted = []
        self.prompt = '还没有开始计时啦,先用start好么?'
        self.un = ['年','月','天','小时','分','秒']
   
    #开始计时
    def start(self):
        self.begin = t.localtime()
        print('开始计时')

    #结束计时   
    def stop(self):
        self.end = t.localtime()
        if self.begin == 0:
            print('请先调用start()方法!!')
        else:
            self.calc()
            print('结束计时')

    #计算计时时间
    def calc(self):
        self.prompt = '总共运行了'
        lasted = []
        for index in range(6):
            lasted.append(self.end[index] - self.begin[index])
            if lasted[index]:
                self.prompt += (str(lasted[index]) + self.un[index])
                print (list(lasted))
        self.begin = 0
        self.start = 0


小甲鱼,我执行 相加操作时,为啥会提示 越界了呢?
>>> a = m()
>>> a.start()
开始计时
>>> a.stop()
结束计时
>>> b = m()
>>> b.start()
开始计时
>>> b.stop()
结束计时
>>> a + b
[]
[]
Traceback (most recent call last):
  File "<pyshell#53>", line 1, in <module>
    a + b
  File "D:/Python34/test13.py", line 16, in __add__
    result.append(self.lasted[index] + other.lasted[index])
IndexError: list index out of range
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2016-7-19 11:22:01 | 显示全部楼层
好好好!!!感谢分享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-28 12:29:40 | 显示全部楼层
非常完美!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 12:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表