1. 程式人生 > >Python時間與日期操作(datetime、time、calendar)

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

名詞解釋

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

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

相關模組

模組

說明

time

time是一個僅包含與日期和時間相關的函式和常量的模組,在本模組中定義了C/C++編寫的幾個類。例如,struct_time類。

datetime

datetime是一個使用面向物件程式設計設計的模組,可以在Python中使用日期和時間。它定義了幾個表示日期和時間的類。

calendar

日曆是一個提供函式的模組,以及與Calendar相關的幾個類,它們支援將日曆映像生成為texthtml….

locale

該模組包含用於格式化或基於區域設定分析日期和時間的函式。



時間元組

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

索引

欄位

0

4位數,表示年份

20182019…

1

月份

1 ~ 12

2

日期

1 ~ 31

3

小時

0 ~ 23

4

分鐘

0 ~ 59

5

0 ~ 61(6061是閏秒)

6

星期幾

0 ~ 6(

0是星期一)

7

一年的第幾天

1 ~ 366(朱利安日)

8

夏令時

-101-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

20182019…

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

-101-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

(year,w = 2,l = 1,c = 6)

返回一個具有年份日曆的多行字串格式化為三列,以c個空格分隔。w是每個日期的字元寬度;每行的長度為21 * w + 18 + 2 * cl是每週的行數。

firstweekday( )

返回當前設定每週開始的星期。預設情況下,當日歷首次匯入時設定為:0,表示為星期一。

isleap(year)

如果給定年份(year)是閏年則返回True;否則返回:False

leapdays(y1,y2)

返回在範圍(y1y2)內的年份中的閏年總數。

Month

(year,month,w = 2,l = 1)

返回一個多行字串,其中包含年份月份的日曆,每週一行和兩個標題行。w是每個日期的字元寬度;每行的長度為7 * w + 6l是每週的行數。

Monthcalendar(year,month)

返回int型別的列表。每個子列表表示一個星期。年份月份以外的天數設定為0;該月內的日期設定為月份的第幾日:1 ~ 31

Monthrange(year,month)

返回兩個整數。第一個是年度月(month)的星期幾的程式碼;第二個是當月的天數。表示星期幾為0(星期一)6(星期日);月份是112

Prcal

(year,w = 2,l = 1,c = 6)

類似於:calendar.calendar(yearwlc)的列印。

Prmonth

(year,month,w = 2,l = 1)

類似於:calendar.month(year,month,w,l)的列印。

setfirstweekday(weekday)

將每週的第一天設定為星期幾的程式碼。星期幾的程式碼為0(星期一)6(星期日)

timegm(tupletime)

time.gmtime的倒數:以時間元組的形式接受時刻,並返回與從時代(epoch)開始的浮點數相同的時刻。

weekday(year,month,day)

返回給定日期的星期幾的程式碼。星期幾的程式碼為0(星期一)6(星期日);月數是1(1)12(12)

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模組

        datetimePython處理日期和時間的標準庫。需要注意的是,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));