Python 没有包括相应日期和时间的内置类型。只是提供了3个相应的模块,能够採用多种表示管理日期和时间值:

*    time
模块由底层C库提供与时间相关的函数。它包括一些函数用于获取时钟时间和处理器的执行时间,还提供了基本解析和字符串格式化工具  


*    datetime 模块为日期、时间以及日期时间值提供一个更高层接口。

datetime 中的类支持算术、比較和时区配置。

*    calendar 模块能够创建周、月和年的格式化表示。

它还能够用来计算反复事件、给定日期是星期几,以及其它基于日历的值。

time - 时钟时间模块。

我们使用apihelper.info(能够參考系列前面文章《Python
学习笔记 9 -- Python强大的自省简析
》)查看time 类,能够得知time 模块主要有下面方法:

1. time

核心函数。返回值是以浮点数计的自纪元開始以来的秒数。用于比較或者计算还是比較方便。

2. ctime

假设你想打印日期或者时间信息,使用 ctime 要比time 更加方便:

>>> time.ctime()

    'Tue Jul  8 15:26:21 2014'

我们能够看到 ctime 返回的是可读的可直接用于记录时间的字符串形式时间信息。

我们还能够使用 ctime 来格式化打印一个由 time 计算的时间值:

    >>> print "Now time is   :",time.ctime() ;  later = time.time()+15 ;  print "15 secs later :", time.ctime(later)

    结果是:

        Now time is   : Tue Jul  8 15:28:54 2014

        15 secs later : Tue Jul  8 15:29:09 2014

3. clock

处理器时钟,能够用来计算程序使用的实际时间。评估性能。

>>> print 123456789*123456789/987654, time.clock()      

    15432103500 0.08

    >>> print 123456789*123456789/987654321, time.clock()

    15432098 0.09

    >>> print (123456789*123456789+ 1234567890/987654321)*123456, time.clock()

    1881664346183521084032 0.11

>>> print (123456789*123456789+ 1234567890/987654321)*123456, time.clock()     # 与上面相同复杂的运算,放在主频比較低的树莓派上执行。cpu 耗时要长非常多

    1881664346183521084032 3.49

4. gmtime, localtime 和tzset

先统一介绍一下这几个函数(后面结合实例会了解的更加清楚):

time.gmtime([secs])  --參数为一个以秒表示的时间值,gmtime 函数将參数转化并返回一个
struct_time 结构(见本文最后一节)的时间信息。且gmtime转化得到的时间是UTC 时间(世界统一时间)。假设没有使用一个秒数作为參数,将会默认使用并转化当前时间(即time.time()), 所以直接使用 time.gmtime() 会得到当前UTC
时间,效果同 time.gmtime(time.time())。

time.localtime([secs])  -- 函数使用以及作用都与gmtime 类似,可是转化的结果是本地时间。也就是说它转化的结果是符合当前设置的时区信息的本地时间。

相同,假设没有參数,默认转化的也是当前时间(即time.time()),所以直接使用
time.localtime() 会得到当前的本地时间。效果同 time.localtime(time.time())。



time.tzset()  -- 设置时区从而改变了上面两个函数的时间转化的规则。

而对于 时区的选择。我们能够查看參考Linux 的 "/usr/share/zoneinfo/" 文件夹:

$ ls /usr/share/zoneinfo/

Africa      Australia  Cuba     Etc      GMT0       Iceland      Japan      MST      Poland      right      UCT        zone.tab

America     Brazil     EET      Europe   GMT-0      Indian       Kwajalein  MST7MDT  Portugal    ROC        Universal  Zulu

Antarctica  Canada     Egypt    Factory  GMT+0      Iran         Libya      Navajo   posix       ROK        US

Arctic      CET        Eire     GB       Greenwich  iso3166.tab  localtime  NZ       posixrules  Singapore  UTC

Asia        Chile      EST      GB-Eire  Hongkong   Israel       MET        NZ-CHAT  PRC         SystemV    WET

Atlantic    CST6CDT    EST5EDT  GMT      HST        Jamaica      Mexico     Pacific  PST8PDT     Turkey     W-SU

此外,对于时区的划分以及使用我可能解释不清,并且也不想占用此篇文章的篇幅。想了解的请点这里

你须要理解的是:

UTC 指的是Coordinated Universal Time- 世界协调时间(又称世界标准时间、世界统一时间)。是经过平均太阳时(以格林威治时间GMT为准)、地轴运动修正后的新时标以及以「秒」为单位的国际原子时所综合精算而成的时间,计算过程相当严谨精密。

中国一般使用CST 时间。解释为“China Standard Time UT+8:00” ,即标准的UTC 时间加8。

对于时区的设置以及localtime 显示的信息:

>>> time.gmtime()       # 直接使用,默认转化当前时间time.time()并返回 struct_time 结构的 UTC 时间

    time.struct_time(tm_year=2014, tm_mon=7, tm_mday=9, tm_hour=1, tm_min=56, tm_sec=28, tm_wday=2, tm_yday=190, tm_isdst=0)

    >>> time.localtime()    #
返回当前的本地时间

    time.struct_time(tm_year=2014, tm_mon=7, tm_mday=9, tm_hour=9, tm_min=56, tm_sec=32, tm_wday=2, tm_yday=190, tm_isdst=0)

    >>> os.environ['TZ'] =  'Brazil/East'    # 既然在世界杯期间,最好还是设置看看巴西时间

    >>> time.tzset()        # 设置时区

    >>> time.gmtime()       # 我们能够看到设置时区后对UTC 时间并无干扰

    time.struct_time(tm_year=2014, tm_mon=7, tm_mday=9, tm_hour=1, tm_min=57, tm_sec=42, tm_wday=2, tm_yday=190, tm_isdst=0)

    >>> time.localtime()    # 本地时间已经显示的不同了,由于当前输出的是巴西时间

    time.struct_time(tm_year=2014, tm_mon=7, tm_mday=8, tm_hour=22, tm_min=57, tm_sec=49, tm_wday=1, tm_yday=189, tm_isdst=0)

    >>> os.environ['TZ'] =  'Asia/Shanghai'     #又一次设置时区为上海(好像没有北京时间,安装Linux 时小伙伴应该都注意过这个问题。

)。回到北京时间

    >>> time.tzset()

    >>> time.gmtime()

    time.struct_time(tm_year=2014, tm_mon=7, tm_mday=9, tm_hour=1, tm_min=58, tm_sec=7, tm_wday=2, tm_yday=190, tm_isdst=0)

    >>> time.localtime()

    time.struct_time(tm_year=2014, tm_mon=7, tm_mday=9, tm_hour=9, tm_min=58, tm_sec=10, tm_wday=2, tm_yday=190, tm_isdst=0)

    >>> time.tzname         # 中国的时区名为 CST。理解为“China Standard Time UT+8:00”

    ('CST', 'CST')

5. strptime 和 strftime

这两个函数用来解析和格式化输出时间。用作字符串格式的时间与 struct_time 结构的时间之间的转化。

对于上面的localtime ,我们能够看到输出结果是一个 struct_time 结构体并以元组格式打印。我们能够使用" time.localtime().tm_year " 这样单独取当中一项。

所以我们打印日期时能够这样:

>>> print "%s-%s-%s" % (time.localtime().tm_year, time.localtime().tm_mon, time.localtime().tm_mday)

2014-7-8

而ctime 输出的结果是字符串形式, 对于这样的的我们能够使用这两个函数来解析/格式化:

strftime 用于将元组转化为字符串, 它将指定的struct_time(默觉得当前时间),依据指定的格式化字符串输出。

    >>> time.localtime()    # 我们能够知道,localtime 打印的结果是元组形式的时间结构体

time.struct_time(tm_year=2014, tm_mon=7, tm_mday=8, tm_hour=16, tm_min=13, tm_sec=9, tm_wday=1, tm_yday=189, tm_isdst=0)

>>> time.strftime('%Y-%m-%d %H:%M:%S',
time.localtime()) 
   # 使用格式化打印,我们能够看到比上面使用元组项要方便非常多

'2014-07-08 16:13:10'

strptime 用于将字符串格式的格式化为元组:

    >>> time.ctime()

    'Tue Jul  8 16:16:32 2014'

    >>> time.strptime(time.ctime())

    time.struct_time(tm_year=2014, tm_mon=7, tm_mday=8, tm_hour=16, tm_min=16, tm_sec=45, tm_wday=1, tm_yday=189, tm_isdst=-1)

    >>> time.strftime( '%Y-%m-%d %H:%M:%S', time.strptime(time.ctime()))        #
格式化之后我们再使用strftime 格式化打印成我们想要的格式就非常方便了。!!

    '2014-07-08 16:17:29'





time.strftime 的使用格式为:

        strftime(format[, tuple])

里面有非常多參数。可以让你可以更任意的输出自己想要的东西:

        %y 两位数的年份表示(00-99)

        %Y 四位数的年份表示(000-9999)

        %m 月份(01-12)

        %d 月内中的一天(0-31)

        %H 24小时制小时数(0-23)

        %I 12小时制小时数(01-12)

        %M 分钟数(00=59)

        %S 秒(00-59)

        

        %a 本地简化星期名称

        %A 本地完整星期名称

        %b 本地简化的月份名称

        %B 本地完整的月份名称

        %c 本地对应的日期表示和时间表示

        %j 年内的一天(001-366)

        %p 本地A.M.或P.M.的等价符

        %U 一年中的星期数(00-53)星期天为星期的開始

        %w 星期(0-6),星期天为星期的開始

        %W 一年中的星期数(00-53)星期一为星期的開始

        %x 本地对应的日期表示

        %X 本地对应的时间表示

        %Z 当前时区的名称

        %% %号本身

6. sleep

休眠函数, 不论什么语言中基本上都会有休眠函数,而python 中相应的就是 time.sleep(n)。

携带的參数指定挂起运行程序的秒数。

为了更精确休眠的时间參数能够是一个浮点数。实际的挂起时间可能小于请求的数,由于捕获其它信号会终止休眠并运行信号相应的捕获程序。挂起时间也有可能比要求的更长。由于可能会调度系统中的其它活动。

7. mktime

这是 localtime 的逆函数。它的參数是 struct_time 结构或者完整的9 元素的元组(假设使用元组,须要dst 标识。假设不知能够使用-1)。为了兼容time(),它会返回一个浮点数。假设參数不能被表示为一个有效的时间。会引发OverflowError
或者 ValueError错误。

    >>> t = time.time()

    >>> t

    1404867269.117389

    >>> time.localtime(t)   # 上面已说过,使用time.localtime 能够将time() 生成的浮点数转化为 struct_time 结构

    time.struct_time(tm_year=2014, tm_mon=7, tm_mday=9, tm_hour=8, tm_min=54, tm_sec=29, tm_wday=2, tm_yday=190, tm_isdst=0)

    >>> time.mktime(time.localtime(t))

    1404867269.0            # 我们能够看到time.mktime 将 struct_time 结构再次还原为浮点数,当中由于 struct_time 结构中最小值为 tm_sec。也就是说最小时间精度为秒。所以使用 mktime 得到的浮点数中。秒下面的数(毫秒。微秒)被抹去。

>>> time.mktime(
(2014, 7, 9, 8, 54, 29, 2, 190, -1) )    # 使用上面结构体中的数(dst使用-1表示未知)组成的9元素的元组,mktime 可以还原出相同的值

    1404867269.0

8. struct_time 结构

最后介绍一下 time.struct_time 类:

    time 的gmtime(), localtime(), 以及
strptime()方法获取的时间值类型是一个struct_time 类。它是一个命名的元组对象:元素能够通过index获取,或者是通过属性名称:

>>> time.localtime()

    time.struct_time(tm_year=2014, tm_mon=7, tm_mday=8, tm_hour=22, tm_min=9, tm_sec=1, tm_wday=1, tm_yday=189, tm_isdst=0)

    >>> time.localtime()[1]

    7

    >>> time.localtime().tm_mon

    7

眼下这个结构中有下面元素:

time.struct_time 结构
0 tm_year (for example, 1993)(下注)
1 tm_mon range [1, 12](下注)
2 tm_mday range [1, 31]
3 tm_hour range [0, 23]
4 tm_min range [0, 59]
5 tm_sec range [0, 61](下注)
6 tm_wday range [0, 6], Monday is 0
7 tm_yday range [1, 366]
8 tm_isdst 0, 1 or -1; see below

假设在函数中使用该元组时使用了错误的长度或者使用错误的类型。会引发TypeError 错误。

注:

上面表中,tm_sec 中的取值范围为 0~61。 这并非写错了!是考虑了闰秒和双闰秒的因素(很少见)。(关于闰秒,英文leap seconds,这是来自百度百科的解释: 闰秒是指为保持协调世界时接近于世界时时刻,由国际计量局统一规定在年底或年中对协调世界时添加或降低1秒>的调整。因为地球自转的不均匀性和长期变慢性。会使世界时(民用时)和原子时之间相差超过到±0.9秒时。就把世界时向前拨1秒(负闰秒,最后一分钟为59秒)或向后拨1秒(正闰秒,最后一分钟为61秒))

与C 结构不同。月相应的值范围是1~12,而不是0~11。

年的值须要注意下面问题:Python 依赖于平台的C 库。C 库通常是没有2000年的问题的,由于全部的日期和时间都内在的代表自时代以来的秒。函数接收上面一个struct_time 结构,当中须要4位来表示年。

为了向后兼容。假设模块变量accept2dyear 是一个非零整数,支持使用2位来表示年;而这个变量会被初始化为1,除非环境变量PYTHONY2K 被设置为一个非空的字符串。之后PYTHONY2K
被设置时变量 accept2dyear 才会被初始化为0。

因此,你能够将PYTHONY2K 设置为一个非空字符串从而使得python 对于不论什么年的输入都使用4位来表示。

否则。假设使用的是2位表示年,将会依据POSIX 或者X/Open 标准来转换:69~99 被映射为1969~1999,而0~68 被映射为2000~2068。(此问题在Python的 time模块介绍中标记为“Year 2000 (Y2K) issues” )

=======================================

注:本文仅仅介绍了 time 模块,其它的时间模块还有 datetime 和calendar 迫于篇幅限制(排版过于繁琐),以及电脑配置限制(AMD速龙+2G内存。即使跑的Linux太长的文章上下翻动感觉页非常卡)将于本系列以下两篇介绍。

很多其它关于 time 模块的相关内容请參考

">Python 官方文档

=======================================

注: 转载注明出处: http://blog.csdn.net/longerzone

python 学习笔记 13 -- 经常使用的时间模块之time的更多相关文章

  1. Python学习笔记(十四):模块高级

    以Mark Lutz著的<Python学习手册>为教程,每天花1个小时左右时间学习,争取两周完成. --- 写在前面的话 2013-7-23 21:30 学习笔记 1,包导入是把计算机上的 ...

  2. Python 学习笔记13:Python + wsgi + django 配置。坑爹的python3和wsgi不兼容的解决

    今人不见古时月,今月曾经照古人.生命是如此的美丽与短暂! 学习Python已经两个月了,Python的语法通过做简单的语法题和看Python语法介绍,有了初步的了解.但上班还是要做别的事情,所以感觉学 ...

  3. 吴裕雄--天生自然python学习笔记:Python3 日期和时间

    Python 程序能用很多方式处理日期和时间,转换日期格式是一个常见的功能. Python 提供了一个 time 和 calendar 模块可以用于格式化日期和时间. 时间间隔是以秒为单位的浮点小数. ...

  4. python学习笔记十五:日期时间处理笔记

    #-*- coding: utf-8 -*- import datetime #给定日期向后N天的日期 def dateadd_day(days): d1 = datetime.datetime.no ...

  5. Python学习笔记13—错误和异常

    常见的异常:

  6. python学习笔记13(模块、包)

    在Python中有一个概念叫做模块(module),比如在Python中要调用sqrt函数,必须用import关键字引入math这个模块,下面就来了解一下Python中的模块. 模块文件以.py后缀结 ...

  7. Python学习笔记13:标准库之子进程(subprocess包)

    ubprocess包主要功能是运行外部的命令和程序.从这个意义上来说,subprocess的功能与shell类似. subprocess以及经常使用的封装函数 当我们执行python的时候,我们都是在 ...

  8. python学习笔记(13):python并发编程以及系统常用模块

    一.进程与线程 1.进程:程序的一次执行(程序装载入内存,系统分配资源运行).n 每个进程有自己的内存空间.数据栈等,只能使用进程间通讯,而不能直接共享信息 2.线程:所有线程运行在同一个进程中,共享 ...

  9. Python 学习笔记13 类 - 创建和简单使用

    介绍: 面向对象编程是一种非常有效的软件编写方法之一,在面向对象编程中,我们会编写表示现实世界中的事物或者情景的类,并基于类来创建对象. 在编写类的的时候,这些类对象一般都有通用的行为或者属性.基于类 ...

随机推荐

  1. Jquery 自定义动画同步进行如何实现?

    需求描述:我需要对不懂的两个HTML对象进行操作,同时开始动画,同时结束动画. 遇到问题:如果先后对连个对象进行 animate动画,那么第一个会先运行,等第一个运行完了运行第二个,这样就不同步了. ...

  2. JQuery基本事件函数

    1,click单击事件 2,blur失去光标事件,focus获得光标事件 3,JQuery.on()函数:为html元素绑定事件,如下代码: $("div").on("c ...

  3. 【LeetCode】Broken Calculator(坏了的计算器)

    这道题是LeetCode里的第991道题. 题目描述: 在显示着数字的坏计算器上,我们可以执行以下两种操作: 双倍(Double):将显示屏上的数字乘 2: 递减(Decrement):将显示屏上的数 ...

  4. Leetcode 363.矩形区域不超过k的最大数值和

    矩形区域不超过k的最大数值和 给定一个非空二维矩阵 matrix 和一个整数 k,找到这个矩阵内部不大于 k 的最大矩形和. 示例: 输入: matrix = [[1,0,1],[0,-2,3]], ...

  5. 2017-2018 ACM-ICPC, NEERC, Southern Subregional Contest (Online Mirror, ACM-ICPC Rules, Teams Preferred)

    先把代码扔上来 E. Field of Wonders time limit per test 3 seconds memory limit per test 256 megabytes input ...

  6. Tinkoff Challenge - Elimination Round 开始补题

    A. Oleg and shares time limit per test 1 second memory limit per test 256 megabytes input standard i ...

  7. shell的格式化输出命令printf

    printf 命令用于格式化输出, 是echo命令的增强版.它是C语言printf()库函数的一个有限的变形,并且在语法上有些不同. 注意:printf 由 POSIX 标准所定义,移植性要比 ech ...

  8. 如何解决 错误code signing is required for product type 'xxxxx' in SDK 'iOS 8.2'

    如何解决 错误code signing is required for product type 'xxxxx' in SDK 'iOS 8.2' 大家在做真机调试的时候,或许会遇到这样的问题,那如何 ...

  9. Luogu【P3609】蹄子剪刀布(DP+滚动数组)

    题目链接 (突然高兴 又一次瞬间想出转移方程并一遍A掉!!233333(虽然从二叉苹果树那题开始我就发现我的方程好像跟别人不大一样 (所以这样就可以名正言顺的水题解了 设f[i][j][k]表示考虑F ...

  10. 【Luogu】P1122最大子树和(DFS,树上DP)

    题目链接 感觉自己DP好烂啊   道道看题解 钦定1为根,DFS搜索子树权值.如果子树权值大于0就将当前节点加上子树权值,反之就把子树扔掉.最后在所有节点的权值中寻找最优解. void dfs(int ...