我覺得你可以刮掉一些方法調用,將在這一天錯誤的結果切換到夏令時或從夏令時開始。
原因是,datetime構造函數和replace()
都沒有考慮到DST更改。
例如:
>>> now = datetime(2012, 4, 1, 5, 0, 0, 0, tzinfo=pytz.timezone("Australia/Melbourne"))
>>> print now
2012-04-01 05:00:00+10:00
>>> print now.replace(hour=0)
2012-04-01 00:00:00+10:00 # wrong! midnight was at 2012-04-01 00:00:00+11:00
>>> print datetime(2012, 3, 1, 0, 0, 0, 0, tzinfo=tz)
2012-03-01 00:00:00+10:00 # wrong again!
然而,對於tz.localize()
狀態的文檔:
此方法應被用於構建localtimes,而 不是傳遞一個tzinfo參數爲日期時間的構造。
因此,你的問題就解決了,像這樣:
>>> import pytz
>>> from datetime import datetime, date, time
>>> tz = pytz.timezone("Australia/Melbourne")
>>> the_date = date(2012, 4, 1) # use date.today() here
>>> midnight_without_tzinfo = datetime.combine(the_date, time())
>>> print midnight_without_tzinfo
2012-04-01 00:00:00
>>> midnight_with_tzinfo = tz.localize(midnight_without_tzinfo)
>>> print midnight_with_tzinfo
2012-04-01 00:00:00+11:00
>>> print midnight_with_tzinfo.astimezone(pytz.utc)
2012-03-31 13:00:00+00:00
的日期不能保證1582之前,雖然。
來源
2008-12-19 18:29:13
hop
除了不想使用TZ變量來控制這個,實際上並沒有告訴我如何找到午夜,只是當前時間。 – Tom 2008-12-17 01:38:49