python 常用日期處理-- datetime 模塊的使用
僅以此篇記錄一下個(gè)人常用的 Python 處理日期的庫(kù)與函數(shù),主要涉及的類庫(kù)有 Python 自帶的 datetime, time 和 calendar,以及第三方的 dateutil。說到日期處理基本上要覆蓋的概念有 date, time, datetime, timezone, calendar, 時(shí)間的比較與差值,解析與格式化顯示等。
在 datetime 模塊中類之間的繼承關(guān)系如下:
object├── date│ └── datetime├── time├── timedelta└── tzinfo└── timezone
我們著重體驗(yàn)一下前面粗體顯示的 datetime, date, time, timedelta 對(duì)象, timezone 也不是不重要,有時(shí)候也可能只需要處理本地時(shí)間。
datetime, date, time 實(shí)例的創(chuàng)建
可以使用它們各自的構(gòu)造函數(shù),提供必要的參數(shù)來創(chuàng)建相應(yīng)的實(shí)例,下面是它們的構(gòu)造函數(shù)
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)
比如
from datetime import datetime, date, time, timedelta today = date(2019, 4, 24) # 2019-04-24
獲得當(dāng)前日期或時(shí)間
date.today() #2019-04-24datetime.now() # 2019-04-24 21:41:40.226300 datetime.today() # 2019-04-24 21:41:50.336293datetime.today().date() #2019-04-24datetime.today().time() #21:41:50.336303 datetime.now().date()datetime.now().time()
從語義上應(yīng)該調(diào)用 date.today() 和 datetime.now(),datetime.today() 只是 datetime 繼承自 date 的函數(shù)。
time 沒有 today() 或 now() 方法,所以只有通過 datetime.now() 來得到相應(yīng)的 time, datetime 兼具 date 與 time 信息,所以總是可以經(jīng)由 datetime 來獲得相應(yīng)的 date 和 time。
解析字符串獲得實(shí)例
date.fromisoformat(’2019-04-24’) # 2019-04-24datetime.fromisoformat(’2019-04-24T13:12:23’) # 2019-04-24 13:12:23datetime.strptime(’04/24/2019’, ’%m/%d/%Y’) # 2019-04-24 00:00:00time.fromisoformat(’12:12:24+06:00’) #12:12:24+06:00
datetime, date 和 time 都有 fromisoformat() 方法,就是要了解它們各自的 ISO 表示格式。能指定格式來解析字符串只有 datetime 有 strptime() 方法,因?yàn)橛辛?datetime 也就有了相應(yīng)的 date 與 time
date, datetime 與 time 相應(yīng)的 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 借鑒了標(biāo)準(zhǔn) C 的日期格式定義字符串,見 strftime() and strptime() Behavior. 后面的 strftime() 函數(shù)也要用到相同的格式定義法。
注:strftime() 和 strptime() 中的 f 和 p 分別對(duì)應(yīng)著 format 和 parse 的首字母。
基于 Timestamp 來創(chuàng)建實(shí)例
Python 本身沒有 Timestamp 這么一個(gè)類型,這里的 timestamp 是一個(gè)浮點(diǎn)數(shù)表示的
ts = datetime.today().timestamp() # 1556161777.38553date.fromtimestamp(ts) # 2019-04-24datetime.fromtimestamp(ts) # 2019-04-24 22:09:37.385530
time 沒有 fromtimestamp() 方法
格式化輸出
date, datetime 和 time 都有 isoformat() 和 strftime(fmt) 函數(shù),格式字符串請(qǐng)參考 strftime() and strptime() Behavior。
date.today().strftime(’%a %b %d, %Y’) # Wed Apr 24, 2019datetime.today().isoformat() # 2019-04-24T22:21:38.747318datetime.today().time().strftime(’%Y’) # 1900date.today().strftime(’%S’) # 00
上面是幾個(gè)例子,注意在 Python 中像 time 沒有年月日信息時(shí)格式化時(shí)想要輸出年份會(huì)得到不期望的值,但不會(huì)象 Java 中那樣報(bào)錯(cuò)。比如下面的 Java 代碼
DateTimeFormatter formatter = DateTimeFormatter.ofPattern('yyyy-MM-dd');LocalDate.now().format(formatter); //2019-04-24LocalTime.now().format(formatter); //Exception java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: YearOfEra
由于 LocalTime.now() 沒有年月日信息,所以無法格式化為 yyyy-MM-dd。
時(shí)間, 日期的比較與 timedelta
date, datetime, time 都定義有 __lt__, __le__, __ne__, __gt__, __ge__, __eq__ 函數(shù),所以兩個(gè)相同類型的實(shí)例之間是可以進(jìn)行比較時(shí)間上的先后的。 其中的 date, datetime 還定義了 __sub__ 和 __rsub__ 函數(shù),因此兩個(gè) date 或兩個(gè) datetime 實(shí)例進(jìn)行相減會(huì)得到一個(gè) timedelta 實(shí)例 另外, date, datetime 也定義了 __add__, __radd__ 函數(shù),date 或 datetime 可以加減一個(gè) timedelta 來得到一個(gè)新的實(shí)例下面看幾個(gè)簡(jiǎn)單的示例
d1 = datetime.today() # 2019-04-24 23:00:31.672769delta = timedelta(days=2, weeks=1, seconds=-3) # 8 days, 23:59:57d2 = d1 + delta # 2019-05-03 23:00:28.672769d3 = d1 - delta # 2019-04-15 23:00:34.672769 d2 - d1 # 8 days, 23:59:57d2 > d1 # Trued1 < d3 # False datetime.today().date() + delta) # 2019-05-02
注意,不同類型間不能相減,比如用 date 減去一個(gè) datetime 就不合法了。d1 + delta, d1 - delta 和 delta + d1 都沒問題, 但是 delta - d1 就不行了。
timedelta 表示了兩個(gè)時(shí)間的差值,用它來推算另一個(gè)實(shí)例的時(shí)候不帶有日歷信息,如果想要在日歷上推演就得借助于 calendar。
不可忽略的 time 模塊
前面講到的是 datetime 模塊中的 time 類型,Python 還自帶了 time 模塊,由 import time 引入。它提供了一些很實(shí)用的功能
time 包含了完整的如上的 datetime 信息,并不像 datetime 中的 time 不含年月日信息 locatime(), strptime(), gmtime(), asctime(), mktime() 用以構(gòu)造 time 實(shí)例 strftime() 可用來格式化輸出 time.time() 得到當(dāng)前的 Unix 時(shí)間戳 time.sleep(sec) 用來暫停當(dāng)前線程若干秒關(guān)于 calendar 和 dateutil 的內(nèi)容有后續(xù)
以上就是python 日期處理的詳細(xì)內(nèi)容,更多關(guān)于python 日期處理的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
1. HTML中的XML數(shù)據(jù)島記錄編輯與添加2. 利用FastReport傳遞圖片參數(shù)在報(bào)表上展示簽名信息的實(shí)現(xiàn)方法3. ASP常用日期格式化函數(shù) FormatDate()4. .NET 中配置從xml轉(zhuǎn)向json方法示例詳解5. 一文掌握在Vue3中書寫TSX的使用方法6. 以PHP代碼為實(shí)例詳解RabbitMQ消息隊(duì)列中間件的6種模式7. 推薦一個(gè)好看Table表格的css樣式代碼詳解8. chat.asp聊天程序的編寫方法9. 怎樣才能用js生成xmldom對(duì)象,并且在firefox中也實(shí)現(xiàn)xml數(shù)據(jù)島?10. 如何使用瀏覽器擴(kuò)展篡改網(wǎng)頁(yè)中的JS 文件
