1. 日期的迭代
使用一個生成器來為日期迭代創建一個同內置的 range() 函數一樣的函數:以6小時為步長來進行規定范圍內日期的迭代生成
>>> from datetime import date,datetime ,timedelta
>>> def date_range(start,stop,step): ... while start < stop : ... yield start ... start += step ... >>> for d in date_range(datetime(2012,9,1),datetime(2012,10,1),timedelta(hours=6)): ... print d ... 2012-09-01 00:00:00 2012-09-01 06:00:00 ... 2012-09-30 06:00:00 2012-09-30 12:00:00 2012-09-30 18:00:00 >>>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
2. 字符串轉換為日期
如果應用程序接受字符串格式的輸入,但是你想將它們轉換為 datetime 對象以便在上面執行非字符串操作要怎么去實現呢?
使用Python的標准模塊 datetime 可以很容易的解決這個問題。比如:
>>> from datetime import datetime >>> text = '2016-12-12' >>> y = datetime.strptime(text, '%Y-%m-%d') >>> z = datetime.now() >>> diff = z - y >>> diff datetime.timedelta(253, 786, 548284) >>>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
datetime.strptime() 方法支持很多的格式化代碼, 比如 %Y 代表4位數年份, %m 代表兩
位數月份。 還有一點值得注意的是這些格式化占位符也可以反過來使用,將日期輸出為
指定的格式字符串形式。
比如,假設你的代碼中生成了一個 datetime 對象, 你想將它格式化為漂亮易讀形式后放
在自動生成的信件或者報告的頂部:
>>> z datetime.datetime(2012, 9, 23, 21, 37, 4, 177393) >>> nice_z = datetime.strftime(z, '%A %B %d, %Y') >>> nice_z 'Sunday September 23, 2012' >>>
- 1
- 2
- 3
- 4
- 5
- 6
如果你已經知道日期格式是 YYYY-MM-DD ,你可以像下面這樣實現一個解析函數,性能比上邊的程序要高出很多:
from datetime import datetime
def parse_ymd(s):
year_s, mon_s, day_s = s.split(‘-‘)
return datetime(int(year_s), int(mon_s), int(day_s))
實際測試中,這個函數比 datetime.strptime() 快7倍多。 如果你要處理大量的涉及到日期的數據的話,那么最好考慮下這個方案!
3. 結合時區的日期操作
對幾乎所有涉及到時區的問題,你都應該使用 pytz 模塊。這個包提供了Olson時區數據庫, 它是時區信息的事實上的標准,在很多語言和操作系統里面都可以找到。
pytz 模塊一個主要用途是將 datetime 庫創建的簡單日期對象本地化。 比如,下面如何
表示一個芝加哥時間的示例:
>>> from datetime import datetime >>> from pytz import timezone >>> d = datetime(2012, 12, 21, 9, 30, 0) >>> print(d) 2012-12-21 09:30:00 >>> >>> # Localize the date for Chicago >>> central = timezone('US/Central') >>> loc_d = central.localize(d) >>> print(loc_d) 2012-12-21 09:30:00-06:00 >>>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
一旦日期被本地化了, 它就可以轉換為其他時區的時間了。 為了得到班加羅爾對應的時間,你可以這樣做:
>>> # Convert to Bangalore time >>> bang_d = loc_d.astimezone(timezone('Asia/Kolkata')) >>> print(bang_d) 2012-12-21 21:00:00+05:30 >>>
- 1
- 2
- 3
- 4
- 5
為了不讓你被這些東東弄的暈頭轉向,處理本地化日期的通常的策略先將所有日期轉換為
UTC時間, 並用它來執行所有的中間存儲和操作。比如:
>>> print(loc_d) 2013-03-10 01:45:00-06:00 >>> utc_d = loc_d.astimezone(pytz.utc) >>> print(utc_d) 2013-03-10 07:45:00+00:00 >>>