【Python拾遺】Python 日期和時間模塊time、datetime、calendar

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章