首頁 > 軟體

Python學習之時間包使用教學詳解

2022-03-21 13:01:20

datetime 時間包

認識 datetime 時間包:

  • date:日期;time:時間;所以 datetime 就是 日期與時間的結合體
  • 使用 datetime 我們就可以獲取當前的時間與時間間隔
  • 可以將時間物件轉成時間字串
  • 也可以將字串轉成時間型別(把字串轉成時間物件也是有格式要求的)

datetime 時間包的常用功能

獲取當前的時間

# 匯入包與模組

# 第一種匯入方法:
from datetime import datetime	# 第一個 datetime 是包 ;第二個 datetime 是模組

# 第二種匯入方法:
import datetime 	# 直接匯入 datetime 包

# *************************************************************************

# 使用方法:

# 如果我們使用第一種匯入方法,那麼我們就可以直接通過 datetime 模組呼叫 now() 函數:
print(datetime.now())

# >>> 執行結果如下:
# >>> 2020-01-16 14:20:19.534920
# >>> 返回的是當前 年、月、日、時、分、秒、毫秒的 datetime 物件


# 如果我們使用第二種匯入方法,那麼我們就需要 datetime.datetime.now() 的方式來呼叫now() 函數:
print(datetime.datetime.now())

# >>> 執行結果如下:
# >>> 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))

# >>> 執行結果如下:
# >>> 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)

# >>> 執行結果如下:
# >>> 三天之後的時間是: 2020-01-16 15:04:00.492240	


before_three_days = now - three_days
print('三天之前的時間是:', after_three_days)

# >>> 執行結果如下:
# >>> 三天之前的時間是: 2020-01-16 15:04:00.492240


one_hour = timedelta(hours=1)
before_one_hour = now - one_hour
print('一小時之前的時間是:', before_one_hour)

# >>> 執行結果如下:
# >>> 一小時之前的時間是: 2020-01-16 14:04:00.492240

通過上面的小案例我們知道,時間物件之間我們可以做 加法與減法 的操作,但是時間物件有個問題。

它無法進行時間物件之間的傳輸,比如A服務想要給B服務傳輸一個時間物件,但是時間物件是無法傳輸的,必須先要轉成字串,然後才可以進行傳輸,接下來我們就學習一下如何將時間物件轉成字串。

時間物件轉字串

上文我們知道,想要獲取時間物件就要呼叫 datetime 模組的 now() 函數,並且執行獲取一個時間物件。

然後賦值給一個 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)

# >>> 執行結果如下:
# >>> 2020-01-16 15:44:26		# 符合時間格式的字串
# >>> 其實還有更多的時間格式符,在下面會有詳細介紹

接下來,我們用上面的 datetime 時間包的小案例 來實現我們的 時間物件轉字串 場景

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

# >>> 執行結果如下:
# >>> 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))

# >>> 執行結果如下:
# >>> 2020/01/16 16:19:35 <class 'str'>
# >>> 通過這裡我們發現,只要我們只要保證格式符是我們想要的屬性,格式的狀態我們可以自己去定義
# >>> 甚至這些 '/' 都可以不需要,看下面的執行結果


after_three_days_str = after_three_days.strftime('%Y%m%d')
print(after_three_days_str, type(after_three_days_str))
                                                 
# >>> 執行結果如下:
# >>> 20220313 <class 'str'>
# >>> 驗證了格式的狀態我們可以自己去定義的想法,甚至我們都沒有輸出 時、分、秒

時間字串轉時間型別

時間字串轉時間型別方法如下:

# 獲取時間模組
from datetime import datetime

# 時間字串轉時間型別
datetime.strptime(tt,format)

# 引數介紹:
# tt:符合時間格式的字串
# format:tt時間字串匹配規則

範例如下:

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

# >>> 執行結果如下:
# >>> 2020-01-01 08:08:08 <class 'datetime.datetime'>

同樣的使用 datetime 時間包的小案例 來實現我們的 時間字串轉時間型別 場景

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

# >>> 執行結果如下:
# >>> 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))

# >>> 執行結果如下:
# >>> ValueError: time data '2020/01/13 18:22:19' does not match format '%Y%m%d'
# >>> 這裡提示我們 格式符 與 字串 不匹配,所以當時間字串轉為時間型別時,格式狀態要保持一致


# 補上 時、分、秒 看看執行結果

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))
    
# >>> 執行結果如下:
# >>> 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))

# >>> 執行結果如下:
# >>> 2020-01-13 00:00:00 <class 'datetime.datetime'>
# >>> 這裡我們發現,時間型別轉為字串,再轉為時間型別,由於使用 '%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'))

# >>> 執行結果如下:
# >>> 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)

# >>> 執行結果如下:
# >>> 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_mon1~12
tm_mday1~31
tm_hour小時0~23
tm_min分鐘0~59
tm_sec0~61(閏年會多兩秒)
tm_wday一週的第幾天0~6(0是週一)
tm_yday一年的第幾日1~366(支援儒略曆,現用的是格里曆即公曆)
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))

# >>> 執行結果如下:
# >>> 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)

# >>> 執行結果如下:
# >>> 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)

# >>> 執行結果如下:
# >>> 1646982476.7887278
# >>> 1646982476788.7278

# >>> 上下比對一下,發現我們的 秒級別 時間戳已經變為了 毫秒級 的時間戳了

暫停函數 - sleep

sleep():名如其實,該函數會將我們的程式暫停執行一段時間。

# 匯入包;
import time

# 使用方法:
time.sleep(second)

# 引數介紹:
# second:希望程式被暫停執行的秒數

範例如下:

import time


for i in range(5):
    print(i)
    time.sleep(1)
    
# >>> 大家可以在自己電腦上試試執行效果

time 中的 strftime

# 匯入包;
import time

# 使用方法:
time.strftime(format, t)

# 引數介紹:
# format:時間的格式化規範
# t:time.localtime 對應的時間型別

# >>> 其實用法與前文介紹的 datetime 的 strftime 完全一致,只不過對應的物件是 time 的時間物件

範例如下:

import time


str_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
print(str_time)

# >>> 執行結果如下:
# >>> 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)

# >>> 執行結果如下:
# >>> 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 中生成時間戳,現在順著 時間戳部分一起帶出來。

# 匯入包;
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))

# >>> 執行結果如下:
# >>> 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))

# >>> 執行結果如下:
# >>> 2020-01-13 17:43:08.795082  <class 'datetime.datetime'>

可能大家會有個疑問,既然 datetime 包 與 time 模組的功能很多都是一樣的,那麼為什麼會有這兩個包和模組的存在呢?

其實,在實際工作中 datetime 包更多的是對於日期的處理;而 time 模組更多的則是對時間的處理,比如 時、分、秒 這樣的格式,使用 time 模組來處理會更合適一些。

到此這篇關於Python學習之時間包使用教學詳解的文章就介紹到這了,更多相關Python時間包內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com