僅以此篇記錄一下個人常用的 Python 處理日期的庫與函數,主要涉及的類庫有 Python 自帶的 datetime, time 和 calendar,以及第三方的 dateutil。說到日期處理基本上要覆蓋的概念有 date, time, datetime, timezone, calendar, 時間的比較與差值,解析與格式化顯示等。
在 datetime 模塊中類之間的繼承關系如下:
object
├── date
│ └── datetime
├── time
├── timedelta
└── tzinfo
└── timezone
我們著重體驗一下前面粗體顯示的 datetime, date, time, timedelta 對象, timezone 也不是不重要,有時候也可能只需要處理本地時間。
datetime, date, time 實例的創建
可以使用它們各自的構造函數,提供必要的參數來創建相應的實例,下面是它們的構造函數
1
2
3
4
5
6
7
8
|
datetime: def __new__( cls , year, month = None , day = None , hour = 0 , minute = 0 , second = 0 , microsecond = 0 , tzinfo = None , * , fold = 0 ) date: def __new__( cls , year, month = None , day = None ) time: def __new__( cls , hour = 0 , minute = 0 , second = 0 , microsecond = 0 , tzinfo = None , * , fold = 0 ) |
比如
1
2
3
|
from datetime import datetime, date, time, timedelta today = date( 2019 , 4 , 24 ) # 2019-04-24 |
獲得當前日期或時間
1
2
3
4
5
6
7
8
9
|
date.today() #2019-04-24 datetime.now() # 2019-04-24 21:41:40.226300 datetime.today() # 2019-04-24 21:41:50.336293 datetime.today().date() #2019-04-24 datetime.today().time() #21:41:50.336303 datetime.now().date() datetime.now().time() |
從語義上應該調用 date.today()
和 datetime.now()
,datetime.today()
只是 datetime 繼承自 date 的函數。
time 沒有 today()
或 now()
方法,所以只有通過 datetime.now()
來得到相應的 time, datetime 兼具 date 與 time 信息,所以總是可以經由 datetime 來獲得相應的 date 和 time。
解析字符串獲得實例
1
2
3
4
|
date.fromisoformat( '2019-04-24' ) # 2019-04-24 datetime.fromisoformat( '2019-04-24T13:12:23' ) # 2019-04-24 13:12:23 datetime.strptime( '04/24/2019' , '%m/%d/%Y' ) # 2019-04-24 00:00:00 time.fromisoformat( '12:12:24+06:00' ) #12:12:24+06:00 |
datetime, date 和 time 都有 fromisoformat()
方法,就是要了解它們各自的 ISO 表示格式。能指定格式來解析字符串只有 datetime 有 strptime()
方法,因為有了 datetime
也就有了相應的 date 與 time
date, datetime 與 time 相應的 ISO 格式如下
- date ISO format: YYYY-MM-DD
- datetime ISO format: YYYY-MM-DD[*HH[:MM[:SS[.fff[fff]]]][+HH:MM[:SS[.ffffff]]]]
- time ISO format: HH[:MM[:SS[.fff[fff]]]][+HH:MM[:SS[.ffffff]]]
能自由解析字符串的就是 datetime.strptime(str, fmt)
,Python 借鑒了標準 C 的日期格式定義字符串,見 strftime() and strptime() Behavior. 后面的 strftime() 函數也要用到相同的格式定義法。
注:strftime() 和 strptime() 中的 f 和 p 分別對應著 format 和 parse 的首字母。
基于 Timestamp 來創建實例
Python 本身沒有 Timestamp 這么一個類型,這里的 timestamp 是一個浮點數表示的
1
2
3
|
ts = datetime.today().timestamp() # 1556161777.38553 date.fromtimestamp(ts) # 2019-04-24 datetime.fromtimestamp(ts) # 2019-04-24 22:09:37.385530 |
time 沒有 fromtimestamp()
方法
格式化輸出
date, datetime 和 time 都有 isoformat() 和 strftime(fmt) 函數,格式字符串請參考 strftime() and strptime() Behavior。
1
2
3
4
|
date.today().strftime( '%a %b %d, %Y' ) # Wed Apr 24, 2019 datetime.today().isoformat() # 2019-04-24T22:21:38.747318 datetime.today().time().strftime( '%Y' ) # 1900 date.today().strftime( '%S' ) # 00 |
上面是幾個例子,注意在 Python 中像 time 沒有年月日信息時格式化時想要輸出年份會得到不期望的值,但不會象 Java 中那樣報錯。比如下面的 Java 代碼
1
2
3
|
DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "yyyy-MM-dd" ); LocalDate.now(). format (formatter); / / 2019 - 04 - 24 LocalTime.now(). format (formatter); / / Exception java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: YearOfEra |
由于 LocalTime.now()
沒有年月日信息,所以無法格式化為 yyyy-MM-dd
。
時間, 日期的比較與 timedelta
- date, datetime, time 都定義有 __lt__, __le__, __ne__, __gt__, __ge__, __eq__ 函數,所以兩個相同類型的實例之間是可以進行比較時間上的先后的。
- 其中的 date, datetime 還定義了 __sub__ 和 __rsub__ 函數,因此兩個 date 或兩個 datetime 實例進行相減會得到一個 timedelta 實例
- 另外, date, datetime 也定義了 __add__, __radd__ 函數,date 或 datetime 可以加減一個 timedelta 來得到一個新的實例
下面看幾個簡單的示例
1
2
3
4
5
6
7
8
9
10
|
d1 = datetime.today() # 2019-04-24 23:00:31.672769 delta = timedelta(days = 2 , weeks = 1 , seconds = - 3 ) # 8 days, 23:59:57 d2 = d1 + delta # 2019-05-03 23:00:28.672769 d3 = d1 - delta # 2019-04-15 23:00:34.672769 d2 - d1 # 8 days, 23:59:57 d2 > d1 # True d1 < d3 # False datetime.today().date() + delta) # 2019-05-02 |
注意,不同類型間不能相減,比如用 date 減去一個 datetime 就不合法了。d1 + delta, d1 - delta 和 delta + d1 都沒問題, 但是 delta - d1 就不行了。
timedelta 表示了兩個時間的差值,用它來推算另一個實例的時候不帶有日歷信息,如果想要在日歷上推演就得借助于 calendar。
不可忽略的 time 模塊
前面講到的是 datetime 模塊中的 time 類型,Python 還自帶了 time 模塊,由 import time 引入。它提供了一些很實用的功能
- time 包含了完整的如上的 datetime 信息,并不像 datetime 中的 time 不含年月日信息
- locatime(), strptime(), gmtime(), asctime(), mktime() 用以構造 time 實例
- strftime() 可用來格式化輸出
- time.time() 得到當前的 Unix 時間戳
- time.sleep(sec) 用來暫停當前線程若干秒
關于 calendar 和 dateutil 的內容有后續
以上就是python 日期處理的詳細內容,更多關于python 日期處理的資料請關注服務器之家其它相關文章!
原文鏈接:https://yanbin.blog/python-date-libraries-usages/