time和datetime和tzinfo

time和datetime模塊還有tzinfo (時區)(一直不明白二者的區別,而後摘了兩片文章(最後面的兩個連接),很清晰...)

1、time模塊

經常使用函數

1. time()函數

time()函數返回的是時間戳(timestamp)。所謂時間戳指的是從1970年1月1日00:00:00開始按秒計算的偏移量。其餘返回時間戳方式的函數還有clock()。html

實例python

>>>import time
>>>time.time()
1515117751.8810253

2. ctime()函數

ctime()函數能夠將一個時間戳轉化爲字符串的形式,默認time.time()爲參數。(convert time in seconds to string)數據庫

實例markdown

>>>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時間實際就是格林尼治時間,它與中國時間的時差爲八個小時。函數

實例post

>>>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()用於獲取當前時區的當前時間。網站

實例spa

>>>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()。.net

實例線程

>>> 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格式化字符串

它們之間的轉化如圖所示
這裏寫圖片描述

 

2、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. 獲取指定日期和時間

1>>> from datetime import datetime
>>> dt=datetime(2018, 1, 1, 1, 1)
>>> print(dt)
2018-01-01 01:01:00

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

# 上述代碼中now就是一個offset-naive型,就是一個不含時區的datetime。下面代碼能夠把它轉換爲一個含時區的offset-aware型:

now=now.replace(tzinfo=pytz.timezone('UTC')) # datetime.datetime(2016, 11, 13, 16, 23, 37, 488000, tzinfo=<UTC>)
# 一樣的,將一個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 時區的相關信息

 

 

 

# 由於數據庫都是有時區'UTC'的datetime類型,
# 因此先轉換成無時區的類型now.replace(tzinfo=None))
# 而後datetime.timedelta().total_seconds()獲取時間差,而後獲取時間戳(數字 )
now = datetime.datetime.now()
minus_time = (now - token_obj.created.replace(tzinfo=None)).total_seconds()

 

 

本文參考以下:

  1. time模塊官方文檔
  2. datetime模塊官方文檔
  3. 廖雪峯的官方網站
  4. http://blog.csdn.net/you_are_my_dream/article/details/61616465
  5. http://blog.csdn.net/tigerking1017/article/details/51332220
  6. http://blog.csdn.net/cherdw/article/details/55224209
  7. http://www.javashuo.com/article/p-okuhkxxw-s.html
  8. https://blog.csdn.net/python3_2017/article/details/78983370
  9. https://blog.csdn.net/qq_25420115/article/details/53149669
相關文章
相關標籤/搜索