Python時間與日期操作(datetime、time、calendar)
名詞解釋
UTC(CoordinatedUniversal Time,世界協調時)亦即格林威治天文時間,世界標準時間。在中國為UTC+8。
DST(DaylightSaving Time)即夏令時。是一種為節約能源而人為規定地方時間的制度,一般在天亮早的夏季人為將時間提前一小時。
相關模組
模組 |
說明 |
time |
time是一個僅包含與日期和時間相關的函式和常量的模組,在本模組中定義了C/C++編寫的幾個類。例如,struct_time類。 |
datetime |
datetime是一個使用面向物件程式設計設計的模組,可以在Python中使用日期和時間。它定義了幾個表示日期和時間的類。 |
calendar |
日曆是一個提供函式的模組,以及與Calendar相關的幾個類,它們支援將日曆映像生成為text,html,…. |
locale |
該模組包含用於格式化或基於區域設定分析日期和時間的函式。 |
時間元組
許多Python時間函式將時間處理為9個數字的元組,如下所示:
索引 |
欄位 |
值 |
0 |
4位數,表示年份 |
2018,2019… |
1 |
月份 |
1 ~ 12 |
2 |
日期 |
1 ~ 31 |
3 |
小時 |
0 ~ 23 |
4 |
分鐘 |
0 ~ 59 |
5 |
秒 |
0 ~ 61(60或61是閏秒) |
6 |
星期幾 |
0 ~ 6( |
7 |
一年的第幾天 |
1 ~ 366(朱利安日) |
8 |
夏令時 |
-1,0,1,-1是決定是否為夏令時的旗幟 |
程式碼表示:
year (four digits, e.g. 1998) month (1-12) day (1-31) hours (0-23) minutes (0-59) seconds (0-59) weekday (0-6, Monday is 0) Julian day (day in the year, 1-366) #夏令時格式,0:正常格式,1:夏令時格式,-1:根據當前的日期時間格式來判定 DST (Daylight Savings Time) flag (-1, 0 or 1)
上面的元組相當於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(60或61是閏秒) |
6 |
tm_wday |
0 ~ 6(0是星期一) |
7 |
tm_yday |
1 ~ 366(朱利安日) |
8 |
tm_isdst |
-1,0,1,-1是決定是否為夏令時的旗幟 |
可用如下圖示表示:
time模組
time
模組,它提供了處理時間和表示之間轉換的功能。help(time)之後可以知道time有2種時間表示形式:
1、時間戳表示法,即以整型或浮點型表示的是一個以秒為單位的時間間隔。這個時間的基礎值是從1970年的1月1號零點開始算起。
2、元組格式表示法,這個元組有9個整型內容。分別表示不同的時間含義。
time模組的常用函式
編號 |
方法 |
描述 |
1 |
time.time() |
返回當前時間時刻,浮點數形式秒數,不支援引數。 |
2 |
time.clock() |
返回當前程式的cpu執行時間。為了測量不同方法的計算成本,time.clock的值比time.time()的值更有用。unix系統始終返回全部執行時間;而windows從第二次開始都是以第一次呼叫此函式時的時間戳作為基準。 |
3 |
time.sleep(secs) |
暫停呼叫執行緒secs秒,接受整型和浮點型引數。 |
4 |
time.gmtime ([secs]) |
將時間戳轉換為UTC時間元組格式。接受一個浮點型時間戳引數,其預設值為當前時間戳。 |
5 |
time.localtime ([secs]) |
將時間戳轉換為本地時間元組格式。接受一個浮點型時間戳引數,其預設值為當前時間戳。 |
6 |
time.asctime ([tupletime]) |
接受時間元組,並返回一個可讀的24個字元的字串,例如’Tue Dec 11 22:07:14 2019’,預設值為localtime()返回值。 |
7 |
time.ctime ([secs]) |
接受時間戳,轉換為字串。其預設值為當前時間戳。函式等價於asctime(localtime(seconds))。 |
8 |
time.mktime (tupletime) |
將本地時間元組,轉換為時間戳(浮點值,該時間點以秒為單位表示。)。接受一個時間元組,必選。 |
9 |
time.strftime (fmt[,tupletime]) |
將時間元組以指定的格式(字串fmt指定)轉換為字串形式。接受字串格式化串、時間元組。時間元組為可選,預設為localtime() |
10 |
time.strptime (str,fmt=“”) |
根據格式字串fmt解析str,並返回元組格式的時間。 strftime()的逆向過程。接受字串,時間格式2個引數,都是必選。 |
11 |
time.altzone |
本地DST時區的偏移量(以秒為單位的UTC)。 |
12 |
time.tzset() |
改變本地時區 |
時間字串支援的格式符號:
格式 含義 備註
%a 本地(locale)簡化星期名稱
%A 本地完整星期名稱
%b 本地簡化月份名稱
%B 本地完整月份名稱
%c 本地相應的日期和時間表示
%d 一個月中的第幾天(01 - 31)
%H 一天中的第幾個小時(24小時制,00 - 23)
%I 第幾個小時(12小時制,01 - 12)
%j 一年中的第幾天(001 - 366)
%m 月份(01 - 12)
%M 分鐘數(00 - 59)
%p 本地am或者pm的相應符
%S 秒(01 - 61)
%U 一年中的星期數。(00 - 53星期天是一個星期的開始。)第一個星期天之前的所有天數都放在第0周。
%w 一個星期中的第幾天(0 - 6,0是星期天)
%W 和%U基本相同,不同的是%W以星期一為一個星期的開始。
%x 本地相應日期
%X 本地相應時間
%y 去掉世紀的年份(00 – 99)
%Y 完整的年份
%Z 時區的名字(如果不存在為空字元)
%% ‘%’字元
注意:
1、“%p”只有與“%I”配合使用才有效果。
2、文件中強調確實是0-61,而不是59,閏年秒佔兩秒
3、當使用strptime()函式時,只有當在這年中的週數和天數被確定的時候%和%W才會被計算。
time模組重要屬性
編號 |
屬性 |
描述 |
1 |
time.timezone |
UTC和本地時區(不含DST)之間的偏移量,以秒計。 |
2 |
time.tzname |
關於(標準時區名稱, 夏令時時區名稱)的元組 |
3 |
time.altzone |
當地夏令時時間與標準UTC時間的誤差,以秒計 |
4 |
time.daylight |
當地時間是否反映夏令時,預設為0 |
time模組示例
# coding=utf-8
'''
Created on 2017年8月27日
@author: zxt
'''
importtime
# Seconds
ticks = time.time()
# 這個形式不能表示在時代(1970年1月1日上午12:00)之前的日期。
# 而且截止點為3038年的某個時刻,在未來的日子也不能以這種方式表示
print("Number of ticks since 12:00am, January 1, 1970:", ticks);
# 獲取當前本地時間
localtime =time.localtime(time.time());
print("Local current time :", localtime);
# 當前時間
curtime = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime());
print(curtime);
# 也可以使用asctime()進行時間格式化
print(time.asctime(localtime));
Calendar
模組
calendar模組提供與日曆相關的功能,包括為給定的月份或年份列印文字日曆的功能。
預設情況下,日曆將星期一作為一週的第一天,將星期日作為最後一天。如果想要更改這個,可呼叫calendar.setfirstweekday()函式設定修改。
以下是calendar模組可用的功能函式列表
函式 |
描述 |
|
返回一個具有年份日曆的多行字串格式化為三列,以 |
|
返回當前設定每週開始的星期。預設情況下,當日歷首次匯入時設定為: |
|
如果給定年份( |
|
返回在範圍 |
|
返回一個多行字串,其中包含年份月份的日曆,每週一行和兩個標題行。 |
|
返回 |
|
返回兩個整數。第一個是年度月( |
|
類似於: |
|
類似於: |
|
將每週的第一天設定為星期幾的程式碼。星期幾的程式碼為 |
|
|
|
返回給定日期的星期幾的程式碼。星期幾的程式碼為 |
calendar模組示例
# coding=utf-8
'''
Created on 2017年8月27日
@author: zxt
'''
importcalendar
# 獲取一個月的日曆
cal = calendar.month(2017, 8);
print("Here is the calendar:");
print(cal);
datetime
模組
datetime是Python處理日期和時間的標準庫。需要注意的是,datetime是一個模組,這個模組裡面有datetime類,此外常用的還有date類,以及time類。
datetime模組使用例項:
# coding=utf-8
'''
Created on 2017年8月27日
@author: zxt
'''
fromdatetime importdate
fromdatetime importdatetime
fromdatetime importtimedelta
# 計算兩個日期相差多少天
d1 = date(2018, 10, 18);
d2 = date(2017, 12, 31);
print("(2018, 10, 18)與(2017, 12, 31)相差:", (d1 - d2).days, "天!");
# 獲取兩個日期時間的時間差
time1 = datetime(2019, 1, 13, 12, 0, 0);
time2 = datetime.now();
differtime = (time1 -time2).total_seconds();
# 輸出結果
print("(2019,1,13,12,0,0)與當前時間相差:", differtime, "秒!");
# 當前日期
curdate = date.today();
print("curdate =",curdate);
# 計算十天之後的日期時間
nowday = datetime.now();
# timedelta類可以很容易地算出前幾天和後幾天的時刻。(timedelta(days= d, hours= h))
# 還可以檢視第幾周對應的時間,例如:timedelta(weeks=20) 20周將被自動轉化為天數
# 前幾天時刻,用減法。 後幾天時刻,則用當前時間加上timedelta(days = d, hours= h)
lastday = nowday + timedelta(days=10);
print(str(lastday));
# ctime() 返回一個表示日期和時間的字串。
print(lastday.ctime());
# 檢視某一天是今年的第幾天和第幾周
testday = date(2017, 8, 31);
# isocalendar() 函式返回三元組 分別為:年份,週數,周幾
print(testday.isocalendar());
# timetuple() 返回時間元祖
print(testday.timetuple());
其他程式例項:
計算程式執行時間
# coding=utf-8
'''
Created on 2017年8月27日
@author: zxt
'''
# 統計程式執行時間的程式
importtime
# datetime是一個模組,模組裡面有一個datetime類,所以可以from datetime importdatetime
importdatetime
# 方法一(效能最差)
starttime = datetime.datetime.now();
time.sleep(2);
endtime = datetime.datetime.now();
print((endtime - starttime).seconds)
# 方法二
start = time.time();
time.sleep(2);
end = time.time();
print(end- start);
# 方法1和方法2都包含了其他程式使用CPU的時間,是程式開始到程式結束的執行時間。
# 推薦方法
# 方法3 (只計算了程式執行的CPU時間)
first = time.clock();
time.sleep(2);
second = time.clock();
print(second- first);
# 要實現跨平臺的精度性,也可以使用timeit 來代替time.
importtimeit
starttime2 = timeit.default_timer();
time.sleep(2);
endtime2 = timeit.default_timer();
print(str(endtime2 - starttime2));