1. 程式人生 > 實用技巧 >time和datetime模組

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:001

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