Python時間與日期操作(datetime、time、calendar)


 相關模塊

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

        UTC(CoordinatedUniversal Time,世界協調時)亦即格林威治天文時間,世界標准時間。在中國為UTC+8。

        DST(DaylightSaving Time)即夏令時。是一種為節約能源而人為規定地方時間的制度,一般在天亮早的夏季人為將時間提前一小時

 

 時間元組

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(0是星期一)
7 一年的第幾天 1 ~ 366(朱利安日)
8 夏令時 1,0,1,-1是決定是否為夏令時的旗幟
 1 year (four digits, e.g. 2018)
 2 month (1-12)
 3 day (1-31)
 4 hours (0-23)
 5 minutes (0-59)
 6 seconds (0-59)
 7 weekday (0-6, Monday is 0)
 8 Julian day (day in the year, 1-366)
 9 #夏令時格式,0:正常格式,1:夏令時格式,-1:根據當前的日期時間格式來判定
10 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個整型內容。分別表示不同的時間含義。

編號 方法 描述
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() 改變本地時區

 時間字符串支持的格式符號:

 1 格式  含義  備注
 2 %a  本地(locale)簡化星期名稱
 3 %A  本地完整星期名稱
 4 %b  本地簡化月份名稱
 5 %B  本地完整月份名稱
 6 %c  本地相應的日期和時間表示
 7 %d  一個月中的第幾天(01 - 31 8 %H  一天中的第幾個小時(24小時制,00 - 23 9 %I  第幾個小時(12小時制,01 - 1210 %j  一年中的第幾天(001 - 36611 %m  月份(01 - 1212 %M  分鍾數(00 - 5913 %p  本地am或者pm的相應符
14 %S  秒(01 - 6115 %U  一年中的星期數。(00 - 53星期天是一個星期的開始。)第一個星期天之前的所有天數都放在第0周。
16 %w  一個星期中的第幾天(0 - 6,0是星期天)
17 %W  和%U基本相同,不同的是%W以星期一為一個星期的開始。
18 %x  本地相應日期
19 %X  本地相應時間
20 %y  去掉世紀的年份(00 – 9921 %Y  完整的年份
22 %Z  時區的名字(如果不存在為空字符)
23 %%  ‘%’字符

注意:

        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模塊實例

 1 import time
 2  
 3 ticks = time.time()
 4  
 5 # 這種格式不能表示在時代(1970年1月1日上午12:00)之前的日期。只能表示之后日期並且截止點為3038年的某個時刻,在未來的日子也不能以這種方式表示
 6 print("Number of ticks since 12:00am, January 1, 1970:", ticks)
 7  
 8 # 獲取當前本地時間
 9 localtime =time.localtime(time.time())
10 print("Local current time :", localtime)
11 
12 # 當前時間格式化
13 curtime = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())
14 print(curtime)
15 # 也可以使用asctime()進行時間格式化
16 print(time.asctime(localtime))

結果:

Number of ticks since 12:00am, January 1, 1970: 1541039190.1566076
Local current time : time.struct_time(tm_year=2018, tm_mon=11, tm_mday=1, tm_hour=10, tm_min=26, tm_sec=30, tm_wday=3, tm_yday=305, tm_isdst=0)
2018-11-01 10:26:30
Thu Nov  1 10:26:30 2018

 Calendar模塊

calendar模塊提供與日歷相關的功能,包括為給定的月份或年份打印文本日歷的功能。

默認情況下,日歷將星期一作為一周的第一天,將星期日作為最后一天。如果想要更改這個,可調用calendar.setfirstweekday()函數設置修改。

以下是calendar模塊可用的功能函數列表

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

 

calendar模塊實例 

1 import calendar
2  
3 # 獲取一個月的日歷
4 cal = calendar.month(2018, 10);
5 print("Here is the calendar:");
6 print(cal);

結果:

Here is the calendar:
    October 2018
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 31

datetime模塊

        datetime是Python處理日期和時間的標准庫。需要注意的是,datetime是一個模塊,這個模塊里面有datetime類,此外常用的還有date類,以及time類。

datetime模塊使用實例:

 1 from datetime import date
 2 from datetime import datetime
 3 from datetime import timedelta
 4  
 5 # 計算兩個日期相差多少天
 6 d1 = date(2018, 10, 18);
 7 d2 = date(2017, 12, 31);
 8  
 9 print("(2018, 10, 18)與(2017, 12, 31)相差:", (d1 - d2).days, "天!");
10  
11 # 獲取兩個日期時間的時間差
12 time1 = datetime(2019, 1, 13, 12, 0, 0);
13 time2 = datetime.now();
14 differtime = (time1 -time2).total_seconds();
15 print("(2019,1,13,12,0,0)與當前時間相差:", differtime, "秒!");# 輸出結果
16   
17 # 當前日期
18 curdate = date.today();
19 print("curdate =",curdate);
20   
21 # 計算十天之后的日期時間
22 nowday = datetime.now();
23 # timedelta類可以很容易地算出前幾天和后幾天的時刻。(timedelta(days= d, hours= h))
24 # 還可以查看第幾周對應的時間,例如:timedelta(weeks=20) 20周將被自動轉化為天數
25 # 前幾天時刻,用減法。  后幾天時刻,則用當前時間加上timedelta(days = d, hours= h)
26 lastday = nowday + timedelta(days=10);
27 print(str(lastday));
28 print(lastday.ctime());# ctime()  返回一個表示日期和時間的字符串。
29   
30 # 查看某一天是今年的第幾天和第幾周
31 testday = date(2017, 8, 31);
32 print(testday.isocalendar());# isocalendar() 函數返回三元組    分別為:年份,周數,周幾
33 print(testday.timetuple());# timetuple()  返回時間元祖

結果:

(2018, 10, 18)與(2017, 12, 31)相差: 291 天!
(2019,1,13,12,0,0)與當前時間相差: 6311998.358155 秒!
curdate = 2018-11-01
2018-11-11 10:40:01.641845
Sun Nov 11 10:40:01 2018
(2017, 35, 4)
time.struct_time(tm_year=2017, tm_mon=8, tm_mday=31, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=243, tm_isdst=-1)

 

其他程序實例:計算程序運行時間

 1 # 統計程序運行時間的程序 
 2 import time
 3 # datetime是一個模塊,模塊里面有一個datetime類,所以可以from datetime importdatetime
 4 import datetime
 5  
 6 # 方法一(性能最差)
 7 starttime = datetime.datetime.now()
 8 time.sleep(2)
 9 endtime = datetime.datetime.now() 
10 print((endtime - starttime).seconds)
11   
12 # 方法二
13 start = time.time()
14 time.sleep(2)
15 end = time.time()
16 print(end- start)
17 
18 # 方法1和方法2都包含了其他程序使用CPU的時間,是程序開始到程序結束的運行時間。
19   
20 # 推薦方法3 (只計算了程序運行的CPU時間)
21 first = time.clock()
22 time.sleep(2)
23 second = time.clock();
24 print(second- first)
25  
26  
27 # 要實現跨平台的精度性,也可以使用timeit 來代替time.
28 import timeit
29  
30 starttime2 = timeit.default_timer()
31 time.sleep(2)
32 endtime2 = timeit.default_timer()
33 print(str(endtime2 - starttime2))

結果:

2
2.0009114742279053
2.0007298604141965
2.000633781133109

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM