Python程序可以通過多種方式處理日期和時(shí)間。日期格式之間的轉(zhuǎn)換是計(jì)算機(jī)常見問題。Python的時(shí)間(time)和日歷(calendar)模塊可用于跟蹤日期和時(shí)間。
#!/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)
## 輸出結(jié)果
t = 49367780.076406
Python中有提供與日期和時(shí)間相關(guān)的4個(gè)模塊。它們分別是 -
| 模塊 | 說明 |
|---|---|
time |
time是一個(gè)僅包含與日期和時(shí)間相關(guān)的函數(shù)和常量的模塊,在本模塊中定義了C/C++編寫的幾個(gè)類。 例如,struct_time類。 |
datetime |
datetime是一個(gè)使用面向?qū)ο缶幊淘O(shè)計(jì)的模塊,可以在Python中使用日期和時(shí)間。它定義了幾個(gè)表示日期和時(shí)間的類。 |
calendar |
日歷是一個(gè)提供函數(shù)的模塊,以及與Calendar相關(guān)的幾個(gè)類,它們支持將日歷映像生成為text,html,…. |
locale |
該模塊包含用于格式化或基于區(qū)域設(shè)置分析日期和時(shí)間的函數(shù)。 |
時(shí)間間隔是以秒為單位的浮點(diǎn)數(shù)。 從1970年1月1日上午12:00(epoch),這是一種時(shí)間的特殊時(shí)刻表示。
在Python中,當(dāng)前時(shí)刻與上述特殊的某個(gè)時(shí)間點(diǎn)之間以秒為單位的時(shí)間。這個(gè)時(shí)間段叫做Ticks。

time模塊中的time()函數(shù)返回從1970年1月1日上午12點(diǎn)開始的秒數(shù)。
# Import time module.
import time;
# Seconds
ticks = time.time()
print ("Number of ticks since 12:00am, January 1, 1970: ", ticks)
執(zhí)行上面代碼,得到以下結(jié)果 -
Number of ticks since 12:00am, January 1, 1970: 1497970093.6243818
但是,這個(gè)形式不能表示在時(shí)代(1970年1月1日上午12:00)之前的日期。在未來的日子也不能以這種方式表示 - 截止點(diǎn)是在2038年的UNIX和Windows的某個(gè)時(shí)刻。
許多Python時(shí)間函數(shù)將時(shí)間處理為9個(gè)數(shù)字的元組,如下所示:
| 索引 | 字段 | 值 |
|---|---|---|
| 0 | 4位數(shù),表示年份 |
2018,2019… |
| 1 | 月份 | 1 ~ 12 |
| 2 | 日期 | 1 ~ 31 |
| 3 | 小時(shí) | 0 ~ 23 |
| 4 | 分鐘 | 0 ~ 59 |
| 5 | 秒 | 0 ~ 61(60或61是閏秒) |
| 6 | 星期幾 | 0 ~ 6(0是星期一) |
| 7 | 一年的第幾天 | 1 ~ 366(朱利安日) |
| 8 | 夏令時(shí) | -1,0,1,-1表示庫確定DST |
一個(gè)示例
import time
print (time.localtime());
這將產(chǎn)生如下結(jié)果:
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)
上面的元組相當(dāng)于struct_time結(jié)構(gòu)。此結(jié)構(gòu)具有以下屬性 -
| 索引 | 字段 | 值 |
|---|---|---|
| 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(60或61是閏秒) |
| 6 | tm_wday | 0 ~ 6(0是星期一) |
| 7 | tm_yday | 1 ~ 366(朱利安日) |
| 8 | tm_isdst | -1,0,1,-1表示庫確定DST |
能用圖片說明白的盡量用圖片說明 -

要將從時(shí)間浮點(diǎn)值開始的秒數(shù)瞬間轉(zhuǎn)換為時(shí)間序列,將浮點(diǎn)值傳遞給返回具有所有有效九個(gè)項(xiàng)目的時(shí)間元組的函數(shù)(例如本地時(shí)間)。
#!/usr/bin/python3
import time
localtime = time.localtime(time.time())
print ("Local current time :", localtime)
# 當(dāng)前時(shí)間
curtime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
print (curtime)
執(zhí)行上面代碼,這將產(chǎn)生如下結(jié)果 -
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
可以根據(jù)需要格式化任何時(shí)間,但也可使用可讀格式獲取時(shí)間的簡單方法是 - asctime() -
#!/usr/bin/python3
import time
localtime = time.asctime( time.localtime(time.time()) )
print ("Local current time :", localtime)
執(zhí)行上面代碼,這將產(chǎn)生如下結(jié)果 -
Local current time : Mon Feb 15 10:32:13 2018
calendar模塊提供了廣泛的方法來顯示年歷和月度日歷。 在這里,將打印一個(gè)給定月份的日歷(2021年11月) -
#!/usr/bin/python3
import calendar
cal = calendar.month(2021, 11)
print ("Here is the calendar:")
print (cal)
執(zhí)行上面代碼后,將輸出以下結(jié)果 -
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
Python中有一個(gè)受歡迎的時(shí)間(time)模塊,它提供了處理時(shí)間和表示之間轉(zhuǎn)換的功能。以下是所有時(shí)間(time)可用方法的列表。
| 編號(hào) | 方法 | 描述 |
|---|---|---|
| 1 | time.altzone | 本地DST時(shí)區(qū)的偏移量(以秒為單位的UTC),如果定義了有一個(gè)定義的話。 如果本地的DST時(shí)區(qū)是UTC的東部(如在西歐,包括英國),那么它是負(fù)數(shù)值。 |
| 2 | time.asctime([tupletime]) | 接受時(shí)間元組,并返回一個(gè)可讀的24個(gè)字符的字符串,例如’Tue Dec 11 22:07:14 2019’。 |
| 3 | time.clock( ) | 將當(dāng)前CPU時(shí)間返回為浮點(diǎn)數(shù)秒。 為了測量不同方法的計(jì)算成本,time.clock的值比time.time()的值更有用。 |
| 4 | time.ctime([secs]) | 類似于asctime(localtime(secs)),而沒有參數(shù)就像asctime() |
| 5 | time.gmtime([secs]) | 接受從時(shí)代(epoch)以秒為單位的瞬間,并返回與UTC時(shí)間相關(guān)的時(shí)間元組t。 注 - t.tm_isdst始終為0 |
| 6 | time.localtime([secs]) | 接受從時(shí)代(epoch)以秒為單位的瞬間,并返回與本地時(shí)間相關(guān)的時(shí)間t(t.tm_isdst為0或1,具體取決于DST是否適用于本地規(guī)則的瞬時(shí)秒)。 |
| 7 | time.mktime(tupletime) | 接受在本地時(shí)間表示為時(shí)間元組的瞬間,并返回浮點(diǎn)值,該時(shí)間點(diǎn)以秒為單位表示。 |
| 8 | time.sleep(secs) | 暫停調(diào)用線程secs秒。 |
| 9 | time.strftime(fmt[,tupletime]) | 接受在本地時(shí)間表示為時(shí)間元組的瞬間,并返回一個(gè)表示由字符串fmt指定的時(shí)間的字符串。 |
| 10 | time.strptime(str,fmt = ‘%a %b %d %H:%M:%S %Y’)“) | 根據(jù)格式字符串fmt解析str,并返回時(shí)間元組格式的時(shí)間。 |
| 11 | time.time( ) | 返回當(dāng)前時(shí)間時(shí)刻,即從時(shí)代(epoch)開始的浮點(diǎn)數(shù)秒數(shù)。 |
| 12 | time.tzset() | 重置庫例程使用的時(shí)間轉(zhuǎn)換規(guī)則。環(huán)境變量TZ指定如何完成。 |
時(shí)間(time)模塊有兩個(gè)重要的屬性可用。它們是 -
| 編號(hào) | 屬性 | 描述 |
|---|---|---|
| 1 | time.timezone |
屬性time.timezone是UTC和本地時(shí)區(qū)(不含DST)之間的偏移量(美洲為 > 0,歐洲,亞洲,非洲大部分地區(qū)為 0)。 |
| 2 | time.tzname |
屬性time.tzname是一對(duì)與區(qū)域相關(guān)的字符串,它們分別是沒有和具有DST的本地時(shí)區(qū)的名稱。 |
calendar模塊提供與日歷相關(guān)的功能,包括為給定的月份或年份打印文本日歷的功能。
默認(rèn)情況下,日歷將星期一作為一周的第一天,將星期日作為最后一天。 如果想要更改這個(gè),可調(diào)用calendar.setfirstweekday()函數(shù)設(shè)置修改。
以下是calendar模塊可用的功能函數(shù)列表 -
| 編號(hào) | 函數(shù) | 描述 |
|---|---|---|
| 1 | calendar.calendar(year,w = 2,l = 1,c = 6) |
返回一個(gè)具有年份日歷的多行字符串格式化為三列,以c個(gè)空格分隔。 w是每個(gè)日期的字符寬度; 每行的長度為21 * w + 18 + 2 * c,l是每周的行數(shù)。 |
| 2 | calendar.firstweekday( ) |
返回當(dāng)前設(shè)置每周開始的星期。默認(rèn)情況下,當(dāng)日歷首次導(dǎo)入時(shí)設(shè)置為:0,表示為星期一。 |
| 3 | calendar.isleap(year) |
如果給定年份(year)是閏年則返回True; 否則返回:False。 |
| 4 | calendar.leapdays(y1,y2) |
返回在范圍(y1,y2)內(nèi)的年份中的閏年總數(shù)。 |
| 5 | calendar.month(year,month,w = 2,l = 1) |
返回一個(gè)多行字符串,其中包含年份月份的日歷,每周一行和兩個(gè)標(biāo)題行。 w是每個(gè)日期的字符寬度; 每行的長度為7 * w + 6。 l是每周的行數(shù)。 |
| 6 | calendar.monthcalendar(year,month) |
返回int類型的列表。每個(gè)子列表表示一個(gè)星期。年份月份以外的天數(shù)設(shè)置為0; 該月內(nèi)的日期設(shè)定為月份的第幾日:1 ~ 31。 |
| 7 | calendar.monthrange(year,month) |
返回兩個(gè)整數(shù)。第一個(gè)是年度月(month)的星期幾的代碼; 第二個(gè)是當(dāng)月的天數(shù)。表示星期幾為0(星期一)至6(星期日); 月份是1到12。 |
| 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) |
將每周的第一天設(shè)置為星期幾的代碼。 星期幾的代碼為0(星期一)至6(星期日)。 |
| 11 | calendar.timegm(tupletime) |
time.gmtime的倒數(shù):以時(shí)間元組的形式接受時(shí)刻,并返回與從時(shí)代(epoch)開始的浮點(diǎn)數(shù)相同的時(shí)刻。 |
| 12 | calendar.weekday(year,month,day) |
返回給定日期的星期幾的代碼。星期幾的代碼為0(星期一)至6(星期日); 月數(shù)是1(1月)到12(12月)。 |
如果您有興趣,那么可以在Python中找到其他重要的模塊和功能列表,其中包含日期和時(shí)間。以下列出其它有用的模塊 -
datetime模塊pytz模塊dateutil模塊