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()
本文參考以下:
- time模塊官方文檔
- datetime模塊官方文檔
- 廖雪峯的官方網站
- http://blog.csdn.net/you_are_my_dream/article/details/61616465
- http://blog.csdn.net/tigerking1017/article/details/51332220
- http://blog.csdn.net/cherdw/article/details/55224209
- http://www.javashuo.com/article/p-okuhkxxw-s.html
- https://blog.csdn.net/python3_2017/article/details/78983370
- https://blog.csdn.net/qq_25420115/article/details/53149669