🍖time 與 datetime 模塊

引入

1.什麼是 time 與 datetime 模塊

  • 它們是 Python 中與時間處理有關的標準庫模塊

ps : Python 時間處理模塊還有 calendar 模塊html

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())), 返回的是float類型
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.格式轉換操做 (須要掌握的操做)

  • 格式化的字符串時間時間戳之間的轉換都是以結構化的時間做爲中轉站來進行操做的python

  • 結構化時間時間戳之間的轉化函數

    • 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"來模擬人類的慢動做, 以避免被檢測爲機器而被掐斷鏈接spa

ps2 : 推薦一篇博客 : 以故事話爬蟲code

四.另外一種時間格式轉換方法 (只需瞭解)

6cfd5b51f31c59e3bbfc2605521f09d

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')orm

五.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
相關文章
相關標籤/搜索