🍖time 與 datetime 模組
阿新 • • 發佈:2020-12-18
引入
1.什麼是 time 與 datetime 模組
- 它們是 Python 中與時間處理有關的標準庫模組
ps : Python 時間處理模組還有 calendar 模組
2.UTC 和 DST
- UTC(Coordinated Universal Time,世界協調時)格林威治天文時間,世界標準時間, 在中國 :
UTC+8
- DST(Daylight Saving Time)夏令時
一. Python中時間的三種表達方式
1.時間戳 (timestamp)
- 通常來說,時間戳表示的是從1970年1月1日00:00:00開始按秒計算的偏移量
- 返回時間戳方式的函式主要有time( ),clock( )等, 執行
print(type(time.time()))
import time
print(time.time()) # 1608256754.2573004
print(type(time.time())) # <class 'float'>
2.格式化的時間字串 (Format String)
- 示例
import time
print(time.strftime("%Y-%m-%d %H:%M:%S %p")) # 2020-12-18 10:25:16 AM
-
python中時間日期格式化符號 :
符號 | 說明 |
---|---|
%y | 兩位數的年份表示(00-99) |
%Y | 四位數的年份表示(000-9999) |
%m | 月份(01-12) |
%d | 月內中的一天(0-31) |
%H | 24小時制小時數(0-23) |
%I | 12小時制小時數(01-12) |
%M | 分鐘數(00=59) |
%S | 秒(00-59) |
%a | 本地簡化星期名稱 |
%A | 本地完整星期名稱 |
%b | 本地簡化的月份名稱 |
%B | 本地完整的月份名稱 |
%c | 本地相應的日期表示和時間表示 |
%j | 年內的一天(001-366) |
%p | 本地A.M.或P.M.的等價符 |
%U | 一年中的星期數(00-53)星期天為星期的開始 |
%w | 星期(0-6),星期天為星期的開始 |
%W | 一年中的星期數(00-53)星期一為星期的開始 |
%x | 本地相應的日期表示 |
%X | 本地相應的時間表示 |
%Z | 當前時區的名稱 |
%% | %號本身 |
3.結構化的時間 (struct_time) 元組
- struct_time 元組共有九個元素
- 返回 struct_time 的函式主要有 : localtime( ), gmtime( ), strptime( )
import time
⛅localtime( )
print(time.localtime()) # 本地時區元組(struct_time)
'''輸出
time.struct_time(tm_year=2020, tm_mon=12, tm_mday=18, tm_hour=8, tm_min=45, tm_sec=9, tm_wday=4, tm_yday=353, tm_isdst=0)\
'''
print(type(time.localtime())) # <class 'time.struct_time'>
print(time.localtime()[3]) # 8
⛅gmtime( )
print(time.gmtime()) # UTC時區元組(struct_time)
'''輸出
time.struct_time(tm_year=2020, tm_mon=12, tm_mday=18, tm_hour=0, tm_min=45, tm_sec=9, tm_wday=4, tm_yday=353, tm_isdst=0)
'''
print(type(time.gmtime())) # <class 'time.struct_time'>
print(time.gmtime()[0]) # 2020
-
元組 (struct_time) 九個元素的含義 :
索引(Index) | 屬性(Attribute) | 值(Values) |
0 | tm_year(年) | 比如2011 |
1 | tm_mon(月) | 1 - 12 |
2 | tm_mday(日) | 1 - 31 |
3 | tm_hour(時) | 0 - 23 |
4 | tm_min(分) | 0 - 59 |
5 | tm_sec(秒) | 0 - 61 |
6 | tm_wday(weekday) | 0 - 6(0表示週日) |
7 | tm_yday(一年中的第幾天) | 1 - 366 |
8 | tm_isdst(是否是夏令時) | 預設為-1 |
二.時間格式轉換關係 (需要掌握)
1.轉換圖
- 計算機能認識的時間是能是 "時間戳" 格式
- 而人類能看懂的時間是 "格式化的時間字串" 和 "結構化的時間", 於是就有了轉換關係
2.格式轉換操作 (需要掌握的操作)
-
格式化的字串時間
與時間戳
之間的轉換都是以結構化的時間
作為中轉站來進行操作的 -
結構化時間
與時間戳
之間的轉化time.mktime([結構化時間])
: "struct_time" 轉換 "timestamp"time.localtime([時間戳])
: "timestamp" 轉換 "struct_time" 本地時區time.gmtime([時間戳])
: "timestamp" 轉換 "struct_time" UTC時區time.gmtime([time.time()])
import time
⛅"struct_time" 轉換 "timestamp"
print(time.mktime(time.localtime())) # 1608259357.0
print(time.mktime(time.gmtime())) # 1608259357.0
⛅"timestamp" 轉換 "struct_time"
print(time.localtime(456465.4685)) # 返回的是"struct_time"本地時區元組
print(time.localtime(time.time())) # 裡面不填時間戳預設就是當前時間戳"time.time()"
print(time.gmtime(456465.4685)) # 返回的是"struct_time"UTC時區元組
print(time.gmtime(time.time()))
結構化時間
與格式化字串時間
之間的轉換time.strftime([時間格式],[結構化時間])
: "struct_time" 轉換 "format time"time.strptime([格式化的字串時間],[時間格式])
: "format time" 轉換 "struct_time"
import time
⛅"struct_time" 轉換 "format time"
print(time.strftime("%Y/%m/%d %X %p")) # 2020/12/18 10:53:28 AM (%X 代表時分秒)
print(time.strftime("%Y-%m-%d %H:%M:%S %p")) # 2020-12-18 10:53:28 AM
res = time.strftime("%Y-%m-%d %H:%M:%S %p",time.localtime())
print(res) # 2020-12-18 10:58:22 AM (第二個引數填寫的是"結構化時間", 預設就是當前時間的結構化時間)
res2 = time.strftime("%Y-%m-%d %H:%M:%S %p",time.gmtime(16545.5163))
print(res2) # 1970-01-01 04:35:45 AM
⛅"format time" 轉換 "struct_time"
print(time.strptime('2020-12-18 10:58:22 AM','%Y-%m-%d %H:%M:%S %p'))
# 第一個引數是格式化字串時間,第二個引數是對應的格式,必須一一對應,不然報錯, 得到的是struct_time元組
'''
time.struct_time(tm_year=2020, tm_mon=12, tm_mday=18, tm_hour=10, tm_min=58, tm_sec=22, tm_wday=4, tm_yday=353, tm_isdst=-1)
'''
print(time.strptime('1970-01-01 04:35:45 AM','%Y-%m-%d %H:%M:%S %p'))
'''
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=4, tm_min=35, tm_sec=45, tm_wday=3, tm_yday=1, tm_isdst=-1)
'''
- 我們需要掌握的就是
格式化的字串時間
與時間戳之間
的轉換
⛅"format time" 與 "timestamp" 轉換
res = '2020-12-18 11:03:12 AM' # 當前時間字串
struct_time = time.strptime(res,'%Y-%m-%d %H:%M:%S %p') # 先轉成格式化字元, 格式必須一一對應
timestamp = time.mktime(struct_time) # 再轉成時間戳
print(timestamp) # 1608260592.0
⛅時間加減, 以當前時間戳為起始來計算
res2 = timestamp + 24*3600 # 一天之後時間戳
print(res2) # 1608346992.0
res3 = timestamp - 24*3600 # 一天之前時間戳
print(res3) # 1608174192.0
⛅將加減之後的"時間戳"轉換成"format time"
struct_time = time.localtime(res2) # 先轉換成格式化時間
format_time = time.strftime("%Y-%m-%d %X %p",struct_time) # 再轉換成格式化時間字串
print(format_time) # 2020-12-19 11:03:12 AM (一天之後的時間)
struct_time = time.localtime(res3)
format_time = time.strftime("%Y-%m-%d %X %p",struct_time)
print(format_time) # 2020-12-17 11:03:12 AM (一天之前的時間)
三.time 模組其他常用方法
1.time.sleep(n)
- 推遲指定的時間 (單位秒) 之後繼續執行, 我們通常戲稱睡多少秒之後
import time
def sleep(n):
time.sleep(n)
print(f"睡了{n}秒之後才打印的我")
sleep(3) # 睡了3秒之後才打印的我
ps : 做爬蟲以及破解賬號的時候, 程式需要模擬人類的行動來進行操作, 人類不可能有機器那麼快的速度, 所以一般放一些"sleep"來模擬人類的慢動作, 以免被檢測為機器而被掐斷連線
ps2 : 推薦一篇部落格 : 以故事話爬蟲
四.另一種時間格式轉換方法 (只需瞭解)
1.asctime( )
- 把一個表示時間的元組或者 struct_time 表示為: "Sun Jun 20 23:21:05 1993" 這種形式
- 如果沒有引數傳入, 則預設傳入
time.localtime()
import time
print(time.asctime()) # Fri Dec 18 18:22:04 2020
print(time.asctime(time.localtime())) # Fri Dec 18 18:22:04 2020
2.ctime( )
- 把一個時間戳(按秒計算的浮點數) 轉換為: "Sun Jun 20 23:21:05 1993" 這種形式
- 如果沒有傳入引數, 則預設傳入
time.time()
- 作用等同於 :
time.asctime(time.localtime(n))
, "n" 表示秒
import time
print(time.ctime()) # Fri Dec 18 18:26:37 2020
print(time.ctime(time.time())) # Fri Dec 18 18:26:37 2020
print(time.ctime(5456161.56456)) # Thu Mar 5 11:36:01 1970
ps : 在 Linux 系統上這種格式比較常見, 等同於: time.strftime('%b %a %d %X %Y')
五.datetime 模組
1.datetime的主要作用
- 時間加減運算
2.time 模組與 datetime 模組的不同點
- datetime 可以在原本的時間結構上參與時間的運算
- 而 time 只有在時間戳的基礎上才能進行運算, 運算之後在進行格式之間的轉換
3.常用功能介紹
datetime.now( )
: 統計當前時間
import datetime
print(datetime.datetime.now()) # 2020-12-18 20:56:58.262592 (本地時間)
print(datetime.datetime.utcnow()) # 2020-12-18 12:56:58.262592 (世界標準時間)
date.fromtimestamp( )
: 將時間戳直接轉成格式化字串的時間
import datetime
print(datetime.date.fromtimestamp(5465564.564)) # 1970-03-05
print(datetime.date.fromtimestamp(time.time())) # 2020-12-18
timedelta( )
: 統計時間間隔與時間加減運算 (沒有年份單位的計算)
import datetime
print(datetime.datetime.now() + datetime.timedelta(-2)) # 兩天前,不寫關鍵字預設"day"
print(datetime.datetime.now() + datetime.timedelta(days=-2)) # 兩天前
print(datetime.datetime.now() + datetime.timedelta(weeks=3)) # 三星期後
print(datetime.datetime.now() + datetime.timedelta(hours=-3)) # 三小時前
print(datetime.datetime.now() + datetime.timedelta(seconds=10)) # 十秒後
print(datetime.datetime.now() + datetime.timedelta(minutes=10)) # 十分鐘後
print(datetime.datetime.now() + datetime.timedelta(minutes=10, seconds=30)) # 十分鐘30秒後
replace( )
: 時間替換
import datetime
now_time = datetime.datetime.now()
print(now_time) # 2020-12-18 20:53:34.602813
print(now_time.replace(minute=00,hour=00,second=00)) # 2020-12-18 00:00:00.267086
print(now_time.replace(day=11,month=11,year=1111)) # 1111-11-11 20:53:34.602813