Python學習之時間包使用教程詳解
datetime 時間包
認識 datetime 時間包:
- date:日期;time:時間;所以 datetime 就是 日期與時間的結合體
- 使用 datetime 我們就可以獲取當前的時間與時間間隔
- 可以將時間對象轉成時間字符串
- 也可以將字符串轉成時間類型(把字符串轉成時間對象也是有格式要求的)
datetime 時間包的常用功能
獲取當前的時間
# 導入包與模塊 # 第一種導入方法: from datetime import datetime # 第一個 datetime 是包 ;第二個 datetime 是模塊 # 第二種導入方法: import datetime # 直接導入 datetime 包 # ************************************************************************* # 使用方法: # 如果我們使用第一種導入方法,那么我們就可以直接通過 datetime 模塊調用 now() 函數: print(datetime.now()) # >>> 執(zhí)行結果如下: # >>> 2020-01-16 14:20:19.534920 # >>> 返回的是當前 年、月、日、時、分、秒、毫秒的 datetime 對象 # 如果我們使用第二種導入方法,那么我們就需要 datetime.datetime.now() 的方式來調用now() 函數: print(datetime.datetime.now()) # >>> 執(zhí)行結果如下: # >>> 2020-01-16 14:22:11.534920 # >>> 返回的是當前 年、月、日、時、分、秒、毫秒的 datetime 對象
獲取時間間隔
其實獲取時間間隔本身沒有什么用,它需要配合我們剛剛提到的 datetime 模塊的 now() 函數來配合使用。
# 導入包 from datetime import datetime from datetime import timedelta # 這里需要注意:timedelta 并不是模塊,而是一個函數; # 至于為什么不是模塊,我們不進行深究;可以猜測一下, timedelta 可能是寫在 datetime 包下 __init__.py 文件內被提前導入的函數 # 使用方法: timeobj = timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0) # days:間隔的天數 # seconds:間隔的秒數 # microseconds:間隔的毫秒數 # milliseconds:間隔的微秒數 # minutes:間隔的分鐘數 # hours:間隔的小時數 # weeks:間隔的周數 # 這些參數我們可以全部傳,也可以只傳一個;像間隔一天、兩天這種情況,我們就可以使用 hours 或 days # 傳入類型為 整型 ,支持整數與負數,一般我們建議使用正數。
datetime 時間包的小案例
結合獲取當前時間與間隔,我們看一下下面這個小案例:
from datetime import datetime from datetime import timedelta now = datetime.now() print(now, type(now)) # >>> 執(zhí)行結果如下: # >>> 2020-01-16 15:04:00.492240 <class 'datetime.datetime'> three_days = timedelta(days=3) after_three_days = now + three_days print('三天之后的時間是:', after_three_days) # >>> 執(zhí)行結果如下: # >>> 三天之后的時間是: 2020-01-16 15:04:00.492240 before_three_days = now - three_days print('三天之前的時間是:', after_three_days) # >>> 執(zhí)行結果如下: # >>> 三天之前的時間是: 2020-01-16 15:04:00.492240 one_hour = timedelta(hours=1) before_one_hour = now - one_hour print('一小時之前的時間是:', before_one_hour) # >>> 執(zhí)行結果如下: # >>> 一小時之前的時間是: 2020-01-16 14:04:00.492240
通過上面的小案例我們知道,時間對象之間我們可以做 加法與減法 的操作,但是時間對象有個問題。
它無法進行時間對象之間的傳輸,比如A服務想要給B服務傳輸一個時間對象,但是時間對象是無法傳輸的,必須先要轉成字符串,然后才可以進行傳輸,接下來我們就學習一下如何將時間對象轉成字符串。
時間對象轉字符串
上文我們知道,想要獲取時間對象就要調用 datetime 模塊的 now() 函數,并且執(zhí)行獲取一個時間對象。
然后賦值給一個 now 變量,now 變量的值作為一個時間對象也會有自己的內置函數。
通過調用內置函數 strftime() 【strftime 是一個格式化字符串的標準】,通過這個字符化的標準就可以通過 format 將當前的日期時間對象按照 format 的標準轉為時間字符串。
用法如下:
# 獲取時間對象 from datetime import datetime now = datetime.datetime.now() # 時間對象轉為字符串 date_str = now.strftime(format)
示例如下:
from datetime import datetime date = datetime.now() str_date = date.strftime('%Y-%m-%d %H:%M:%S') # 括號內為時間類型的格式化標準的字符集合 print(str_date) # >>> 執(zhí)行結果如下: # >>> 2020-01-16 15:44:26 # 符合時間格式的字符串 # >>> 其實還有更多的時間格式符,在下面會有詳細介紹
接下來,我們用上面的 datetime 時間包的小案例 來實現(xiàn)我們的 時間對象轉字符串 場景
from datetime import datetime from datetime import timedelta now = datetime.now() # print(now, type(now)) now_str = now.strftime('%Y-%m-%d %H:%M:%S') print(now_str, type(now_str)) # >>> 執(zhí)行結果如下: # >>> 2020-01-16 16:14:15 <class 'str'> 時間對象已經按照strftime標準格式化成了字符串類型 three_days = timedelta(days=3) after_three_days = now + three_days # print('三天之后的時間是:', after_three_days) after_three_days_str = after_three_days.strftime('%Y/%m/%d %H:%M:%S') print(after_three_days_str, type(after_three_days_str)) # >>> 執(zhí)行結果如下: # >>> 2020/01/16 16:19:35 <class 'str'> # >>> 通過這里我們發(fā)現(xiàn),只要我們只要保證格式符是我們想要的屬性,格式的狀態(tài)我們可以自己去定義 # >>> 甚至這些 '/' 都可以不需要,看下面的運行結果 after_three_days_str = after_three_days.strftime('%Y%m%d') print(after_three_days_str, type(after_three_days_str)) # >>> 執(zhí)行結果如下: # >>> 20220313 <class 'str'> # >>> 驗證了格式的狀態(tài)我們可以自己去定義的想法,甚至我們都沒有輸出 時、分、秒
時間字符串轉時間類型
時間字符串轉時間類型方法如下:
# 獲取時間模塊 from datetime import datetime # 時間字符串轉時間類型 datetime.strptime(tt,format) # 參數介紹: # tt:符合時間格式的字符串 # format:tt時間字符串匹配規(guī)則
示例如下:
from datetime import datetime str_date = '2020-01-01 08:08:08' date_obj = datetime.strptime(str_date, '%Y-%m-%d %H:%M:%S') # 格式化標準要與時間字符串匹配 print(date_obj, type(date_obj)) # >>> 執(zhí)行結果如下: # >>> 2020-01-01 08:08:08 <class 'datetime.datetime'>
同樣的使用 datetime 時間包的小案例 來實現(xiàn)我們的 時間字符串轉時間類型 場景
from datetime import datetime from datetime import timedelta now = datetime.now() # print(now, type(now)) now_str = now.strftime('%Y-%m-%d %H:%M:%S') # print(now_str, type(now_str)) now_obj = datetime.strptime(now_str, '%Y-%m-%d %H:%M:%S') print(now_obj, type(now_obj)) # >>> 執(zhí)行結果如下: # >>> 2020-01-10 18:00:54 <class 'datetime.datetime'>
上面我們進行 時間對象轉字符串的時候,將時間對象的 '%Y-%m-%d %H:%M:%S' 格式進行了取舍,只輸出了 '%Y-%m-%d' ; 這我們嘗試 時間字符串轉為時間類型 同樣做一個取舍試一下,也只保留 '%Y-%m-%d
from datetime import datetime from datetime import timedelta now = datetime.now() three_days = timedelta(days=3) after_three_days = now + three_days # print('三天之后的時間是:', after_three_days) after_three_days_str = after_three_days.strftime('%Y/%m/%d %H:%M:%S') # print(after_three_days_str, type(after_three_days_str)) after_three_days_obj = datetime.strptime(after_three_days_str, '%Y/%m/%d') print(after_three_days_obj, type(after_three_days_obj)) # >>> 執(zhí)行結果如下: # >>> ValueError: time data '2020/01/13 18:22:19' does not match format '%Y%m%d' # >>> 這里提示我們 格式符 與 字符串 不匹配,所以當時間字符串轉為時間類型時,格式狀態(tài)要保持一致 # 補上 時、分、秒 看看運行結果 after_three_days_obj = datetime.strptime(after_three_days_str, '%Y/%m/%d %H:%M:%S') print(after_three_days_obj, type(after_three_days_obj)) # >>> 執(zhí)行結果如下: # >>> 2020-01-13 18:26:58 <class 'datetime.datetime'>
接下來我們再看看被我們 使用 '%Y/%m/%d' 截斷的 時間類型轉為字符串,再轉為時間類型會是怎樣的輸出結果。
from datetime import datetime from datetime import timedelta now = datetime.now() three_days = timedelta(days=3) before_three_days = now - three_days # print('三天之前的時間是:', after_three_days) before_three_days_str = before_three_days.strftime('%Y%m%d') # print(before_three_days_str, type(before_three_days_str)) before_three_days_obj = datetime.strptime(before_three_days_str, '%Y%m%d') print(before_three_days_obj, type(before_three_days_obj)) # >>> 執(zhí)行結果如下: # >>> 2020-01-13 00:00:00 <class 'datetime.datetime'> # >>> 這里我們發(fā)現(xiàn),時間類型轉為字符串,再轉為時間類型,由于使用 '%Y/%m/%d' 截斷轉為字符串的原因 # >>> 在再次轉為 時間類型 后,它的輸出結果的 時、分、秒 部分變成了 00:00:00
非時間格式字符串轉時間類型
我們直接定義一個 非時間格式的字符串,嘗試轉為 時間類型 看看會有怎樣的結果
from datetime import datetime from datetime import timedelta date_time = '2020 01 A' print(datetime.strptime(date_time, '%Y %m')) # >>> 執(zhí)行結果如下: # >>> ValueError: unconverted data remains: A # >>> 這里報錯信息為:不知道 A 對應的格式是什么,字符串格式中,我們也沒有對 A 使用格式化方法; # >>> 同時,date_time 也是一個非標準的時間格式字符串,我們沒有辦法對其進行時間格式的轉換
時間格式符
字符 | 介紹 |
---|---|
%Y | 完成的年份 如2020 |
%m | 月份, 1-12 |
%d | 月的某一天,1-31 |
%H | 一天中的第幾個小時,24小時(00-23) |
%I | 一天中的第幾個小時,12小時(01-12) |
%M | 當前的第幾分鐘(00-59) |
%S | 當前分的第幾秒(00-61) 多出來的兩秒是閏年的 |
%f | 當前秒的第幾毫秒 |
%a | 簡化的星期,如Wed |
%A | 完整的星期,如Wednesday |
%b | 簡化的月份,如二月 Feb |
%B | 完整的月份,如二月 February |
%c | 本地的日期和時間,如 Wed Feb 5 10:14:30 2020 |
%p | 上午或下午;AM 為上午 ,PM為下午 |
%j | 一年中的第幾天 |
%U | 一年中的星期數 |
time模塊
在上文我們學習 python 中第一個內置包 datetime (日期時間包),學習了如何使用 datetime 如何獲取當前的日期對象以及日期對象與日期字符串之間的互相轉換。
接下來我們學習一下 python 中的 第一個內置模塊,它也是用來處理時間的,那就是 time 模塊。學會使用 time 模塊,可以豐滿我們對時間的處理。
認識時間戳
什么是時間戳?其實時間戳就是時間,只不過他的起始時間有所不同。
- 時間戳是從 1970年1月1日00時00分00秒至今的總毫秒(秒)數 ;Python 默認是按秒來計算時間戳的。
- 在 python 中,用 timestamp 來表示時間戳
- 在 python 中,時間戳 是一個 float 類型。我們使用 datetime 獲取時間對象是可以看到 年月日、時分秒的;而時間戳展示給我們是從 1970年1月1日00時00分00秒至今的秒數(時間戳可以轉成我們可讀的 年月日、時分秒格式,我們稍后就會學習如何使用)。
- time 模塊的總體功能就是為了處理時間與轉換格式
time 模塊與它的函數們:
1.時間處理,轉換成時間格式
2.time 函數 ,生成時間戳數
3.localtime 函數,獲取本地時間函數
localtime 函數 需要了解對應的字段介紹
4.sleep 函數 ,暫停/休眠/等待
5.strftime 函數,將時間對象轉為字符串
6.strptime 函數,將時間字符串轉為時間對象
time 模塊的常用方法
# 導入包; import time # 使用方法: time.time() # 返回值: # 秒級別的浮點類型 # 示例: # 1580878485.4009378
注意:每個語言返回的時間戳格式都不太一樣,有的是返回秒級別,有的是返回毫秒級別。無論哪一種,時間都是一樣的,只是 秒 與 毫秒 之間的轉換而已。
獲取本地時間函數 - localtime
# 導入包; import time # 使用方法: time.localtime(timestamp) # 參數介紹: # timestamp:可以傳入一個時間戳,傳入后 localtime() 函數會將傳入的時間戳轉為 時間對象。 # 可以不傳入,如果不傳入時間戳;會默認返回當前最新的時間對象。
示例如下:
import time test_time = time.localtime() print(test_time) # >>> 執(zhí)行結果如下: # >>> time.struct_time(tm_year=2022, tm_mon=3, tm_mday=11, tm_hour=13, tm_min=33, tm_sec=52, tm_wday=4, tm_yday=70, tm_isdst=0) # >>> 輸出的是 localtime 字段信息
localtime 對應字段信息介紹
屬性名 | 介紹 | 取值范圍 |
---|---|---|
tm_year | 四位數的年單位 | 1970~∞ |
tm_mon | 月 | 1~12 |
tm_mday | 日 | 1~31 |
tm_hour | 小時 | 0~23 |
tm_min | 分鐘 | 0~59 |
tm_sec | 秒 | 0~61(閏年會多兩秒) |
tm_wday | 一周的第幾天 | 0~6(0是周一) |
tm_yday | 一年的第幾日 | 1~366(支持儒略歷,現(xiàn)用的是格里歷即公歷) |
tm_isdst | 夏令時 | -1 或 0 ;1 代表是否是夏時令 |
來看一下 localtime 函數 的小案例
import time test_time = time.time() test_time_obj = time.localtime(test_time) print(test_time_obj, type(test_time_obj)) # >>> 執(zhí)行結果如下: # >>> 1578898063.2553177 # >>> time.struct_time(tm_year=2020, tm_mon=1, tm_mday=13, tm_hour=14, tm_min=46, tm_sec=44, tm_wday=4, tm_yday=70, tm_isdst=0) <class 'time.struct_time'> # >>> 通過這樣的方式,就可以將我們的時間戳轉為 time.struct_time 的時間對象,可讀性會變得很好
上文我們提到過,localtime() 函數內可以不傳入參數,獲取的是當前最新的時間對象。我們也來看一下:
import time current_time = time.localtime() print(current_time) # >>> 執(zhí)行結果如下: # >>> time.struct_time(tm_year=2022, tm_mon=1, tm_mday=13, tm_hour=14, tm_min=57, tm_sec=47, tm_wday=4, tm_yday=70, tm_isdst=0)
剛剛提到過,我們的 python 獲取的是秒級別的時間戳,如果我們想要獲取 毫秒 級別的時間戳要怎么辦?其實很簽單,我們只需要需要將獲取的時間戳 *1000(乘以1000就可以了)就可以獲取 毫秒級 的時間戳了。
import time print(time.time()) print(time.time() * 1000) # >>> 執(zhí)行結果如下: # >>> 1646982476.7887278 # >>> 1646982476788.7278 # >>> 上下比對一下,發(fā)現(xiàn)我們的 秒級別 時間戳已經變?yōu)榱?毫秒級 的時間戳了
暫停函數 - sleep
sleep():名如其實,該函數會將我們的程序暫停執(zhí)行一段時間。
# 導入包; import time # 使用方法: time.sleep(second) # 參數介紹: # second:希望程序被暫停執(zhí)行的秒數
示例如下:
import time for i in range(5): print(i) time.sleep(1) # >>> 大家可以在自己電腦上試試運行效果
time 中的 strftime
# 導入包; import time # 使用方法: time.strftime(format, t) # 參數介紹: # format:時間的格式化規(guī)范 # t:time.localtime 對應的時間類型 # >>> 其實用法與前文介紹的 datetime 的 strftime 完全一致,只不過對應的對象是 time 的時間對象
示例如下:
import time str_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()) print(str_time) # >>> 執(zhí)行結果如下: # >>> 2020-01-13 16:22:21
time 中的 strptime
# 導入包; import time # 使用方法: time.strptime(time_str, format) # 參數介紹: # time_str:符合時間格式的字符串 # format:確保與 time_str 一致的格式化標準(字符串的內容都都可以通過 時間格式符 匹配上)
示例如下:
import time obj_time = time.strptime('2020-01-13', '%Y-%m-%d') print(obj_time) # >>> 執(zhí)行結果如下: # >>> time.struct_time(tm_year=2020, tm_mon=1, tm_mday=13, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=13, tm_isdst=-1)
datetime 中生成時間戳的函數
前文我們在講解 datetime 包的時候,并沒有講解如何使用 datetime 中生成時間戳,現(xiàn)在順著 時間戳部分一起帶出來。
# 導入包; import datetime # 使用方法: now = datetime.datetime.now() datetime.datetime.timestamp(now) # 不同于 time 模塊的 time 函數 的生成 時間戳 # 而是將一個 datetime 對象 轉為時間戳,所以括弧中不傳入參數是會報錯的。 # 參數介紹: # now:datetime 的時間對象
示例如下:
import datetime now = datetime.datetime.now() now_timestamp = datetime.datetime.timestamp(now) print(now_timestamp, type(now_timestamp)) # >>> 執(zhí)行結果如下: # >>> 1642067213.882046 <class 'float'> 秒級別的時間戳,浮點類型
datetime 時間戳轉時間對象
# 導入包; import datetime # 使用方法: datetime.datetime.fromtimestamp(timestamp) # 參數介紹: # timestamp:時間戳 # 返回值: # 返回一個 datetimes 的日期對象
示例如下:
import datetime now = datetime.datetime.now() now_timestamp = datetime.datetime.timestamp(now) datetime_obj = datetime.datetime.fromtimestamp(now_timestamp) print(datetime_obj, type(datetime_obj)) # >>> 執(zhí)行結果如下: # >>> 2020-01-13 17:43:08.795082 <class 'datetime.datetime'>
可能大家會有個疑問,既然 datetime 包 與 time 模塊的功能很多都是一樣的,那么為什么會有這兩個包和模塊的存在呢?
其實,在實際工作中 datetime 包更多的是對于日期的處理;而 time 模塊更多的則是對時間的處理,比如 時、分、秒 這樣的格式,使用 time 模塊來處理會更合適一些。
到此這篇關于Python學習之時間包使用教程詳解的文章就介紹到這了,更多相關Python時間包內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
python發(fā)送byte數據組到tcp的server問題
這篇文章主要介紹了python發(fā)送byte數據組到tcp的server問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09Python Flask框架實現(xiàn)簡單加法工具過程解析
這篇文章主要介紹了Python Flask框架實現(xiàn)簡單加法工具過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-06-06一文帶你了解Python中的type,isinstance和issubclass
這篇文章主要為大家詳細介紹了Python中的type、isinstance和issubclass的使用,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下2023-01-01