Python中提供了time, datetime calendar等模块来处理时间日期,下面分别介绍几个模块。

time模块在 Python 文档里,time是归类在Generic Operating System Services中,换句话说, 它提供的功能是更加接近于操作系统层面的。通读文档可知,time 模块是围绕着 Unix Timestamp 进行的。

该模块主要包括一个类 struct_time,另外其他几个函数及相关常量。 需要注意的是在该模块中的大多数函数是调用了所在平台C library的同名函数, 所以要特别注意有些函数是平台相关的,可能会在不同的平台有不同的效果。另外一点是,由于是基于Unix Timestamp,所以其所能表述的日期范围被限定在 1970 - 2038 之间,如果你写的代码需要处理在前面所述范围之外的日期,那可能需要考虑使用datetime模块更好。

表示时间的两种方式:

1. 时间戳(相对于1970.1.1 00:00:00以秒计算的偏移量),时间戳是惟一的

2. 时间元组 即(struct_time),共有九个元素,分别表示,同一个时间戳的struct_time会因为时区不同而不同

 时间戳、时间元组、格式化时间三者之间转换关系:

转换函数说明:

• 利用strptime()函数将时间转换成时间数组
• 利用mktime()函数将时间数组转换成时间戳
• 利用gmtime()函数将时间戳转换成时间数组
• 利用strftime()函数将时间数组转换成时间

1、得到当前时间

# 得到当前时间戳
In [1]: timestamp=time.time()
Out[1]: 1514250892.201392
# strftime不加参数时,默认就是输出当前的时间
In [2]: time.strftime('%Y-%m-%d %H:%M:%S')
Out[2]: '2017-12-26 09:55:42'

2、时间戳与时间元组互相转换

# 将时间戳转换为时间元组(1) struct_time
In [3]: time.localtime(timestamp)
Out[3]: time.struct_time(tm_year=2017, tm_mon=12, tm_mday=26, tm_hour=9, tm_min=15, tm_sec=16, tm_wday=1, tm_yday=360, tm_isdst=0)
# 将时间戳转换为时间元组(1) struct_time
In [4]: time.localtime(timestamp)
Out[4]: time.struct_time(tm_year=2017, tm_mon=12, tm_mday=26, tm_hour=9, tm_min=15, tm_sec=16, tm_wday=1, tm_yday=360, tm_isdst=0)

3、时间格式化

# 时间戳的默认格式输出
In [5]: time.ctime(timestamp)
Out[5]: 'Tue Dec 26 09:15:16 2017'
# 时间元组的默认格式输出
In [6]: time.asctime(struct_time)
Out[6]: 'Sun Oct 26 22:07:13 2014'
# 格式化输出想要的时间 第二个参数是时间元组
In [7]:time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))
Out[7]: '2017:12:26 09:27:31
In [8]: time.strftime("%a, %d %b %Y %H:%M:%S +0000", struct_time)
Out[8]: 'Tue, 26 Dec 2017 01:41:41 +0000'

4、将格式化时间转换成时间元组,string=>struct_time

# 将指定格式的时间转换成时间元组
In [9]: time.strptime("26 Nov 17", "%d %b %y")
Out[9]: time.struct_time(tm_year=2017, tm_mon=11, tm_mday=26, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=6, tm_yday=330, tm_isdst=-1
In [10]: time.strptime('2017-12-26 09:27:31',"%Y-%m-%d %H:%M:%S")  
Out[10]: time.struct_time(tm_year=2017, tm_mon=12, tm_mday=26, tm_hour=9, tm_min=27, tm_sec=31, tm_wday=1, tm_yday=360, tm_isdst=-1)

5、将格式化时间转换成时间戳,string=>timestamp

In [11]: time.mktime(time.strptime('2017-12-26 09:27:31',"%Y-%m-%d %H:%M:%S"))
Out[11]: 1514251651.0

6、将时间戳转换成格式化时间,timestamp=>string

In [12]: timestamp=1505532534
In [12]: time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(timestamp))
Out[12]: '2017-09-16 11:28:54'

7、重新格式化时间

In [13]: dtime="2017-09-16 11:28:54"
In [13]: timeArray = time.strptime(dtime, "%Y-%m-%d %H:%M:%S")
In [13]: time.strftime("%Y%m%d-%H:%M:%S",timeArray)
Out[13]: '20170916-11:28:54'

datetime模块

datetime 比 time 高级了不少,可以理解为 datetime 基于 time 进行了封装,提供了更多实用的函数。在datetime 模块中包含了几个类,具体关系如下:

·        timedelta  # 主要用于计算时间跨度
·        tzinfo        # 时区相关
·        time         # 只关注时间
·        date         # 只关注日期
·        datetime  # 同时有时间和日期

在实际使用中,用得比较多的是 datetime.datetime 和 datetime.timedelta ,另外两个 datetime.date 和 datetime.time 实际使用和 datetime.datetime 并无太大差别。 

1、得到当前时间

In [1]: import datetime
In [1]: now = datetime.datetime.now()
In [1]: datetime.datetime(2017, 12, 26, 10, 38, 50, 99268)
In [1]: print now
Out[1]: 2017-12-26 10:38:50.099268

2、得到当前格式化时间

#方法一:
In [2]: now = datetime.datetime.now()
In [2]: now.strftime('%Y-%m-%d %H:%M:%S')  
Out[2]: '2017-12-26 10:32:16'
#方法二:
In [3]: now = datetime.datetime.today()
In [3]: now.strftime('%Y-%m-%d %H:%M:%S')  
Out[3]: '2017-12-26 10:32:16'
#方法三:
In [4]: t = time.time()
In [4]: datetime.datetime.fromtimestamp(t).strftime('%Y-%m-%d %H:%M:%S')
Out[4]: '2017-12-26 10:42:10'

3、时间元组 struct_time转化为时间戳

In [5]: datetime.datetime.now()
Out[5]: datetime.datetime(2017, 12, 26, 10, 56, 7, 463681)
In [6]: datetime.datetime.now().timetuple()
Out[6]: time.struct_time(tm_year=2017, tm_mon=12, tm_mday=26, tm_hour=10, tm_min=58, tm_sec=23, tm_wday=1, tm_yday=360, tm_isdst=-1)
In [7]: time.mktime(datetime.datetime.now().timetuple())
Out[7]: 1514257156.0

4、获取时间差,计算程序的执行时间

# 使用time模块:
In [8]: def t():
   ....:     start = time.time()
   ....:     time.sleep(10)
   ....:     end = time.time()
   ....:     print end - start
   ....:
##
In [8]: t()
Out[8]:10.0014948845
# 使用datetime模块,计算相差秒数
In [9]: starttime = datetime.datetime.now()
In [9]: endtime = datetime.datetime.now()
In [9]: print (endtime - starttime).seconds
Out[9]:6
# 两个日期相差多少天
In [10]: import datetime
In [10]: d1 = datetime.datetime.strptime('2015-03-0517:41:20', '%Y-%m-%d %H:%M:%S')
In [10]: d2 = datetime.datetime.strptime('2015-03-0217:41:20', '%Y-%m-%d %H:%M:%S')
In [10]: delta = d1 - d2
In [10]: print delta.days  
Out[10]: 3

5、计算昨天的日期(计算其他日期相加、相减等)

In [11]: d1 = datetime.datetime.now()
In [11]: d2 = d1 - datetime.timedelta(days=1)
In [11]: d1
Out[11]: datetime.datetime(2017, 12, 26, 10, 56, 7, 463681)
In [12]: d2
Out[12]: datetime.datetime(2017, 12, 25, 10, 56, 7, 463681)

6、今天的n天后的日期

In [13]: import datetime
In [13]: now = datetime.datetime.now()
In [13]: delta = datetime.timedelta(days=3)
In [13]: n_days = now + delta
In [13]: print n_days.strftime('%Y-%m-%d %H:%M:%S')  
Out[14]: 2017-12-30 19:16:34