相關模塊
| 模塊 | 說明 |
| 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 - 12) 10 %j 一年中的第幾天(001 - 366) 11 %m 月份(01 - 12) 12 %M 分鍾數(00 - 59) 13 %p 本地am或者pm的相應符 14 %S 秒(01 - 61) 15 %U 一年中的星期數。(00 - 53星期天是一個星期的開始。)第一個星期天之前的所有天數都放在第0周。 16 %w 一個星期中的第幾天(0 - 6,0是星期天) 17 %W 和%U基本相同,不同的是%W以星期一為一個星期的開始。 18 %x 本地相應日期 19 %X 本地相應時間 20 %y 去掉世紀的年份(00 – 99) 21 %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
