在此篇教程中,你將學習在 Python 中通過以下示例來各種操作日期和時間。
Python 有一個名為 datetime 的模塊來處理日期和時間。在深入研究之前,讓我們先創建一些與日期和時間相關的簡單程序。
import datetimedatetime_object = datetime.datetime.now()print(datetime_object)
輸出
2021-12-18 19:21:43.128008
在這個程序中,我們使用 import datetime 語句導入了 datetime 模塊。
datetime 模塊中定義的其中的一種類即 datetime 類。然後,我們使用 now() 方法創建一個包含當前本地日期和時間的 datetime 對象,並列印出如上的結果。
import datetimedate_object = datetime.date.today()print(date_object)
2021-12-18
在這個程序中,我們使用 date 類中定義的 today() 方法來獲取包含當前本地日期的 date 對象。
▋ datetime 內部是什麼?
我們可以使用 dir() 函數獲取包含模塊所有屬性的列表,如下:
import datetimeprint(dir(datetime))
運行程序時,輸出:
['MAXYEAR', 'MINYEAR', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_divide_and_round', 'date', 'datetime', 'datetime_CAPI', 'time', 'timedelta', 'timezone', 'tzinfo']
▶ datetime 模塊中常用的類有:
date 類
time 類
datetime 類
timedelta 類
可以從 date 類實例化 date 對象。date 對象表示日期(包含了年、月和日)。
import datetimed = datetime.date(2021, 12, 02)print(d)
2021-12-02
如果你想了解上面示例中的 date 類中的構造函數 date(),見以下代碼:首先從 datetime 模塊導入 date 類, date() 構造函數接受三個參數:年、月和日。變量 a 是一個 date 對象:
from datetime import datea = date(2021, 12, 02)print(a)
可以使用名為 today() 的類方法來創建包含當前日期的 date 對象,如下:
from datetime import datetoday = date.today()print("當前的日期 =", today)
我們還可以從時間戳 創建 date 對象。Unix 時間戳是特定日期與 UTC 1970年1月1日 之間間隔的秒數,可以使用 fromtimestamp() 方法將時間戳轉換為日期,如下:
from datetime import datetimestamp = date.fromtimestamp(123456789)print("日期 =", timestamp)
日期 = 1973-11-30
我們也可以很容易地從 date 對象中獲取年、月、日、星期幾等,如下:
from datetime import date# 今天日期的 date 對象today = date.today() print("當前年份:", today.year)print("當前月份:", today.month)print("當然日分:", today.day)
從 time 類實例化的 time 對象表示本地時間。
from datetime import time# time(hour = 0, minute = 0, second = 0)a = time()print("a =", a)# time(hour, minute and second)b = time(12, 34, 56)print("b =", b)# time(hour, minute and second)c = time(hour = 12, minute = 34, second = 56)print("c =", c)# time(hour, minute, second, microsecond)d = time(12, 34, 56, 1234567)print("d =", d)
a = 00:00:00b = 12:34:56c = 12:34:56d = 12:34:56.1234567
創建 time 對象後,可以列印其屬性,如 hour、minute 等,如下:
from datetime import timea = time(12, 34, 56)print("時 =", a.hour)print("分 =", a.minute)print("秒 =", a.second)print("微秒 =", a.microsecond)
時 = 12分 = 34秒 = 56微秒 = 0
注意:上面沒有傳遞 microsecond 參數。因此,將列印其默認值 0。
datetime 模塊有一個名為 dateclass 的類,該類可以包含來自 日期 和 時間 對象的信息。
from datetime import datetime#datetime(年, 月, 日)a = datetime(2021, 12, 12)print(a)# datetime(年, 月, 日, 時, 分, 秒, 微秒)b = datetime(2021, 12, 02, 23, 59, 59, 123456)print(b)
2021-12-12 00:00:002021-12-12 23:59:59.123456
注意:以上的datetime()構造函數中的前三個參數year、month和day是必需的。
from datetime import datetimea = datetime(2021, 12, 12, 23, 59, 59, 123456)print("年 =", a.year)print("月 =", a.month)print("時 =", a.hour)print("分 =", a.minute)print("時間戳 =", a.timestamp())
年 = 2021月 = 12日 = 12時 = 23分 = 59時間戳 = 1639324799.123456
timedelta 對象表示了兩個日期或時間之間的間隔差距。
from datetime import datetime, datet1 = date(year = 2018, month = 7, day = 13)t2 = date(year = 2021, month = 12, day = 12)t3 = t1 - t2print("t3 =", t3)t4 = datetime(year = 2021, month = 12, day = 12, hour = 7, minute = 13, second = 59)t5 = datetime(year = 2018, month = 7, day = 13, hour = 8, minute = 59, second = 18)t6 = t4 - t5print("t6 =", t6)print("t3 的類型:", type(t3)) print("t6 的類型:", type(t6))
t3 = -1248 days, 0:00:00t6 = 1247 days, 22:14:41t3 的類型: <class 'datetime.timedelta'>t6 的類型: <class 'datetime.timedelta'>
注意:t3 與 t6 都是 <class 'datetime.timedelta'> 類型。
from datetime import timedeltat1 = timedelta(weeks = 2, days = 8, hours = 8, seconds = 23)t2 = timedelta(days = 5, hours = 18, minutes = 4, seconds = 45)t3 = t1 - t2print("t3 =", t3)
t3 = 16 days, 13:55:38
在這裡,我們創建了兩個 timedelta 對象 t1 和 t2,它們的間隔差距如上列印在屏幕上。
from datetime import timedeltat1 = timedelta(seconds = 45)t2 = timedelta(seconds = 59)t3 = t1 - t2print("t3 =", t3)print("t3 =", abs(t3))
t3 = -1 day, 23:59:46t3 = 0:00:14
可以使用 total_seconds() 方法獲取 timedelta 對象中的總秒數。
from datetime import timedeltat = timedelta(days = 5, hours = 1, seconds = 33, microseconds = 233423)print("總秒數 =", t.total_seconds())
總秒數 = 435633.233423
你也可以使用 + 運算符查找兩個日期和時間的總和。此外,還可以將 timedelta 對象乘除整數和浮點數。
在不同的地方、組織等,日期和時間的表示方式可能有所不同。在美國,使用 mm/dd/yyyy 更為常見,而在英國,使用 dd/mm/yyyy 更為常見。
Python 有 strftime() 和 strptime() 兩個方法來處理這個格式上的問題,如下:
strftime() 方法在類 date、datetime 和 time 下定義。該方法從給定的 date、datetime 或 time 對象創建並格式化為字符串。
from datetime import datetime# 當前的日期與時間now = datetime.now()t = now.strftime("%H:%M:%S")print("時間:", t)s1 = now.strftime("%m/%d/%Y, %H:%M:%S")# mm/dd/YY H:M:S 格式print("s1:", s1)s2 = now.strftime("%d/%m/%Y, %H:%M:%S")# dd/mm/YY H:M:S 格式print("s2:", s2)
時間: 20:26:18s1: 12/18/2021, 20:26:18s2: 18/12/2021, 20:26:18
這裡,%Y,%m,%d,%H等是格式代碼。strftime() 方法接受一個或多個格式代碼,並基於它返回一個格式化字符串。
在上面的程序中,t、s1和s2 則是字符串。
%Y - 年 [0001,..., 2018, 2019,..., 9999]
%m - 月 [01, 02, ..., 11, 12]
%d - 日 [01, 02, ..., 30, 31]
%H - 時 [00, 01, ..., 22, 23
%M - 分 [00, 01, ..., 58, 59]
%S - 秒 [00, 01, ..., 58, 59]
想要了解有關 strftime() 和格式代碼的更多內容,請後續閱讀:Python strftime() 。
Tips1:見下一篇教程
strptime() 方法從給定字符串(表示日期和時間)創建 datetime 對象。
from datetime import datetimedate_string = "13 June, 2021"print("date_字符串 =", date_string)date_object = datetime.strptime(date_string, "%d %B, %Y")print("date_對象 =", date_object)
date_字符串 = 13 June, 2021date_對象 = 2021-06-13 00:00:00
strptime() 方法接受兩個參數:
表示日期和時間的字符串;
格式化與第一個參數等效的代碼;
此處注意:%d、%B 和 %Y 格式代碼分別用於 day、month和 year。
想要了解關於此方法的更多內容,也可閱讀後續教程: Python strptime() 。
Tips2:見下下一篇教程
假設你正在處理一個項目,需要根據其時區顯示日期和時間。在此建議使用第三方 pytZ 模塊,如下:
from datetime import datetimeimport pytzlocal = datetime.now()print("本地時間:", local.strftime("%m/%d/%Y, %H:%M:%S"))tz_NY = pytz.timezone('America/New_York') datetime_NY = datetime.now(tz_NY)print("美國|紐約時間:", datetime_NY.strftime("%m/%d/%Y, %H:%M:%S"))tz_London = pytz.timezone('Europe/London')datetime_London = datetime.now(tz_London)print("歐洲|倫敦時間:", datetime_London.strftime("%m/%d/%Y, %H:%M:%S"))
本地時間: 12/18/2021, 20:34:10美國|紐約時間: 12/18/2021 07:34:12歐洲|倫敦時間: 12/18/2021 12:34:14
在這個程序中,datetime_NY和datetime_London是datetime對象,包含各自時區的當前日期和時間。
--
大家好,這是程序算法實驗室訂閱號,歡迎各位關注!此處將持續分享關於Linux、DeepLearning、OpenCV、C++、SLAM、Python等技術乾貨。
👆 點擊識別並關注『程序算法實驗室』!