python中經常使用的處理時間的模塊有兩個:time 模塊、datetime 模塊,time模塊是比較基礎的一個模塊,可知足對時間類型數據的基本處理;而 datetime模塊能夠看作是 對time模塊的一個高級封裝,功能更增強大,例如在時間的加減上(獲取指定時間的前(後)一天的時間,獲取指定時間的前(後)一小時的時間),使用datetime模塊,實現起來更爲方便~python
時間也是一個數據類型,這個類型中的數據通常可分爲 3類 時間形式:時間戳(timestamp),結構化時間(struct_time),格式化的時間字符串(format string)~ide
在計算機中,時間是用數字來表示的。1970年1月1日 00:00:00 UTC+00:00時區的時刻稱爲 epoch time,記爲0(1970年之前的時間timestamp爲負數),當前時間就是相對於epoch time的秒數(浮點型),即 timestamp。
獲取當前時間的時間戳:函數
>>> import time >>> time.time() 1539009280.9001613 # float 類型
結構化時間是一個 struct_time元組,其中有9個字段,具體說明以下:code
字段 | 說明 |
---|---|
tm_year | 年,例如:2018 |
tm_mon | 月,取值:1-12 |
tm_mday | 日,取值:1-31 |
tm_hour | 小時,取值:0-23 |
tm_min | 分鐘,取值:0-59 |
tm_sec | 秒,取值:0-60 |
tm_wday | 星期幾,取值:0到6 (0是週一) |
tm_yday | 一年中的第幾天,取值:1 到 366 |
tm_isdst | 標誌位,決定是否爲夏令時,取值:-1, 0, 1 |
獲取當前時間的結構化時間:orm
>>> time.localtime() time.struct_time(tm_year=2018, tm_mon=10, tm_mday=8, tm_hour=22, tm_min=59, tm_sec=12, tm_wday=0, tm_yday=281, tm_isdst=0) # time.localtime() 還能夠接收一個時間戳參數,獲取指定的時間: >>> time.localtime(10) time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=8, tm_min=0, tm_sec=10, tm_wday=3, tm_yday=1, tm_isdst=0) # Tip:因爲是東8時區因此 tm_hour 是8,而不是0~ # time.gmtime() 與 time.localtime() 做用相似,區別在於 localtime() 返回的是當前時區的時間,gmtime()返回的是格林威治時間,即 UTC 時間~ >>> time.gmtime() time.struct_time(tm_year=2018, tm_mon=10, tm_mday=8, tm_hour=15, tm_min=5, tm_sec=25, tm_wday=0, tm_yday=281, tm_isdst=0) >>> time.gmtime(10) time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=10, tm_wday=3, tm_yday=1, tm_isdst=0)
也能夠手動建立結構化時間(9個參數依次傳入,注意是以元組的方式傳入),這種方式並不經常使用:對象
>>> time.struct_time((2018,10,8,23,0,9,3,335,-1)) time.struct_time(tm_year=2018, tm_mon=10, tm_mday=8, tm_hour=23, tm_min=0, tm_sec=9, tm_wday=3, tm_yday=335, tm_isdst=-1)
格式化的時間字符串 就是使用字符串表示時間,例如:'2018-10-08 23:13:23'。ip
字符串時間的獲取:字符串
>>> time.ctime() 'Sun Oct 14 08:32:04 2018' >>> time.asctime() 'Sun Oct 14 08:32:10 2018'
結構化時間轉爲字符串時間string
>>> time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()) '2018-10-14 08:42:58' # strftime函數的第一個參數指定時間的格式,能夠根據需求而定,例如僅獲取時間年月日 >>> time.strftime('%Y%m%d', time.localtime()) '20181014'
時間的format格式以下:it
%a 本地(local)簡化星期名稱 %A 本地完整星期名稱 %b 本地簡化月份名稱 %B 本地完整月份名稱 %c 本地相應的日期和時間表示 %d 一個月中的第幾天(01-31) %H 一天中的第幾個小時(24小時制,00-23) %l 一天中的第幾個小時(12小時制,01-12) %j 一年中的第幾天(01-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 用+HHMM或者-HHMM表示距離格林威治的時區偏移(H表明十進制的小時數,M表明十進制的分鐘數) %Z 時區的名字(若是不存在爲空字符) %% %號自己 %p只有與%I配合使用纔有效果 當使用strptime()函數時,只有當在這年中的週數和天數被肯定的時候%U和%W纔會被計算
除了strftime函數,還有asctime函數能夠將結構化時間轉爲時間字符串,只是這個函數最多僅接受一個參數,沒法實現對字符串進行定製~
>>> time.asctime(time.localtime()) 'Sun Oct 14 09:16:57 2018' # 不傳參的狀況,默認傳入的就是time.localtime() >>> time.asctime() 'Sun Oct 14 09:19:09 2018' # 定製結構化時間 >>> time.asctime(time.struct_time((2000,11,30,0,0,0,3,335,-1))) 'Thu Nov 30 00:00:00 2000'
字符串時間轉爲結構化時間
# 第一個參數爲時間字符串,第二個參數指定之間格式 >>> time.strptime('2018-10-14 08:42:58', '%Y-%m-%d %H:%M:%S') time.struct_time(tm_year=2018, tm_mon=10, tm_mday=14, tm_hour=8, tm_min=42, tm_sec=58, tm_wday=6, tm_yday=287, tm_isdst=-1) >>> time.strptime('2018-10-14', '%Y-%m-%d') time.struct_time(tm_year=2018, tm_mon=10, tm_mday=14, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=6, tm_yday=287, tm_isdst=-1) # 第二個參數也能夠不指定,只是這個時候字符串的格式必須是 '%a %b %d %H:%M:%S %Y' >>> time.strptime('Sun Oct 14 09:03:46 2018') time.struct_time(tm_year=2018, tm_mon=10, tm_mday=14, tm_hour=9, tm_min=3, tm_sec=46, tm_wday=6, tm_yday=287, tm_isdst=-1) >>> time.strptime('Sun Oct 14 09:03:46 2018', '%a %b %d %H:%M:%S %Y') time.struct_time(tm_year=2018, tm_mon=10, tm_mday=14, tm_hour=9, tm_min=3, tm_sec=46, tm_wday=6, tm_yday=287, tm_isdst=-1)
時間戳轉爲結構化時間
上面提到的time.localtime(),time.gmtime()其實就是將時間戳轉爲格式化時間
# time.localtime() 能夠接受一個 int 類型 的參數,即表示時間戳 >>> time.localtime(10) time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=8, tm_min=0, tm_sec=10, tm_wday=3, tm_yday=1, tm_isdst=0) # 不傳入參數時,默認傳入的就是當前時間戳,即time.time() print(time.localtime()) print(time.localtime(time.time())) 輸出結果: time.struct_time(tm_year=2018, tm_mon=10, tm_mday=14, tm_hour=9, tm_min=34, tm_sec=13, tm_wday=6, tm_yday=287, tm_isdst=0) time.struct_time(tm_year=2018, tm_mon=10, tm_mday=14, tm_hour=9, tm_min=34, tm_sec=13, tm_wday=6, tm_yday=287, tm_isdst=0)
結構化時間轉爲時間戳
>>> >>> time.mktime(time.localtime()) 1539481022.0
注:字符串時間 和 時間戳 之間,沒法實現 直接轉換
datetime是python處理時間和日期的標準庫,功能要比 time模塊 強大,且使用起來更爲方便~
datetime模塊中定義的類
類 | 說明 |
---|---|
datetime.date | 表示日期,經常使用的屬性有:year, month和day |
datetime.time | 表示時間,經常使用屬性有:hour, minute, second, microsecond |
datetime.datetime | 表示日期時間 |
datetime.timedelta | 表示兩個date、time、datetime實例之間的時間間隔,分辨率(最小單位)可達到微秒 |
datetime.tzinfo | 時區相關信息對象的抽象基類。它們由datetime和time類使用,以提供自定義時間的而調整。 |
datetime.timezone | Python 3.2中新增的功能,實現tzinfo抽象基類的類,表示與UTC的固定偏移量 |
datetime模塊中定義的常量
常量名稱 | 說明 |
---|---|
datetime.MINYEAR | datetime.date或datetime.datetime對象所容許的年份的最小值,值爲1 |
datetime.MAXYEAR | datetime.date或datetime.datetime對象所容許的年份的最大值,只爲9999 |
這裏主要說明的是datetime模塊中datetime類~
使用datetime.datetime類獲取當前時間
>>> import datetime >>> datetime.datetime.now() datetime.datetime(2018, 10, 14, 10, 29, 55, 175498) # 指定標準時區 >>> datetime.datetime.now(datetime.timezone.utc) datetime.datetime(2018, 10, 14, 2, 30, 1, 831932, tzinfo=datetime.timezone.utc)
這裏返回的時間類型就是 datetime.datetime。datetime.datetime類 裏面封裝的方法可實現 datetime.datetime類型的時間和 上述所說的3種時間類型 之間的相互轉換~
在實例化 datetime.datetime類 過程當中,傳遞參數,來獲取指定的時間。
# 其中 year,month,day爲必須傳遞的參數 class datetime.datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None) # 示例 >>> datetime.datetime(year=2018, month=10, day=14) datetime.datetime(2018, 10, 14, 0, 0)
參數說明以下:
參數 | 取值範圍 |
---|---|
year | [MINYEAR, MAXYEAR] |
month | [1, 12] |
day | [1, 指定年份的月份中的天數] |
hour | [0, 23] |
minute | [0, 59] |
second | [0, 59] |
microsecond | 微妙,[0, 1000000] |
tzinfo | 時區,tzinfo的子類對象 |
# 從結構化時間到 datetime,便是在實例化datetime類時,指定各個參數;沒法實現從 time.struct_time 到 datetime的直接轉換~ >>> datetime.datetime(year=2018, month=10, day=14, hour=10, minute=49, second=50) datetime.datetime(2018, 10, 14, 10, 49, 50) # 從datetime到結構化時間 >>> datetime.datetime.now().timetuple() time.struct_time(tm_year=2018, tm_mon=10, tm_mday=14, tm_hour=10, tm_min=52, tm_sec=23, tm_wday=6, tm_yday=287, tm_isdst=-1)
# 從時間戳到 datetime >>> datetime.datetime.fromtimestamp(10) # 當前時區 datetime.datetime(1970, 1, 1, 8, 0, 10) >>> datetime.datetime.utcfromtimestamp(10) # 標準時區 datetime.datetime(1970, 1, 1, 0, 0, 10) # 根據當前時間戳獲取 datetime >>> datetime.datetime.fromtimestamp(time.time()) datetime.datetime(2018, 10, 14, 10, 56, 46, 302245) # 從datetime 到時間戳 >>> datetime.datetime.timestamp(datetime.datetime.now()) 1539486116.698343 >>> datetime.datetime.timestamp(datetime.datetime.now(datetime.timezone.utc)) 1539486173.079687
datetime 和時間字符串之間的轉換 與 time.strftime、time.strptime相似~
# 從 datetime 到 時間字符串 >>> dt = datetime.datetime.now() >>> dt.strftime('%Y-%m-%d %H:%M:%S') '2018-10-14 11:32:49' # 從 時間字符串 到datetime >>> datetime.datetime.strptime('2018-10-14 11:32:49', '%Y-%m-%d %H:%M:%S') datetime.datetime(2018, 10, 14, 11, 32, 49)
timedelta 類用於表示兩個時間之間的差值,能夠直接對datetime.datetime對象進行加減操做~,若使用time模塊,須要先將 字符串時間 或者 結構化時間(struct_time)轉換爲時間戳個格式,而後對該時間戳加上或者減去 n 秒,最後再將時間戳格式轉換回 字符串時間 或者 結構化時間,這樣很是的麻煩。利用 datetime 模塊提供的 timedelta 類 能夠直接對 datetime.date,datetime.time,datetime.datetime對象進行 以 天,秒、微秒、毫秒、分鐘、小時、周 爲單位的加減運算~
以下是timedelta類的inti方法:
def __init__(self, days: float = ..., seconds: float = ..., microseconds: float = ..., milliseconds: float = ..., minutes: float = ..., hours: float = ..., weeks: float = ...) -> None: ...
示例:
>>> dt = datetime.datetime.now() # 2天后的時間 >>> dt + datetime.timedelta(2) datetime.datetime(2018, 10, 16, 11, 49, 0, 699630) # 2天前的時間 >>> dt + datetime.timedelta(-2) datetime.datetime(2018, 10, 12, 11, 49, 0, 699630) # 1小時以後 >>> dt + datetime.timedelta(hours=1) datetime.datetime(2018, 10, 14, 12, 49, 0, 699630) # 一小時前 >>> dt + datetime.timedelta(hours=-1) datetime.datetime(2018, 10, 14, 10, 49, 0, 699630) # 一天一小時以後 >>> dt + datetime.timedelta(days=1, hours=1) datetime.datetime(2018, 10, 15, 12, 49, 0, 699630) # 一個半小時以後 >>> dt + datetime.timedelta(hours=1, minutes=30) datetime.datetime(2018, 10, 14, 13, 19, 0, 699630)
datetime模塊中除了datetime類,還有date,time。date和time類並不經常使用~
date 的 init 方法,其中year,month,day都是必須參數:
def __init__(self, year: int, month: int, day: int) -> None: ...
獲取 date 對象:
>>> datetime.date(year=2018, month=10, day=14) datetime.date(2018, 10, 14)
使用示例:
>>> today = datetime.date.today() >>> today datetime.date(2018, 10, 14) >>> today.year 2018 >>> today.month 10 >>> today.day 14 # 時間戳轉爲date >>> datetime.date.fromtimestamp(time.time()) datetime.date(2018, 10, 14) # date轉爲結構化時間 >>> today.timetuple() time.struct_time(tm_year=2018, tm_mon=10, tm_mday=14, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=6, tm_yday=287, tm_isdst=-1)
time 的 init 方法,其中 hour 爲必須參數:
def __init__(self, hour: int = ..., minute: int = ..., second: int = ..., microsecond: int = ..., tzinfo: Optional[tzinfo] = ...) -> None: ...
參數說明:
hour # 小時,取值範圍:[0, 23]
minute # 分鐘,取值範圍:[0, 59]
second # 秒,取值範圍:[0, 59]
microsecond # 微秒,取值範圍:[0, 1000000]
tzinfo # tzinfo的子類對象,如timezone類的實例
獲取 time 對象:
>>> datetime.time(hour=23, minute=2, second=16) datetime.time(23, 2, 16)
簡單示例:
>>> dt = datetime.time(hour=23, minute=2, second=16) >>> dt datetime.time(23, 2, 16) >>> dt.hour 23 >>> dt.minute 2 >>> dt.second 16 >>> dt.microsecond 0 >>> dt.tzinfo # 按照指定的格式轉爲字符串 >>> dt.strftime('%H%M%S') '230216'
.................^_^