大師兄的Python學(xué)習(xí)筆記(十一): 時間模塊time,datetime和calendar

大師兄的Python學(xué)習(xí)筆記(十): 多進程和多線程
大師兄的Python學(xué)習(xí)筆記(十二): 常用高級函數(shù)

一、基礎(chǔ)概念

1. 關(guān)于Python中的時間模塊
  • Python中有很多時間相關(guān)的模塊,其中比較常用的包括time包、datetime包、 calendar包、pytz包、dateutil包等。
  • 本篇只介紹基礎(chǔ)包,還有很多好用的模塊可以根據(jù)功能需求在github中搜索。
2. 時間戳(timestamp)
  • 時間戳是指格林威治時間自1970年1月1日(00:00:00 GMT)至當(dāng)前時間的總秒數(shù)。
  • 時間戳具有唯一性,可以唯一地標識某一刻的時間。
  • 32位系統(tǒng)中,時間戳的長度為32位,UNIX和Windows只支持到2038年。
>>>import time
>>>time.time() # 獲取當(dāng)前時間戳,距離1971年1月1日(00:00:00 GMT)的秒數(shù)
1579695503.7354536
3. struct_time元組
  • 用于處理時間的元組,包含了時間的基本信息。
  • 可以通過索引和屬性名訪問值。
  • 值包括:
索引 含義 屬性
0 tm_year (例如,1993)
1 tm_mon range [1, 12]
2 tm_mday range [1, 31]
3 小時 tm_hour range [0, 23]
4 tm_min range [0, 59]
5 tm_sec range [0, 61]
6 一周的第幾日 tm_wday range [0, 6] ,周一為 0
7 一年的第幾日 tm_yday range [1, 366]
8 是否夏令時 tm_isdst 0, 1 或 -1
N/A 時區(qū) tm_zone 時區(qū)名稱的縮寫
N/A 偏離 tm_gmtoff 以秒為單位的UTC以東偏離

二、time包

  • 提供了時間的訪問和轉(zhuǎn)換功能。
  • 屬于Python的標準庫。

1)time.time()

  • 獲取當(dāng)前時間的時間戳浮點數(shù)。
>>>import time
>>>time.time()
1579695503.7354536

2)time.localtime(time)

  • 轉(zhuǎn)換為本地時間。
  • time的默認值是當(dāng)前時間。
>>>import time
>>>time.localtime()
time.struct_time(tm_year=2020, tm_mon=2, tm_mday=4, tm_hour=17, tm_min=55, tm_sec=22, tm_wday=1, tm_yday=35, tm_isdst=0)

3)time.asctime(time)

  • 獲取默認格式的格式化時間。
  • time的默認值是當(dāng)前時間。
>>>import time
>>>time.asctime(time.localtime())
'Tue Feb  4 17:59:38 2020'

4)time.strftime(format,time)

  • 獲取格式化的時間。
  • 格式化符號:
符號 含義
%y 兩位數(shù)的年份表示(00-99)
%Y 四位數(shù)的年份表示(000-9999)
%m 月份(01-12)
%d 月內(nèi)中的一天(0-31)
%H 24小時制小時數(shù)(0-23)
%I 12小時制小時數(shù)(01-12)
%M 分鐘數(shù)(00=59)
%S 秒(00-59)
%a 本地簡化星期名稱
%A 本地完整星期名稱
%b 本地簡化的月份名稱
%B 本地完整的月份名稱
%c 本地相應(yīng)的日期表示和時間表示
%j 年內(nèi)的一天(001-366)
%p 本地A.M.或P.M.的等價符
%U 一年中的星期數(shù)(00-53)星期天為星期的開始
%w 星期(0-6),星期天為星期的開始
%W 一年中的星期數(shù)(00-53)星期一為星期的開始
%x 本地相應(yīng)的日期表示
%X 本地相應(yīng)的時間表示
%Z 當(dāng)前時區(qū)的名稱
%% %號本身
>>>import time
>>>time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())
'2020-02-05 18:59:00'
>>>time.strftime("%a %b %d %H:%M:%S %Y",time.localtime())
'Wed Feb 05 19:01:13 2020'

5)time.perf_counter()

  • 返回當(dāng)前的CPU時間戳。
  • 通常用來計算程序耗時。
>>>import time
>>>t0 = time.perf_counter()
>>>for i in range(10000):
>>>    i+= 1
>>>t1 = time.perf_counter()
>>>tz = str(t1-t0)
>>>print("耗時{t}毫秒".format(t=tz))
耗時0.0007448000001204491毫秒

6)time.ctime(time)

  • 返回當(dāng)?shù)氐臅r間,相當(dāng)于asctime(localtime(secs))。
  • time的默認值是當(dāng)前時間。
>>>import time
>>>time.ctime()
'Thu Feb  6 18:12:01 2020'

7)time.gmtime(time)

  • 將時間戳轉(zhuǎn)換為格林威治時間,并返回 struct_time元祖。
  • time的默認值是當(dāng)前時間。
>>>import time
>>>time.gmtime(324234324)
time.struct_time(tm_year=1980, tm_mon=4, tm_mday=10, tm_hour=17, tm_min=5, tm_sec=24, tm_wday=3, tm_yday=101, tm_isdst=0)

8)time.localtime(time)

  • 將時間戳轉(zhuǎn)換為當(dāng)?shù)貢r間,并返回 struct_time元祖。
  • time的默認值是當(dāng)前時間。
>>>import time
>>>time.localtime(324234324)
time.struct_time(tm_year=1980, tm_mon=4, tm_mday=11, tm_hour=1, tm_min=5, tm_sec=24, tm_wday=4, tm_yday=102, tm_isdst=0)

9)time.mktime(tupletime)

  • 將struct_time元祖轉(zhuǎn)換為時間戳。
>>>import time
>>>time.mktime(time.localtime())
1580984332.0

10)time.sleep(<time>)

  • 讓線程等候<time>秒。
>>>import time
>>>print(time.localtime()[-4])
>>>time.sleep(5)
>>>print(time.localtime()[-4])
30
35

11)time.strptime(str,fmt)

  • 將字符串str解析為struct_time元祖。
  • fmt為字符串的時間格式。
>>>import time
>>>time.strptime("2020-2-6 16:00:00","%Y-%m-%d %H:%M:%S")
time.struct_time(tm_year=2020, tm_mon=2, tm_mday=6, tm_hour=16, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=37, tm_isdst=-1)

12)time.timezone屬性

  • 當(dāng)?shù)貢r區(qū),即距離格林威治的偏移秒數(shù)。
>>>import time
>>>time.timezone
-28800

13)time.tzname屬性

  • 一個包含時區(qū)名稱和夏令時本地區(qū)名稱的元祖。
>>>import time
>>>time.tzname
('中國標準時間', '中國夏令時')

三、datetime包

  • datetime包重新封裝了time包,增加了更多的接口。
  • datetime包在python標準庫中。
  • datetime模塊包含的類和屬性:
類和屬性 功能
date 日期對象
time 時間對象
datetime 日期時間對象
datetime_CAPI 日期對象的C語言接口
timedelta 時間間隔
tzinfo 時區(qū)信息對象
MAXYEAR 最大年份(9999)
MINYEAR 最小年份(1)
3.1 date類

1)date(year,month,day)

  • 實例化date類。
>>>from datetime import date
>>>day = date(2020,2,14)
>>>print(day)
>>>print(day.year,day.month,day.day)
2020-02-14
2020 2 14

2)date.max

  • 最大日期
>>>from datetime import date
>>>date.max
datetime.date(9999, 12, 31)

3)date.min

  • 最小日期
>>>from datetime import date
>>>date.min
datetime.date(1, 1, 1)

4)date.resolution

  • date類最小的對象,天。
>>>from datetime import date
>>>date.resolution
datetime.timedelta(days=1)

5)date.today()

  • 返回當(dāng)前日期對象。
>>>from datetime import date
>>>today = date.today()
>>>print(today)
2020-02-07

6)date.fromtimestamp(timestamp)

  • 根據(jù)時間戳timestamp返回date對象。
>>>from datetime import date
>>>import time
>>>day = date.fromtimestamp(time.time())
>>>print(day)
2020-02-07

7)date.replace(year,month,day)

  • 替換原屬性并生成新的對象。
  • 不影響原對象。
>>>from datetime import date
>>>day1 = date(2020,2,14)
>>>day2 = day1.replace(2020,3,14)
>>>print(day2)
>>>print(day2.year,day2.month,day2.day)
2020-03-14
2020 3 14

8)date.timetuple()

  • 返回date對應(yīng)的time.struct_time對象。
>>>from datetime import date
>>>today = date.today()
>>>print(today.timetuple())
time.struct_time(tm_year=2020, tm_mon=2, tm_mday=7, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=4, tm_yday=38, tm_isdst=-1)

9)date.weekday()

  • 返回date是星期幾(從0開始)。
>>>from datetime import date
>>>today = date.today()
>>>print(today.weekday())
4

10)date.isoweekday()

  • 返回date是星期幾(從1開始)。
>>>from datetime import date
>>>today = date.today()
>>>print(today.isoweekday())
5

11)date.isocalendar()

  • 返回年、一年中的第幾周和一周中的第幾天的元祖。
>>>from datetime import date
>>>today = date.today()
>>>print(today.isocalendar())
(2020, 6, 5)

12)date.isoformat()

  • 返回日期的標準格式字符串。
>>>from datetime import date
>>>today = date.today()
>>>print(today.isoformat())
2020-02-07
3.2 time類

1)time(hour,minute,second,microsecond,tzinfo)

  • 實例化time類。
>>>from datetime import time
>>>t = time(8,20,30,200)
>>>print(t)
>>>print(t.hour,t.minute,t.second,t.microsecond,t.tzinfo)
08:20:30.000200
8 20 30 200 None

2)time.max

  • 最大時間。
>>>from datetime import time
>>>time.max
datetime.time(23, 59, 59, 999999)

3)time.min

  • 最小時間。
>>>from datetime import time
>>>time.min
datetime.time(0,0)

4)time.resolution

  • 最小的時間單位。
>>>from datetime import time
>>>time.resolution
datetime.timedelta(microseconds=1)

5)time.replace(hour, minute, second, microsecond, tzinfo)

  • 創(chuàng)建一個新的time對象,并用新的屬性替換。
  • 不影響原對象。
>>>from datetime import time
>>>t1 = time(8,20,30,200)
>>>t2 = t1.replace(10,10,20,100)
>>>print(t2)
10:10:20.000100

6)time.isoformat()

  • 返回標準的時間字符串。
>>>from datetime import time
>>>t = time(8,20,30,200)
>>>t.isoformat()
'08:20:30.000200'

7)time.strftime(time,fmt)

  • 接受一個datetime.time對象和格式,返回字符串。
  • fmt與2.4的內(nèi)容相同。
>>>from datetime import time
>>>t = time(8,20,30,200)
>>>print(time.strftime(t,"%Y-%m-%d %H:%M:%S"))
>>>print(time.strftime(t,"%a %b %d %H:%M:%S %Y"))
1900-01-01 08:20:30
Mon Jan 01 08:20:30 1900
3.3 datetime類
  • datetime類是date類和time類的結(jié)合體。

1)datetime(year,month,day,hour,minute,second,microsecond,tzinfo)

  • 實例化datetime類。
>>>from datetime import datetime
>>>dt = datetime(2020,2,14,8,20,30,200)
>>>print(dt)
>>>print(dt.year,dt.month,dt.day,dt.hour,dt.minute,dt.second,dt.microsecond,dt.tzinfo)
2020-02-14 08:20:30.000200
2020 2 14 8 20 30 200 None

2)datetime.today()

  • 返回當(dāng)前本地時間datetime對象。
>>>from datetime import datetime
>>>datetime.today()
datetime.datetime(2020, 2, 8, 17, 21, 44, 571213)

3)datetime.now(tz)

  • 可以接受時區(qū)參數(shù),如果參數(shù)不存在則與today()相同。
>>>from datetime import datetime,timezone,timedelta
>>>tz_utc_8 = timezone(timedelta(hours=8)) # 設(shè)置與UTC的8小時時差
>>>print(datetime.now(tz=tz_utc_8))
2020-02-08 17:28:41.004420+08:00

4)datetime.utcnow()

  • 返回UTC時間的datetime對象。(格林威治時間)
>>>from datetime import datetime
>>>print(datetime.utcnow())
2020-02-08 09:30:59.423419

5)datetime.fromtimestamp(timestamp, tz)

  • 根據(jù)時間戳創(chuàng)建datetime對象。
  • tz為時區(qū)信息。
>>>from datetime import datetime
>>>import time
>>>datetime.fromtimestamp(time.time())
datetime.datetime(2020, 2, 8, 17, 33, 9, 517400)

6)datetime.isoformat(sep=’T’)

  • 返回標準格式的日期時間字符串。
  • sep是分割符。
>>>from datetime import datetime
>>>dt = datetime.now()
>>>dt.isoformat()
'2020-02-08T17:35:04.790249'

7)datetime.ctime()

  • 返回一個日期時間字符串。
>>>from datetime import datetime
>>>dt = datetime.now()
>>>dt.ctime()
'Sat Feb  8 17:36:52 2020'

8)datetime.strftime(fmt)

  • 將datetime對象轉(zhuǎn)換為指定格式的字符串。
>>>from datetime import datetime
>>>dt = datetime.now()
>>>fmt = "%Y-%m-%d %H:%M:%S"
>>>dt.strftime(fmt)
'2020-02-08 17:47:44'

9)datetime.strptime(date_string,format)

  • 將日期時間字符串轉(zhuǎn)換為datetime對象。
>>>from datetime import datetime
>>>fmt = "%Y-%m-%d %H:%M:%S"
>>>datetime.strptime("2020-02-08 17:40:00",fmt)
datetime.datetime(2020, 2, 8, 17, 40)

10)datetime.combine(date,time)

  • 將date對象和time對象合并成為一個新的datetime對象。
>>>from datetime import date,time,datetime
>>>today = day.today()
>>>t = time(8,20,30,200)
>>>dt = datetime.combine(today,t)
>>>print(dt)
2020-02-08 08:20:30.000200

11)datetime. timetuple()

  • 返回datetime對象的struct_time元組。
>>>from datetime import datetime
>>>dt= datetime.now()
>>>dt. timetuple()
time.struct_time(tm_year=2020, tm_mon=2, tm_mday=8, tm_hour=17, tm_min=51, tm_sec=58, tm_wday=5, tm_yday=39, tm_isdst=-1)

12)datetime. utctimetuple()

  • 返回datetime對象的utc時間struct_time元組。
>>>from datetime import datetime,timezone,timedelta
>>>tz_utc_8 = timezone(timedelta(hours=8))
>>>dt = datetime.now(tz=tz_utc_8)
>>>dt. utctimetuple ()
time.struct_time(tm_year=2020, tm_mon=2, tm_mday=8, tm_hour=9, tm_min=58, tm_sec=7, tm_wday=5, tm_yday=39, tm_isdst=0)

13)datetime.toordinal()

  • 計算datetime是從0001-01-01開始算起的第幾天。
>>>from datetime import datetime
>>>dt = datetime.now()
>>>dt.toordinal()
737463

14)datetime.weekday()

  • 返回datetime對象是星期幾。
  • 從0開始。
>>>from datetime import datetime
>>>dt = datetime.now()
>>>dt.weekday()
5

15)datetime.isocalendar()

  • 返回datetime對象的年份,一年的第幾周和一周的第幾天。
  • 返回的是一個元組。
>>>from datetime import datetime
>>>dt = datetime.now()
>>>dt.isocalendar()
(2020, 6, 6)
3.4 timedelta類
  • 表示兩個時間的差值。

1)timedelta(days,seconds,microseconds,milliseconds,minutes,hours,weeks)

  • 實例化timedelta類。
>>>from datetime import timedelta
>>>delta = timedelta(days=1,minutes=5) # 時間差為1天零5分鐘
>>>print(delta)
1 day, 0:05:00

2)timedelta.min

  • 返回負數(shù)最大時間差。
>>>from datetime import timedelta
>>>timedelta.min
datetime.timedelta(days=-999999999)

3)timedelta.max

  • 返回正數(shù)最大時間差。
>>>from datetime import timedelta
>>>timedelta.max
datetime.timedelta(days=999999999, seconds=86399, microseconds=999999)

4)timedelta.resolution

  • 返回兩個時間的最小時間差。
>>>from datetime import timedelta
>>>timedelta.resolution
datetime.timedelta(microseconds=1)

5)利用timedelta計算時間

  • 可以很方便的利用timedelta對datetime對象進行計算。
>>>from datetime import *
>>>today = datetime.now()
>>>delta = timedelta(days=20,minutes=5,hours=10)
>>>day = today + delta # 獲得delta時間后的datetime類
>>>print(day)
2020-02-29 04:28:21.189760
3.5 tzinfo類
  • 是關(guān)于時區(qū)信息的類。
  • 是一個抽象類,不能直接被實例化。

1)使用時區(qū)

>>>from datetime import *
>>>class beijing(tzinfo): # 創(chuàng)建北京時區(qū)
>>>    # 北京時間
>>>    def __init__(self,offset=8):
>>>        self._offset = offset
>>>    def utcoffset(self,dt):
>>>        return timedelta(hours=self._offset)
>>>    def tzname(self,dt):
>>>        return "beijing"
>>>    def dst(self,dt):
>>>        return timedelta(hours=self._offset)
>>>beijing_time_now = datetime.now(beijing()) # 北京時間
>>>utc_time_now = datetime.now(beijing(-8)) # 格林威治時間
>>>print(beijing_time_now,beijing_time_now.tzinfo.tzname(beijing),beijing_time_now.tzinfo.utcoffset(beijing))
>>>print(utc_time_now)
>>>print(beijing_time_now == utc_time_now)
2020-02-08 19:11:40.114615+08:00 beijing 8:00:00
2020-02-08 03:07:29.020073-08:00
True

四、calendar包

  • 日歷相關(guān)的模塊。

1)calendar(year)

  • 返回year的年歷多行字符串。
>>>import calendar
>>>print(calendar.calendar(2020))
                                 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
27 28 29 30 31            24 25 26 27 28 29         23 24 25 26 27 28 29
                                                   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)firstweekday()

  • 返回每周的起始日期。
  • 默認為0,星期一。
>>>import calendar
>>>calendar.firstweekday()
0

3)isleap(year)

  • 判斷year是不是閏年。
>>>import calendar
>>>calendar.isleap(2020)
True

4)leapdays(year1,year2)

  • 判斷兩年之間的閏年總數(shù)。
>>>import calendar
>>>calendar.leapdays(1960,2020)
15

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

  • 返回year年的month月歷。
>>>import calendar
>>>print(calendar.month(2020,3))
    March 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 31

6)monthcalendar(year,month)

  • 返回月歷的數(shù)字矩陣。
>>>import calendar
>>>monthcalendar(2020,3)
[[0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0]]

7)monthrange(year,month)

  • 返回year年month年的第一天是星期幾。
  • 返回year年month年一共有多少天。
>>>import calendar
>>>calendar.monthrange(2020,3)
(6, 31)

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

  • 相當(dāng)于print(calendar.calendar())。

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

  • 相當(dāng)于print(calendar.calendar())

10)setfirstweekday(weekday)

  • 設(shè)置每周的起始日期。
>>>import calendar
>>>calendar.setfirstweekday(5)
>>>calendar.firstweekday()
5

11)timegm(tupletime)

  • 接受一個時間元祖,返回時間戳。
>>>import calendar,time
>>>calendar.timegm(time.gmtime(time.time()))
1581165667

12)calendar.weekday(year,month,day)

  • 返回特定日期是星期幾。
>>>import calendar
>>>calendar.weekday(2020,4,24)
4

參考資料



本文作者:大師兄(superkmi)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容