2012-02-29 106 views
1

我已經創建日期時間對象從中我減去13天如下:Python的日期時間中減去日期古怪

(date.today()-timedelta(days=13)).strftime('%Y-%m-%d') 

當我在上午6點和上午08點30分執行該代碼時發生不協調。在上午6時,得到的字符串返回爲(如果今天是2012-02-29):

2012-02-15

這是目前的前14天!但是,運行在8:30 AM同一行,得到的字符串返回爲:

2012-02-16

然後正確。到目前爲止,我還沒有弄清楚這段時間之間的區別。如果這很重要,我使用時區天真的日期時間對象。我想知道結果字符串日期中可能導致此更改的原因。

非常感謝。

編輯:(基於以下eumiro的建議)

datetime.datetime.now()返回:

>>> datetime.datetime(2012, 2, 29, 10, 46, 20, 659862) 

而時區爲歐洲/維也納的服務器上,並在Django應用程序運行代碼行。

我也嘗試運行的類似線到你的要求之一:

(pytz.timezone(settings.TIME_ZONE).localize(datetime.now(), is_dst=True) - \ 
    timedelta(days=13)).strftime('%Y-%m-%d') 

但具有相同的結果...這就是爲什麼我覺得我不認爲這有很大也與時區做。但同時也不確定在哪裏尋找。

回答

0

你住在美國的某個地方?這是時區距UTC後6-8小時的地方,這是UTC午夜時間。

datetime.datetime.now()返回什麼?

如果你想獲得真正的本地時間,使用這個(你的時區替換"America/New_York"):

from datetime import datetime, timedelta 
import pytz 

now = datetime.datetime.now(pytz.timezone("America/New_York")) 
dt = (now - timedelta(days=13)).strftime('%Y-%m-%d') 

,它應該從午夜返回相同的正確的值,直到午夜。

+0

datetime.datetime.now()返回: datetime.datetime(2012,2,29,10,46,20,659862) 而時區爲歐洲/維也納在服務器上和在運行該應用的django代碼行。 我也嘗試運行一個類似的線,你建議的: (pytz.timezone(settings.TIME_ZONE).localize(datetime。現在(),is_dst = True)-timedelta(days = 13))。strftime('%Y-%m-%d') 但是結果相同......這就是爲什麼我很困惑。難道是上面的行中的is_dst = True?感謝您的答覆。 – Edvinas 2012-02-29 09:47:11

+0

奧地利的DST問題始終在UTC以外的最多兩個小時內,所以這與美國明顯的時區(6-8小時)不成問題。 – eumiro 2012-02-29 09:53:03

0

不幸的是DST在Python中的支持很差。

即使pytz也不完美,但可以與黑客合作。

您必須決定從10日,1時,2日曆或48小時或172800秒減去2天的含義。