time和datetime模組
time和datetime和tzinfo
time和datetime模組還有tzinfo (時區)(一直不明白兩者的區別,然後摘了兩片文章(最後面的兩個連結),很清晰...)
一、time模組
常用函式
1. time()函式
time()
函式返回的是時間戳(timestamp)。所謂時間戳指的是從1970年1月1日00:00:00開始按秒計算的偏移量。其他返回時間戳方式的函式還有clock()。
例項
>>>import time
>>>time.time()
1515117751.8810253
2. ctime()函式
ctime()
函式可以將一個時間戳轉化為字串的形式,預設time.time()為引數。(convert time in seconds to string)
例項
>>>import time
>>>time.ctime()
'Fri Jan 5 10:21:29 2018'
>>>time.ctime(1500000000)
'Fri Jul 14 10:40:00 2017'
4.gmtime()函式
gmtime()
用於獲取UTC時間,UTC時間實際就是格林尼治時間,它與中國時間的時差為八個小時。
例項
>>>import time
>>>time.gmtime()
time.struct_time(tm_year=2018, tm_mon=1, tm_mday=5, tm_hour=3, tm_min=27, tm_sec=18, tm_wday=4, tm_yday=5, tm_isdst=0)
5. localtime()函式
localtime()
用於獲取當前時區的當前時間。
例項
>>>import time
>>>time.localtime()
time.struct_time(tm_year=2018, tm_mon=1, tm_mday=5,tm_hour=11, tm_min=28, tm_sec=48, tm_wday=4, tm_yday=5, tm_isdst=0)
6. strftime()函式
strftime()
把一個代表時間的元組或者struct_time(如time.localtime()和time.gmtime()返回)轉化為格式化的時間字串。如果t未指定,將傳入time.localtime()。
例項
>>> time.strftime("%Y-%m-%d %X")
'2018-01-05 11:20:21'
>>> time.strftime("%Y-%m-%d %H:%M:%S")
'2018-01-05 11:21:30'
>>> time.strftime("%Y-%m-%d %X", time.localtime())
'2018-01-05 11:23:04'
* format time格式化表示*
格式 | 含義 |
---|---|
%Y | 完整的年份 |
%m | 月份(01 - 12) |
%d | 一個月中的第幾天(01 - 31) |
%H | 一天中的第幾個小時(24小時制,00 - 23) |
%M | 分鐘數(00 - 59) |
%S | 秒(01 - 61) |
%X | 本地相應時間 |
%x | 本地相應日期 |
%a | 本地(locale)簡化星期名稱 |
%A | 本地完整星期名稱 |
%b | 本地簡化月份名稱 |
%B | 本地完整月份名稱 |
%c | 本地相應的日期和時間表示 |
%I | 第幾個小時(12小時制,01 - 12) |
%j | 一年中的第幾天(001 - 366) |
%p | 本地am或者pm的相應符 |
%U | 一年中的星期數。(00 - 53星期天是一個星期的開始。) |
%w | 一個星期中的第幾天(0 - 6,0是星期天) |
%W | 和%U基本相同,不同的是%W以星期一為一個星期的開始 |
%y | 去掉世紀的年份(00 - 99) |
%Z | 時區的名字(如果不存在為空字元) |
%% | ‘%’字元 |
注:表中加粗部分為最常用格式
7. strptime()函式
strptime()
把一個格式化時間字串轉化為struct_time。實際上它和strftime()是逆操作
例項
>>>import time
>>>time.strptime('2018-01-05 10:50:06','%Y-%m-%d %X')
time.struct_time(tm_year=2018,tm_mon=1,tm_mday=5,tm_hour=10,tm_min=50,tm_sec=6, tm_wday=4, tm_yday=5, tm_isdst=-1)
8. mktime()函式
mktime()
可以將struct_time轉換成用時間的浮點數表示
例項
>>> time.mktime(time.gmtime())
1515094387.0
>>> time.mktime(time.localtime())
1515123246.0
9. sleep()函式
執行緒推遲指定的時間執行,單位為秒。
import time
>>> time.sleep(3) #表示延遲3秒後程序繼續執行
小結:
time模組中時間表現的格式主要有3種:
1.timestamp時間戳
2.tuple或者struct_time時間元組,共有九個元素組
3.formattime格式化字串
它們之間的轉化如圖所示
二、datetime模組
datetime模組包含一個datetime
類,通過from datetime import datetime
匯入的就是datetime
這個類。
常見操作
1. 獲取當前日期
>>> from datetime import datetime
>>> now = datetime.now()
>>> now
datetime.datetime(2018, 1, 5, 16, 2, 47, 929705)
>>> print(now)
2018-01-05 16:02:47.929705
2. 獲取指定日期和時間
>>> from datetime import datetime
>>> dt=datetime(2018, 1, 1, 1, 1)
>>> print(dt)
2018-01-01 01:01:00
1
3. datetime型別轉換為timestamp
只需要簡單呼叫timestamp()方法
>>> from datetime import datetime
>>> dt=datetime(2018, 1, 1, 1, 1)
>>> dt.timestamp()
1514739660.0
4. timestamp轉換為datetime
使用datetime提供的fromtimestamp()方法
>>> from datetime import datetime
>>> t = 1514739660.0
>>> print(datetime.fromtimestamp(t))
2018-01-01 01:01:00
5. str轉換為datetime
當日期和時間為字串時,需要把str轉換為datetime,可通過datetime.strptime()實現。
>>> from datetime import datetime
>>> dt= datetime.strptime('2018-1-1 1:11:11', '%Y-%m-%d %H:%M:%S')
>>> print(dt)
2018-01-01 01:11:11
6. datetime轉換為str
如果已經有了datetime物件,要把它格式化為字串顯示給使用者,就需要轉換為str,轉換方法是通過strftime()實現的。
>>> from datetime import datetime
>>> now = datetime.now()
>>> now
datetime.datetime(2018, 1, 5, 16, 22, 50, 394736)
>>> now.strftime('%Y-%m-%d %H:%M:%S')
'2018-01-05 16:22:50'
7. datetime加減
對日期和時間進行加減需要匯入timedelta這個類
>>> from datetime import datetime, timedelta
>>> now = datetime.now()
>>> now
datetime.datetime(2018, 1, 5, 16, 22, 50, 394736)
>>> now + timedelta(hours=10)
datetime.datetime(2018, 1, 6, 2, 22, 50, 394736)
>>> now - timedelta(days=10)
datetime.datetime(2017, 12, 26, 16, 22, 50, 394736)
>>> now + timedelta(days=10, hours=12)
datetime.datetime(2018, 1, 16, 4, 22, 50, 394736)
>>> (now + timedelta(days=10, hours=12)).total_seconds()
把timedelta轉成時間戳
8.時區tzinfo
TypeError: can't compare offset-naive and offset-aware datetimes
# 這是因為兩個時間不屬於同一型別,offset-naive是不含時區的型別,而offset-aware是有時區型別,兩者自然不能比較。 # 我們可以通過判斷datetime物件的tzinfo屬性,來獲悉他是何種型別 import datetime import pytz now=datetime.datetime.now() # datetime.datetime(2016, 11, 13, 16, 23, 37, 488000) now.tzinfo==None #True
1 2 3 |
# 上述程式碼中now就是一個offset-naive型,就是一個不含時區的datetime。下面程式碼可以把它轉換為一個含時區的offset-aware型:
now = now.replace(tzinfo = pytz.timezone( 'UTC' )) # datetime.datetime(2016, 11, 13, 16, 23, 37, 488000, tzinfo=<UTC>)
|
1 2 |
# 同樣的,將一個offset-aware型轉換為offset-naive型:
now = now.replace(tzinfo = None )
|
小結
datetime模組定義了5個類:
序號 | 類 | 含義 |
---|---|---|
1 | datetime.datetime | 表示日期時間的類 |
2 | datetime.timedelta | 表示時間間隔,即兩個時間點的間隔 |
3 | datetime.date | 表示日期的類 |
4 | datetime.time | 表示時間的類 |
5 | datetime.tzinfo | 時區的相關資訊 |
1 |
# 因為資料庫都是有時區'UTC'的datetime型別,<br># 所以先轉換成無時區的型別now.replace(tzinfo=None))<br># 然後datetime.timedelta().total_seconds()獲取時間差,然後獲取時間戳(數字)
|
1 2 |
now = datetime.datetime.now()
minus_time = (now - token_obj.created.replace(tzinfo = None )).total_seconds()<br><br>
|
轉載部落格:https://www.cnblogs.com/amber-liu/p/10120503.html