Python的time和datetime模組詳細介紹

零下一度
發布: 2017-07-20 15:33:15
原創
2518 人瀏覽過

 time模組中時間表現的格式主要有三種:

  a、timestamp時間戳,時間戳表示的是從1970年1月1日00:00:00開始以秒數計算的偏移量

  b、struct_time時間元組,共有九個元素組。

  c、format time 格式化時間,已格式化的結構使時間更具可讀性。包括自訂格式和固定格式。

time

常用的有time.time()time.sleep()函數。

import timeprint(time.time())
登入後複製
1499305554.3239055
登入後複製

上面的浮點數稱為UNIX紀元時間戳,是從1970年1月1日0點起到今天經過的秒數。 可以看到後面有6位小數,使用round函數,可以實現浮點數的四捨五入。如下

# 默认四舍五入到整数位,即不保留小数print(round(time.time()))# 可指定参数保留的小数位数print(round(time.time(), 2))
登入後複製
1499305554
1499305554.49
登入後複製

time.sleep(sec)可以讓目前休眠,參數填入秒(s)。

print('good')
time.sleep(5.5)# 5.5秒后才打印这句print('yes')
登入後複製
good
yes
登入後複製

其他一些函數的使用

# 返回UTC时间print(time.gmtime())# 返回本地时间,在中国就是UTC+8print(time.localtime())
登入後複製
time.struct_time(tm_year=2017, tm_mon=7, tm_mday=6, tm_hour=1, tm_min=46, tm_sec=0, tm_wday=3, tm_yday=187, tm_isdst=0)
time.struct_time(tm_year=2017, tm_mon=7, tm_mday=6, tm_hour=9, tm_min=46, tm_sec=0, tm_wday=3, tm_yday=187, tm_isdst=0)
登入後複製

可以發現這是一個元組類型,中國所在時區位UTC+8,可以發現除了tm_hour不一樣(它們相差了剛好+8),其餘都一樣。

下面的函數可以傳回一個格式化的日期時間,看起來更直覺。

print(time.ctime())print(time.asctime())# 由于使用默认参数和上面的结果一样print(time.ctime(time.time()))print(time.asctime(time.localtime()))
登入後複製
Thu Jul  6 09:46:15 2017
Thu Jul  6 09:46:15 2017
Thu Jul  6 09:46:15 2017
Thu Jul  6 09:46:15 2017
登入後複製
  • ctime()可以傳入一個時間戳,當沒有指定參數時,預設使用當前時間戳作為參數。即time.time()

  • gtime()可以傳入一個struct_time,沒有指定參數時,預設使用當前時間。即time.localtime()

struct_time轉換為字串及字串轉為struct_time

  • strptime的第一個參數是字串形式的日期,第二個參數是自訂的日期轉換格式。這兩個參數的格式一定要對應。例如time.strptime('2017/7/6', '%Y-%m-%d')一個用了斜杠,一個用了短橫線,就會報錯。此函數傳回一個struct_time

  • strftime的第一個參數是想要轉換成的日期格式,第二個參數是一個struct_time,此函數將元組形式的struct_time轉換成第一個參數指定的格式樣子,傳回的是轉換後的日期字串形式。

%Y-%m-%d表示年月日,在datetime模組會詳細介紹。

a = time.strptime('2017/7/6', '%Y/%m/%d')
b = time.strftime('%Y-%m-%d', time.localtime())print(a)print(b)
登入後複製
time.struct_time(tm_year=2017, tm_mon=7, tm_mday=6, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=187, tm_isdst=-1)
2017-07-06
登入後複製

測量程式的運行時間

使用時間戳可以方便地計時一段程式地運行時間

start_time = time.time()sum = 0for i in range(10000000):sum += 1end_time = time.time()print(end_time - start_time)
登入後複製
2.185124397277832
登入後複製

可以看到執行循環計算加法一千萬次,那段程式花了2秒多。

也可以使用time.clock()函數

start = time.clock()print(start)  # 2.6773594453225194e-06time.sleep(2)
end = time.clock()print(end - start)  # 差值代表了睡眠2秒的时间。2.000246763295544time.sleep(3)print(time.clock())  # 5.00058991153112,返回的是从第一次调用到这次调用的时间间隔
登入後複製
4.4622657422041984e-07
2.0026006084745567
5.013243112269714
登入後複製

可以看到clock第一次呼叫時比較奇怪,它回傳的是進程運行的時間。之後再呼叫都是與第一次呼叫clock的值的差了。即從第一次呼叫開始算起,到目前呼叫clock所經歷的時間。
像上面一樣,在想測試的一部分程式碼的上方設定start,結束的地方設定end,相減也能得到片段程式碼運行時間,而且比time.time()還要準確。

datetime

datetime模組用來管理日期和時間,其中有三個子模組。分別是time、date、datetime,所以想要使用datetime可以使用下面的導入方式。

from datetime import datetime# 返回当前时间now = datetime.now()print(now.year, now.month, now.microsecond)# 可以自定义参数,返回格式化后的时间dt = datetime(2017, 10, 1, 23, 59, 59, 456123)print(dt)
登入後複製
2017 7 719609
2017-10-01 23:59:59.456123
登入後複製

datetime接受7個參數,分別對應年、月、日、時、分、秒、微秒。分別儲存在datetime的year、month、day、hour、minute、second、microsecond屬性中。

由時間戳記可以轉換成datetime類型。如下,使用當前時間的時間戳記。實際上等效於datetime.now()。當然反過來由datetime得到時間戳記也是可以的。

# 时间戳转datetimenow = datetime.fromtimestamp(time.time())print(now)
sometime = datetime(2017, 7, 5, 23, 59, 59)# datetime转时间戳print(sometime.timestamp())
登入後複製
2017-07-06 09:46:07.903769
1499270399.0
登入後複製

這些datetime物件可以使用><=符號來比較兩個日期的先後。也可進行減運算,表示兩個時刻的差異。例如

dt1 = datetime(2017, 5, 31)
dt2 = datetime(2017, 4, 1)print(dt1 - dt2)print(dt1 > dt2)
登入後複製
60 days, 0:00:00
True
登入後複製

timedelta表示一段時間

注意它不是表示一個時刻,而是一段時間。

import datetime

delta = datetime.timedelta(weeks=2, days=7, hours=1, seconds=59,microseconds=234353)
delta1 = datetime.timedelta(days=5, hours=2)print(delta.seconds)  # 返回属性hours和seconds的和print(delta.total_seconds()) # 只是以秒来表示这段时间print(delta > delta1)print(delta + delta1)
登入後複製
3659
1818059.234353
True
26 days, 3:00:59.234353
登入後複製

timedelta的接受的参数有weeks、days、hours、minutes、seconds、microseconds,但是其属性却只有days、seconds、microseconds。并且除了像datetime一样支持大小比较、减法运算外,还可以进行加法运算,表示两个时间段的差值

将datetime转化为字符串形式及字符串转为datetime对象

time模块也有这两个函数(见上面的例子),使用上比较累类似。

  • strptime按照指定格式将字符串形式的日期转换成datetime对象并返回。

  • strftime将一个datetime对象(比如now)根据指定的格式转换成字符串并返回。

from datetime import datetime

a = datetime.strptime(&#39;2017/7/6&#39;, &#39;%Y/%m/%d&#39;)
b = datetime.now().strftime(&#39;%Y-%m-%d&#39;)print(a)print(b)
登入後複製
2017-07-06 00:00:00
2017-07-06
登入後複製

关于日期时间的格式,看下表。

格式指令 含义
%Y 带世纪的四位年份,如2017
%y 后两位年份,如17表示2017
%m 月份,从01到12
%B 完整的月份,如November
%b 月份的简写,如Nov
%d 一个月中的第几天,如从01到31(如果有的话)
%j 一年中的第几天
%w 一周中的第几天
%A 完整的周几,如Monday
%a 简写的周几,如Mon
%H 24小时制的小时00-23
%h 12小时制的小时01-12
%M 分,00-59
%S 秒,00-59
%p AM或者PM

以上是Python的time和datetime模組詳細介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門推薦
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板