Python日期和時間


Python程式可以通過多種方式處理日期和時間。日期格式之間的轉換是計算機常見問題。Python的時間(time)和日曆(calendar)模組可用於跟蹤日期和時間。

一些常用程式碼範例

#!/usr/bin/python3
#coding=utf-8

import time  
import datetime  

starttime = datetime.datetime.now()  

time.sleep(5)  

endtime = datetime.datetime.now()  
print ((endtime - starttime).seconds )
  • 計算十天之後的日期時間
#!/usr/bin/python3
#coding=utf-8

import time  
import datetime  

d1 = datetime.datetime.now()  
d3 = d1 + datetime.timedelta(days =10)  

print (str(d3))
print (d3.ctime())
  • 獲取兩個日期時間的時間差
t = (datetime.datetime(2019,1,13,12,0,0) - datetime.datetime.now()).total_seconds()
print ("t = ", t)
## 輸出結果
t = 49367780.076406

Python中有提供與日期和時間相關的4個模組。它們分別是 -

模組 說明
time time是一個僅包含與日期和時間相關的函式和常數的模組,在本模組中定義了C/C++編寫的幾個類。 例如,struct_time類。
datetime datetime是一個使用物件導向程式設計設計的模組,可以在Python中使用日期和時間。它定義了幾個表示日期和時間的類。
calendar 日曆是一個提供函式的模組,以及與Calendar相關的幾個類,它們支援將日曆映像生成為text,html,….
locale 該模組包含用於格式化或基於區域設定分析日期和時間的函式。

1. 時間間隔

時間間隔是以秒為單位的浮點數。 從1970年1月1日上午12:00(epoch),這是一種時間的特殊時刻表示。

在Python中,當前時刻與上述特殊的某個時間點之間以秒為單位的時間。這個時間段叫做Ticks。

time模組中的time()函式返回從1970年1月1日上午12點開始的秒數。

# Import time module.
import time;

# Seconds
ticks = time.time()


print ("Number of ticks since 12:00am, January 1, 1970: ", ticks)

執行上面程式碼,得到以下結果 -

Number of ticks since 12:00am, January 1, 1970:  1497970093.6243818

但是,這個形式不能表示在時代(1970年1月1日上午12:00)之前的日期。在未來的日子也不能以這種方式表示 - 截止點是在2038年的UNIX和Windows的某個時刻。

2. 什麼是TimeTuple?

許多Python時間函式將時間處理為9個數位的元組,如下所示:

索引 欄位
0 4位數,表示年份 2018,2019…
1 月份 1 ~ 12
2 日期 1 ~ 31
3 小時 0 ~ 23
4 分鐘 0 ~ 59
5 0 ~ 61(6061是閏秒)
6 星期幾 0 ~ 6(0是星期一)
7 一年的第幾天 1 ~ 366(朱利安日)
8 夏令時 -1,0,1,-1表示庫確定DST

一個範例

import time
print (time.localtime());

這將產生如下結果:

time.struct_time(tm_year = 2016, tm_mon = 2, tm_mday = 15, tm_hour = 9, 
   tm_min = 29, tm_sec = 2, tm_wday = 0, tm_yday = 46, tm_isdst = 0)

上面的元組相當於struct_time結構。此結構具有以下屬性 -

索引 欄位
0 tm_year 2018,2019…
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(6061是閏秒)
6 tm_wday 0 ~ 6(0是星期一)
7 tm_yday 1 ~ 366(朱利安日)
8 tm_isdst -1,0,1,-1表示庫確定DST

能用圖片說明白的盡量用圖片說明 -

2.1.獲取當前時間

要將從時間浮點值開始的秒數瞬間轉換為時間序列,將浮點值傳遞給返回具有所有有效九個專案的時間元組的函式(例如本地時間)。

#!/usr/bin/python3
import time

localtime = time.localtime(time.time())
print ("Local current time :", localtime)

# 當前時間
curtime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
print (curtime)

執行上面程式碼,這將產生如下結果 -

Local current time : time.struct_time(tm_year=2017, tm_mon=6, tm_mday=20, tm_hour=23, tm_min=9, tm_sec=36, tm_wday=1, tm_yday=171, tm_isdst=0)
Curtime is =>  2017-06-20 23:09:36

2.2.獲取格式化時間

可以根據需要格式化任何時間,但也可使用可讀格式獲取時間的簡單方法是 - asctime() -

#!/usr/bin/python3
import time

localtime = time.asctime( time.localtime(time.time()) )
print ("Local current time :", localtime)

執行上面程式碼,這將產生如下結果 -

Local current time : Mon Feb 15 10:32:13 2018

2.3.獲取一個月的日曆

calendar模組提供了廣泛的方法來顯示年曆和月度日曆。 在這裡,將列印一個給定月份的日曆(2021年11月) -

#!/usr/bin/python3
import calendar

cal = calendar.month(2021, 11)
print ("Here is the calendar:")
print (cal)

執行上面程式碼後,將輸出以下結果 -

   November 2021
Mo Tu We Th Fr Sa Su
 1  2  3  4  5  6  7
 8  9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30

3.時間模組

Python中有一個受歡迎的時間(time)模組,它提供了處理時間和表示之間轉換的功能。以下是所有時間(time)可用方法的列表。

編號 方法 描述
1 time.altzone 本地DST時區的偏移量(以秒為單位的UTC),如果定義了有一個定義的話。 如果原生的DST時區是UTC的東部(如在西歐,包括英國),那麼它是負數值。
2 time.asctime([tupletime]) 接受時間元組,並返回一個可讀的24個字元的字串,例如’Tue Dec 11 22:07:14 2019’。
3 time.clock( ) 將當前CPU時間返回為浮點數秒。 為了測量不同方法的計算成本,time.clock的值比time.time()的值更有用。
4 time.ctime([secs]) 類似於asctime(localtime(secs)),而沒有引數就像asctime()
5 time.gmtime([secs]) 接受從時代(epoch)以秒為單位的瞬間,並返回與UTC時間相關的時間元組t。 註 - t.tm_isdst始終為0
6 time.localtime([secs]) 接受從時代(epoch)以秒為單位的瞬間,並返回與本地時間相關的時間t(t.tm_isdst01,具體取決於DST是否適用於本地規則的瞬時秒)。
7 time.mktime(tupletime) 接受在本地時間表示為時間元組的瞬間,並返回浮點值,該時間點以秒為單位表示。
8 time.sleep(secs) 暫停呼叫執行緒secs秒。
9 time.strftime(fmt[,tupletime]) 接受在本地時間表示為時間元組的瞬間,並返回一個表示由字串fmt指定的時間的字串。
10 time.strptime(str,fmt = ‘%a %b %d %H:%M:%S %Y’)「) 根據格式字串fmt解析str,並返回時間元組格式的時間。
11 time.time( ) 返回當前時間時刻,即從時代(epoch)開始的浮點數秒數。
12 time.tzset() 重置庫例程使用的時間轉換規則。環境變數TZ指定如何完成。

時間(time)模組有兩個重要的屬性可用。它們是 -

編號 屬性 描述
1 time.timezone 屬性time.timezone是UTC和本地時區(不含DST)之間的偏移量(美洲為 > 0,歐洲,亞洲,非洲大部分地區為 0)。
2 time.tzname 屬性time.tzname是一對與區域相關的字串,它們分別是沒有和具有DST的本地時區的名稱。

4.日曆模組

calendar模組提供與日曆相關的功能,包括為給定的月份或年份列印文字日曆的功能。

預設情況下,日曆將星期一作為一週的第一天,將星期日作為最後一天。 如果想要更改這個,可呼叫calendar.setfirstweekday()函式設定修改。

以下是calendar模組可用的功能函式列表 -

編號 函式 描述
1 calendar.calendar(year,w = 2,l = 1,c = 6) 返回一個具有年份日曆的多行字串格式化為三列,以c個空格分隔。 w是每個日期的字元寬度; 每行的長度為21 * w + 18 + 2 * cl是每週的行數。
2 calendar.firstweekday( ) 返回當前設定每週開始的星期。預設情況下,當日曆首次匯入時設定為:0,表示為星期一。
3 calendar.isleap(year) 如果給定年份(year)是閏年則返回True; 否則返回:False
4 calendar.leapdays(y1,y2) 返回在範圍(y1,y2)內的年份中的閏年總數。
5 calendar.month(year,month,w = 2,l = 1) 返回一個多行字串,其中包含年份月份的日曆,每週一行和兩個標題行。 w是每個日期的字元寬度; 每行的長度為7 * w + 6l是每週的行數。
6 calendar.monthcalendar(year,month) 返回int型別的列表。每個子列表表示一個星期。年份月份以外的天數設定為0; 該月內的日期設定為月份的第幾日:1 ~ 31。
7 calendar.monthrange(year,month) 返回兩個整數。第一個是年度月(month)的星期幾的程式碼; 第二個是當月的天數。表示星期幾為0(星期一)至6(星期日); 月份是112
8 calendar.prcal(year,w = 2,l = 1,c = 6) 類似於:calendar.calendar(year,w,l,c)的列印。
9 calendar.prmonth(year,month,w = 2,l = 1) 類似於:calendar.month(year,month,w,l)的列印。
10 calendar.setfirstweekday(weekday) 將每週的第一天設定為星期幾的程式碼。 星期幾的程式碼為0(星期一)至6(星期日)。
11 calendar.timegm(tupletime) time.gmtime的倒數:以時間元組的形式接受時刻,並返回與從時代(epoch)開始的浮點數相同的時刻。
12 calendar.weekday(year,month,day) 返回給定日期的星期幾的程式碼。星期幾的程式碼為0(星期一)至6(星期日); 月數是1(1月)到12(12月)。

5.其他模組和功能

如果您有興趣,那麼可以在Python中找到其他重要的模組和功能列表,其中包含日期和時間。以下列出其它有用的模組 -

  • datetime模組
  • pytz模組
  • dateutil模組