python 时间模块汇总(time,datetime,Calendar)

󰃭 2016-07-28

一.time模块

一般有两种表示时间的方式: 1)时间戳 2)数组的形式(即struct_time),同一个时间戳的struct_time会因为时区不同而不同

struct time格式

year(four digits, e.g.2016) month(1-12) day(1-31) minutes (0-59) seconds (0-59) weekday (0-6, Monday is 0) Julian day (day in the year, 1-366) DST (Daylight Savings Time) flag (-1, 0 or 1) 是否是夏令时 If the DST flag is 0, the time is given in the regular time zone; if it is 1, the time is given in the DST time zone; if it is -1, mktime() should guess based on the date and time.

1.time.time:返回当前时间戳

In [3]: time.time()
Out[3]: 1469695612.230702

2.time.strftime: 将指定的struct_time(默认为当前时间),根据指定的格式化字符串输出

strftime(format[, tuple]) -> string

In [6]: time.strftime("%Y-%m-%d %H:%M:%S")
Out[6]: '2016-07-28 16:57:16'

tips:format格式

%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 当前时区的名称

%% %号本身

3.time.strptime: 将时间字符串根据指定的格式化符转换成数组形式的时间

strptime(string, format) -> struct_time

In [7]: time.strptime("2016-07-28 16:57:16", "%Y-%m-%d %H:%M:%S")
Out[7]: time.struct_time(tm_year=2016, tm_mon=7, tm_mday=28, tm_hour=16, tm_min=57, tm_sec=16, tm_wday=3, tm_yday=210, tm_isdst=-1)

4.time.mktime: 将一个以struct_time转换为时间

mktime(tuple) -> floating point number

5.time.localtime: 将一个时间戳转换成一个当前时区的struct_time,如果seconds参数未输入,则以当前时间为转换标准

localtime([seconds])

 In [9]: time.localtime()
Out[9]: time.struct_time(tm_year=2016, tm_mon=7, tm_mday=28, tm_hour=17, tm_min=15, tm_sec=4, tm_wday=3, tm_yday=210, tm_isdst=0)

6.time.gmtime: 将一个时间戳转换成一个UTC时区(0时区)的struct_time,如果seconds参数未输入,则以当前时间为转换标准

gmtime([seconds])

 In [10]: time.gmtime()
Out[10]: time.struct_time(tm_year=2016, tm_mon=7, tm_mday=28, tm_hour=9, tm_min=16, tm_sec=44, tm_wday=3, tm_yday=210, tm_isdst=0)

7.time.ctime: 将一个时间戳(默认为当前时间)转换成一个时间字符串

ctime(seconds) -> string

 In [11]: time.ctime()
Out[11]: 'Thu Jul 28 17:17:19 2016'

8.time.asctime: 将一个struct_time(默认为当时时间),转换成字符串

asctime([tuple]) -> string

9.time.sleep: 线程推迟指定的时间运行

sleep(seconds)

10.time.clock: 这个函数有两个功能:在第一次调用的时候,返回的是程序运行的实际时间;第二次之后的调用,返回的是自第一次调用后,到这次调用的时间间隔

 import time  
if __name__ == '__main__':  
    time.sleep(1)  
    print "clock1:%s" % time.clock()  
    time.sleep(1)  
    print "clock2:%s" % time.clock()  
    time.sleep(1)  
    print "clock3:%s" % time.clock()

输出: 8.79740371022e-07

1.00004046806

2.00010351612

其中第一个clock输出的是程序运行时间,第二、三个clock输出的都是与第一个clock的时间间 隔

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

In [19]: time.altzone
Out[19]: -28800

12.time.tzname: 属性time.tzname包含一对根据情况的不同而不同的字符串,分别是带夏令时的本地时区名称,和不带的

In [22]: time.tzname
Out[22]: ('CST', 'CST')

二.datetime模块

datetime主要用以下四个类:

1. datetime.date: 是指日期(年月日)
2. datetime.time: 是指时分秒微妙
3. datetime.datetime: 以上两者结合
4. datetime.timedelta: 时间间隔对象(一般用来做时间的加减,时间差 etc.)

datetime.date类

1.新建一个date对象

可以直接调用datetime.date.today(这个方法仅限获得今天的日期),也可以使用datetime.date传值

In [24]: today = datetime.date.today()

In [25]: today
Out[25]: datetime.date(2016, 7, 28)

In [26]: yesterday = datetime.date(2016, 7, 27)

In [27]: yesterday
Out[27]: datetime.date(2016, 7, 27)

2.datetime.date.strftime(format):格式化时间

struct_time -> string

In [28]: today.strftime('%Y-%m-%d %H:%M:%S')
Out[28]: '2016-07-28 00:00:00'

注:因为today变量中只取到了年月日,所以时分秒显示都为0

3.datetime.date.timetuple: 转成struct_time格式

In [30]: today.timetuple()
Out[30]: time.struct_time(tm_year=2016, tm_mon=7, tm_mday=28, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=210, tm_isdst=-1)

In [31]: today.timetuple()
Out[31]: time.struct_time(tm_year=2016, tm_mon=7, tm_mday=28, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=210, tm_isdst=-1)

In [32]: time.mktime(today.timetuple())
Out[32]: 1469635200.0

注:最后一步转化为时间戳

4.datetime.date.replace(year, month, day): 返回一个替换后的date对象

In [33]: today.replace(year=2013)
Out[33]: datetime.date(2013, 7, 28)

5. datetime.date.fromtimestamp(timestamp): 将时间戳转化为date对象

In [34]: datetime.date.fromtimestamp(1408058729)
Out[34]: datetime.date(2014, 8, 15)

datetime.time类

1.新建一个time对象

In [40]: t = datetime.time(1, 3, 5, 25)

In [41]: t
Out[41]: datetime.time(1, 3, 5, 25)

In [42]: t.hour
Out[42]: 1

In [43]: t.minute
Out[43]: 3

In [44]: t.second
Out[44]: 5

In [45]: t.microsecond
Out[45]: 25

2.datetime.time.strftime: 格式化输出

In [46]: t.strftime('%Y-%m-%d %H:%M:%S')
Out[46]: '1900-01-01 01:03:05'

注:因为没有指定年月日,所以为默认的19900101

3.datetime.time.replace([hour[, minute[, second[, microsecond[, tzinfo]]]]]): 返回一个替换后的time对象

In [47]: t.replace(hour=9)
Out[47]: datetime.time(9, 3, 5, 25)

datetime.datetime类

1.新建datetime对象

In [48]: d1 = datetime.datetime.today()

In [49]: d1
Out[49]: datetime.datetime(2016, 7, 28, 18, 45, 49, 329639)

In [53]: datetime.datetime(2015, 7, 28, 18, 0, 0, 000000)
Out[53]: datetime.datetime(2015, 7, 28, 18, 0)

2.datetime.datetime.now([tz])

当不指定时区时,和datetime.datetime.today()是一样的结果

In [54]: datetime.datetime.now()
Out[54]: datetime.datetime(2016, 7, 28, 18, 47, 42, 984335)

3.datetime.datetime.strftime(format): 格式化为需要的时间

In [55]: d1.strftime('%Y-%m-%d %H:%M:%S')
Out[55]: '2016-07-28 18:45:49'

4.datetime.datetime.timetuple: 转成struct_time格式

In [56]: d1.timetuple()
Out[56]: time.struct_time(tm_year=2016, tm_mon=7, tm_mday=28, tm_hour=18, tm_min=45, tm_sec=49, tm_wday=3, tm_yday=210, tm_isdst=-1)

5.datetime.datetime.replace(year, month, day): 返回一个替换后的date对象

In [57]: d1.replace(year=2000)
Out[57]: datetime.datetime(2000, 7, 28, 18, 45, 49, 329639)

6.datetime.datetime.fromtimestamp(timestamp): 将时间戳转化为datetime对象

In [60]: time.time()
Out[60]: 1469703038.127326

In [61]: datetime.datetime.fromtimestamp(1469703038)
Out[61]: datetime.datetime(2016, 7, 28, 18, 50, 38)

datetime.timedelta类

主要用来做时间的加减法

1.两个日期的时间差

In [62]: day1 = datetime.datetime.strptime('2016-03-29', '%Y-%m-%d')

In [63]: day2 = datetime.datetime.strptime('2016-03-25', '%Y-%m-%d')

In [64]: delta = day2 - day1

In [65]: delta
Out[65]: datetime.timedelta(-4)

In [66]: delta.days
Out[66]: -4

2.某一个时间的第N天

In [69]: s_t = datetime.datetime.strptime("2016-07-28", "%Y-%m-%d")

In [70]: s_t = s_t + datetime.timedelta(days=2)

In [71]: s_t
Out[71]: datetime.datetime(2016, 7, 30, 0, 0)

3.获取上个月最后一天日期

In [75]: now = datetime.datetime.now()

In [76]: now
Out[76]: datetime.datetime(2016, 7, 28, 18, 56, 57, 47024)

In [77]: (datetime.datetime(now.year, now.month, 1) - datetime.timedelta(days=1)).strftime("%Y-%m-%d")
Out[77]: '2016-06-30'

三.Calendar模块

此模块的函数都是日历相关的,例如打印某月的字符月历

星期一是默认的每周第一天,星期天是默认的最后一天。更改设置需调用calendar.setfirstweekday()函数

1.calendar.calendar(year,w=2,l=1,c=6): 返回一个多行字符串格式的year年年历

In [80]: calendar.calendar(2016,w=2,l=1,c=6)
Out[80]: '                                  2016\n\n      January                   February                   March\nMo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su\n             1  2  3       1  2  3  4  5  6  7          1  2  3  4  5  6\n 4  5  6  7  8  9 10       8  9 10 11 12 13 14       7  8  9 10 11 12 13\n11 12 13 14 15 16 17      15 16 17 18 19 20 21      14 15 16 17 18 19 20\n18 19 20 21 22 23 24      22 23 24 25 26 27 28      21 22 23 24 25 26 27\n25 26 27 28 29 30 31      29                        28 29 30 31\n\n       April                      May                       June\nMo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su\n             1  2  3                         1             1  2  3  4  5\n 4  5  6  7  8  9 10       2  3  4  5  6  7  8       6  7  8  9 10 11 12\n11 12 13 14 15 16 17       9 10 11 12 13 14 15      13 14 15 16 17 18 19\n18 19 20 21 22 23 24      16 17 18 19 20 21 22      20 21 22 23 24 25 26\n25 26 27 28 29 30         23 24 25 26 27 28 29      27 28 29 30\n                          30 31\n\n        July                     August                  September\nMo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su\n             1  2  3       1  2  3  4  5  6  7                1  2  3  4\n 4  5  6  7  8  9 10       8  9 10 11 12 13 14       5  6  7  8  9 10 11\n11 12 13 14 15 16 17      15 16 17 18 19 20 21      12 13 14 15 16 17 18\n18 19 20 21 22 23 24      22 23 24 25 26 27 28      19 20 21 22 23 24 25\n25 26 27 28 29 30 31      29 30 31                  26 27 28 29 30\n\n      October                   November                  December\nMo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su\n                1  2          1  2  3  4  5  6                1  2  3  4\n 3  4  5  6  7  8  9       7  8  9 10 11 12 13       5  6  7  8  9 10 11\n10 11 12 13 14 15 16      14 15 16 17 18 19 20      12 13 14 15 16 17 18\n17 18 19 20 21 22 23      21 22 23 24 25 26 27      19 20 21 22 23 24 25\n24 25 26 27 28 29 30      28 29 30                  26 27 28 29 30 31\n31\n'

3个月一行,间隔距离为c。 每日宽度间隔为w字符。每行长度为21* W+18+2* C。l是每星期行数。

2.calendar.firstweekday(): 返回当前每周起始日期的设置

In [81]: calendar.firstweekday( )
Out[81]: 0

默认情况下,首次载入caendar模块时返回0,即星期一。

3.calendar.isleap(year): 判断是否为闰年

In [82]: calendar.isleap(2016)
Out[82]: True

In [83]: calendar.isleap(2015)
Out[83]: False

4.calendar.leapdays(y1,y2): 返回在Y1,Y2两年之间的闰年总数

In [84]: calendar.leapdays(2000, 2016)
Out[84]: 4

In [85]: calendar.leapdays(2001, 2016)
Out[85]: 3

In [86]: calendar.leapdays(2000, 2015)
Out[86]: 4

注:测试发现,闰年数是包含y1,但不包含y2

5.calendar.month(year,month,w=2,l=1): 返回一个多行字符串格式的year年month月日历

两行标题,一周一行。每日宽度间隔为w字符。每行的长度为7* w+6。l是每星期的行数。

In [87]: calendar.month(2016,7,w=2,l=1)
Out[87]: '     July 2016\nMo Tu We Th Fr Sa Su\n             1  2  3\n 4  5  6  7  8  9 10\n11 12 13 14 15 16 17\n18 19 20 21 22 23 24\n25 26 27 28 29 30 31\n'

6.calendar.monthcalendar(year,month): 返回一个整数的单层嵌套列表示当月的日历

每个子列表装载代表一个星期的整数。Year年month月外的日期都设为0;范围内的日子都由该月第几日表示,从1开始。

In [88]: calendar.monthcalendar(2016, 7)
Out[88]: 
[[0, 0, 0, 0, 1, 2, 3],
 [4, 5, 6, 7, 8, 9, 10],
 [11, 12, 13, 14, 15, 16, 17],
 [18, 19, 20, 21, 22, 23, 24],
 [25, 26, 27, 28, 29, 30, 31]]

7. calendar.monthrange(year,month): 返回该月的第一天是星期几,以及最后一天是几号

In [89]: calendar.monthrange(2016, 7)
Out[89]: (4, 31)

In [90]: calendar.monthrange(2016, 6)
Out[90]: (2, 30)

In [91]: calendar.monthrange(2016, 2)
Out[91]: (0, 29)

8.calendar.prcal(year,w=2,l=1,c=6)

In [92]: calendar.prcal(2016,w=2,l=1,c=6)
                                  2016

      January                   February                   March
Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
             1  2  3       1  2  3  4  5  6  7          1  2  3  4  5  6
 4  5  6  7  8  9 10       8  9 10 11 12 13 14       7  8  9 10 11 12 13
11 12 13 14 15 16 17      15 16 17 18 19 20 21      14 15 16 17 18 19 20
18 19 20 21 22 23 24      22 23 24 25 26 27 28      21 22 23 24 25 26 27
25 26 27 28 29 30 31      29                        28 29 30 31

       April                      May                       June
Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
             1  2  3                         1             1  2  3  4  5
 4  5  6  7  8  9 10       2  3  4  5  6  7  8       6  7  8  9 10 11 12
11 12 13 14 15 16 17       9 10 11 12 13 14 15      13 14 15 16 17 18 19
18 19 20 21 22 23 24      16 17 18 19 20 21 22      20 21 22 23 24 25 26
25 26 27 28 29 30         23 24 25 26 27 28 29      27 28 29 30
                          30 31

        July                     August                  September
Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
             1  2  3       1  2  3  4  5  6  7                1  2  3  4
 4  5  6  7  8  9 10       8  9 10 11 12 13 14       5  6  7  8  9 10 11
11 12 13 14 15 16 17      15 16 17 18 19 20 21      12 13 14 15 16 17 18
18 19 20 21 22 23 24      22 23 24 25 26 27 28      19 20 21 22 23 24 25
25 26 27 28 29 30 31      29 30 31                  26 27 28 29 30

      October                   November                  December
Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
                1  2          1  2  3  4  5  6                1  2  3  4
 3  4  5  6  7  8  9       7  8  9 10 11 12 13       5  6  7  8  9 10 11
10 11 12 13 14 15 16      14 15 16 17 18 19 20      12 13 14 15 16 17 18
17 18 19 20 21 22 23      21 22 23 24 25 26 27      19 20 21 22 23 24 25
24 25 26 27 28 29 30      28 29 30                  26 27 28 29 30 31
31

9.calendar.prmonth(year,month,w=2,l=1)

In [93]: calendar.prmonth(2016,7,w=2,l=1)
     July 2016
Mo Tu We Th Fr Sa Su
             1  2  3
 4  5  6  7  8  9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

10.calendar.setfirstweekday(weekday): 设置每周的起始日期码。

0(星期一)到6(星期日)。

11.calendar.timegm(tupletime): 和time.gmtime相反:接受一个时间元组形式,返回该时刻的时间辍(1970纪元后经过的浮点秒数)。

12. calendar.weekday(year,month,day): 返回给定日期的日期码

0(星期一)到6(星期日)。月份为 1(一月) 到 12(12月)。

In [98]: calendar.weekday(2016, 7, 28)
Out[98]: 3