Python的日期和時間模塊常用的有三個,分別是:time、datetime、calendar,下面分別來介紹一下。
一、time模塊
time模塊提供了一些用於管理時間和日期的C庫函數,由於它綁定到底層C實現,因此一些細節會基於具體的平臺。
1、獲取當前時間
a)time()
time模塊的核心函數time(),它返回紀元開始的秒數,返回值爲浮點數,具體精度依賴於平臺。
>>> import time
>>> time.time()
1460599046.85416
b)ctime()
浮點數一般用於存儲和比較日期,但是對人類不友好,要記錄和打印時間,可以使用ctime()。
>>> import time
>>> time.ctime()
'Thu Apr 14 10:03:58 2016'
>>> later = time.time()+5
>>> time.ctime(later)
'Thu Apr 14 10:05:57 2016'
2、解析和格式化時間
time模塊提供了兩個函數 strptime() 和 strftime(),可以在time.struct_time(在第三點中有介紹)和時間值字符串之間轉換。
a)strptime()
用於將字符串時間轉換成struct_time格式:
>>> now=time.ctime()
>>> time.strptime(now)
time.struct_time(tm_year=2016, tm_mon=4, tm_mday=14, tm_hour=10, tm_min=48, tm_sec=40,
tm_wday=3, tm_yday=105, tm_isdst=-1)
b)strftime()
用於時間的格式化輸出:
>>> from time import gmtime, strftime
>>> strftime("%a, %d %b %Y %H:%M:%S +0000", gmtime())
'Thu, 28 Jun 2001 14:17:15 +0000'
"""
注:python中時間日期格式化符號:
%y 兩位數的年份表示(00-99)
%Y 四位數的年份表示(000-9999)
%m 月份(01-12)
%d 月內中的一天(0-31)
%H 24小時制小時數(0-23)
%I 12小時制小時數(01-12)
%M 分鐘數(00=59)
%S 秒(00-59)
%a 本地簡化星期名稱
%A 本地完整星期名稱
%b 本地簡化的月份名稱
%B 本地完整的月份名稱
%c 本地相應的日期表示和時間表示
%j 年內的一天(001-366)
%p 本地A.M.或P.M.的等價符
%U 一年中的星期數(00-53)星期天爲星期的開始
%w 星期(0-6),星期天爲星期的開始
%W 一年中的星期數(00-53)星期一爲星期的開始
%x 本地相應的日期表示
%X 本地相應的時間表示
%Z 當前時區的名稱
%% %號本身
"""
c)mktime()
用於將struct_time轉換成時間的浮點數表示:
>>> from time import mktime, gmtime
>>> mktime(gmtime())
1460573789.0
3、time.struct_time類
struct_time類是time模塊定義的用來維護時間和日期的類,存儲時間的各個部分,以便訪問。time.gmtime()和time.localtime()的返回的值就是struct_time類型對象。localtime()用於獲取當前時區的當前時間,gmtime()用於獲取UTC時間,UTC時間實際就是格林尼治時間,它與中國時間的時差爲八個小時。
import time
def show_struct(t):
# 這邊可以直接用t.()訪問時間元素
print("tm_year:", t.tm_year)
print("tm_mon:", t.tm_mon)
print("tm_mday:", t.tm_mday)
print("tm_hour:", t.tm_hour)
print("tm_min:", t.tm_min)
print("tm_sec:", t.tm_sec)
print("tm_wday:", t.tm_wday)
print("tm_yday:", t.tm_yday)
show_struct(time.gmtime())
show_struct(time.localtime())
注:struct_time對象的屬性
序號 |
屬性 |
值 |
0 |
tm_year |
2008 |
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 |
4、處理時區
a)獲取時間差
>>> import time
>>> time.timezone/3600
-8
b)設置時區
ZONES = ["GMT", "EUROPE/Amsterdam']
for zone in ZONES:
os.environ["TZ"] = zone
time.tzset()
5、程序的實際運行時間
process_time()和perf_counter()返回處理器時鐘時間,它的返回值一般用於性能測試與基準測試。因此它們反映了程序的實際運行時間。
>>> import time
>>> time.process_time()
0.07
6、sleep()
sleep函數用於將當前線程交出,要求它等待系統將其再次喚醒,如果寫程序只有一個線程,這實際上就會阻塞進程,什麼也不做。
# 執行以下代碼,將等待5秒鐘之後再輸出信息。
import time
def fucn():
time.sleep(5)
print("hello, world")
二、datetime模塊
python中的datetime模塊提供了操作日期和時間功能, 該模塊提供了五種核心對象:datetime(時間日期類型), date(日期類型), time(時間類型), tzinfo(時區類型), timedelta(時間差類型)。分別如下:
1、datetime 對象
datetime對象可以用來表示精確的日期和時間,其實例化方法如下
>>> from datetime import datetime
>>> birthday = datetime(year=1993, month=10, day=20)
>>> birthday
datetime.datetime(1993, 10, 20, 0, 0)
>>> birthday.month
10
>>> now = datetime.now() # 返回當前時間
>>> now
datetime.datetime(2016, 12, 17, 20, 3, 25, 898000)
在實例化datetime對象時,year, month, day是必填項,hour, minute, second, microsecond(微秒), tzinfo(時區)是可選項。
2、date 對象
date對象和datetime對象的區別在於,date對象只能表示日期,不能表示時間(即其精確度爲天)。date實例化時須要且僅須要三個參數:year, month, day。date對象是沒有時區(tzinfo)屬性的。
>>> from datetime import date
>>> birthday = date(year=2016, month=12, day=17)
>>> birthday
datime.date(2016, 12, 17)
>>> birthday.year
2016
3、time對象
和date對象相反,time對象只能用來表示時間,而不能用來表示日期。time對象所表示的時間可以精確到微秒,而且可以具有時區(tzinfo)屬性。
>>> from datetime import time
>>> now_time = time(hours=20, minute=30, second=10)
# hours, minute, second,microsecond, tzinfo都是可選參數
>>> now_time
datetime.time(20, 30, 10)
>>> now_time.hours
20
4、timedelta對象
timedelta對象表示一個時間段,timedelta對象可以通過手動實例化得到,也可以通過上述三個對象(datetime, date, time)相減得到。
>>> from datetime import datetime, timedleta
>>> now = datetime.now()
>>> last = datetime(year=2016, month=3, day=10, hour=8)
>>> delta = now - last
>>> delta
datetime.timedelta(282, 47010, 328000)
>>> last + delta == now
True
手動實例化timedelta時,可以傳入的參數有:days, seconds, microseconds, milliseconds, minutes, hours, weeks。
5、tzinfo對象
講解tzinfo(時區)對象前,先了解兩個概念:
a)UTC時間: 協調世界時。和GMT(格林尼治平均時間)是一個東西,只不過UTC是通過原子鐘測量出來,GMT是通過天文觀測出來的,所以UTC比GMT精度更高,因此現在世界上不同時區的時間都是以UTC時間爲基準,如:北京時間=UTC時間+8小時
b)DST:夏時令(daylight saving time),因爲夏天天亮的早,所以有的國家就在一年的某些時段把時間人爲的調快一小時,使人們早睡,減少照明亮,充分利用光照資源,從而節約能源。我國也實行過,不過後來廢止了。
tzinfo對象是用來表示該時區相對UTC時間差值,和該地區是否執行夏時令的對象。datetime模塊所提供的的tzinfo對象是一個抽象基類,也就是說我們不應該直接實例化此對象, 而應該以此類爲基類,定義出子類,然後再實例化以供使用。在子類化的時候,需要自定義很多方法,非常繁瑣。還好python提供了一個pytz的庫,裏面自帶了適合各個國家和時區的tzinfo對象,我們可以直接使用。
在python中,我們把tzinfo爲空的datetime對象稱爲是aware(覺醒)的,把tzinfo不爲空的datetime對象稱爲naive(幼稚)的。使用datetime模塊時,除非手動指定tzinfo屬性,否則,創建出來的datatime對象tzinfo屬性都默認爲空。
aware 對象具有關於應用規則和時間調整的充分的信息,例如時區和夏令時信息,來定位相對其他aware 對象的位置。aware對象用於表示時間的一個特定的時刻,它是明確無二的。
naive 對象沒有充分的信息來明確地相對其他日期/時間定位它自己。一個 naive 對象表示的是世界協調時(UTC)、本地時間還是其它時區的時間完全取決於程序,就像一個特定的數字表示的是米、英里還是質量一樣。
>>> from datetime import datetime
>>> import pytz
>>> utc_tz = pytz.timezone('UTC')
>>> china_tz = pytz.timezone('China/Shanghai')
>>> local_naive = datetime.now()
>>> local_naive
datetime.datetime(2016, 12, 18, 8, 8, 14000)
>>> local_aware = localmoment_aware.replace(china_tz)
datetime.datetime(2016, 12, 18, 8, 8, 14000, tzinfo=<DstTzInfo 'Asia/Shanghai' LMT+8>)
>>> utc_aware = local_aware.astimezone(utc_tz)
>>> utc_aware
datetime.datetime(2016, 12, 18, 0, 8, 14000, tzinfo=<UTC>
>>> utc_aware - local_aware #雖然時區不同但是表示的同一個時間點
datetime.timedelta(0)
注意,aware類型的datetime對象,只能和aware類型的datetime對象進行運算(相減,大小比較等)。navie類型的datetime對象,只能和naive類型的datetime對象進行運算(相減,大小比較等)。aware類型和naive類型之間運算會報錯:
>>> local_naive - local_aware
TypeError:can't subtract offset-naive and offset-aware datetime
三、calendar模塊
calendar是與日曆相關的模塊,calendar模塊文件裏定義了很多類型,主要有Calendar,TextCalendar以及HTMLCalendar類型。其中,Calendar是TextCalendar與HTMLCalendar的基類。該模塊文件還對外提供了很多方法,例如:calendar,month,prcal,prmonth之類的方法...
1、calendar()獲取指定年份的日曆字符串
>>> import calendar
>>> calen=calendar.calendar(2020)
>>> print(calen)
"""
2020
January February March
Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
1 2 3 4 5 1 2 1
6 7 8 9 10 11 12 3 4 5 6 7 8 9 2 3 4 5 6 7 8
13 14 15 16 17 18 19 10 11 12 13 14 15 16 9 10 11 12 13 14 15
20 21 22 23 24 25 26 17 18 19 20 21 22 23 16 17 18 19 20 21 22
30 31
April May June
Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
1 2 3 4 5 1 2 3 1 2 3 4 5 6 7
6 7 8 9 10 11 12 4 5 6 7 8 9 10 8 9 10 11 12 13 14
13 14 15 16 17 18 19 11 12 13 14 15 16 17 15 16 17 18 19 20 21
20 21 22 23 24 25 26 18 19 20 21 22 23 24 22 23 24 25 26 27 28
27 28 29 30 25 26 27 28 29 30 31 29 30
July August September
Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
1 2 3 4 5 1 2 1 2 3 4 5 6
6 7 8 9 10 11 12 3 4 5 6 7 8 9 7 8 9 10 11 12 13
13 14 15 16 17 18 19 10 11 12 13 14 15 16 14 15 16 17 18 19 20
20 21 22 23 24 25 26 17 18 19 20 21 22 23 21 22 23 24 25 26 27
27 28 29 30 31 24 25 26 27 28 29 30 28 29 30
31
October November December
Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
1 2 3 4 1 1 2 3 4 5 6
5 6 7 8 9 10 11 2 3 4 5 6 7 8 7 8 9 10 11 12 13
12 13 14 15 16 17 18 9 10 11 12 13 14 15 14 15 16 17 18 19 20
19 20 21 22 23 24 25 16 17 18 19 20 21 22 21 22 23 24 25 26 27
26 27 28 29 30 31 23 24 25 26 27 28 29 28 29 30 31
30
"""
2、month()獲取指定月份的日曆字符串
>>> import calendar
>>> calen=calendar.month(2020,6)
>>> print(calen)
"""
June 2020
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
"""
3、isleap()檢測年份是否是潤年
>>> import calendar
>>> calen1=calendar.isleap(2000)
>>> calen2=calendar.isleap(1900)
>>> print(calen1)
True
>>> print(calen2)
False
4、leapdays()檢測指定年限內潤年的數量
>>> import calendar
>>> calen1=calendar.leapdays(1949,2020)
>>> print(calen1)
17
5、monthrange() 獲取指定月份的信息
>>> import calendar
>>> calen1=calendar.monthrange(2020,6)
>>> print(calen1)
(0, 30)
6、weekday ()根據指定的年月日計算星期幾
>>> import calendar
>>> calen1=calendar.weekday(2020,6,13)
>>> print(calen1)
5
7、timegm() 將時間元組轉化爲時間戳
>>> import calendar
>>> tps = (2020,6,13,22,0,0,0,0)
>>> result = calendar.timegm(tps)
>>> print(result)
1592085600
還有其他函數:
參考:
1、https://www.jianshu.com/p/da0ef08c9ea7 作者:nummy
2、https://www.jianshu.com/p/1957c4cab0a3 作者:給我二兩面
3、https://www.jianshu.com/p/d2a7204a2a04 作者:我愛學python