2015-09-07 84 views
0

我知道有一些關於在Python和Python中使用timedelta對象的文章,doc很清晰,足以理解所有的東西。但我無法弄清楚一件事。讓我們假設我們有兩個日期:Python中的Timedeltas

t1 = 'Fri 11 Feb 2078 00:05:21 +0400' 
t2 = 'Mon 29 Dec 2064 03:33:48 -1100' 

我分析這兩個t1和使用下面的代碼,以查找在幾秒鐘內它們之間的差別t2

def offset(arg): 
    return timedelta(hours = arg/100, minutes = arg % 100) 

def normalize(time, offset, sign): 
    return time+offset if sign == '-' else time-offset 

def main(): 
    t1offset = offset(int(t1[-5:])) 
    t2offset = offset(int(t2[-5:])) 

    t1 = normalize(datetime.strptime(t1[:-6], 
        "%a %d %b %Y %H:%M:%S"), t1offset, t1[-5]) 
    t2 = normalize(datetime.strptime(t2[:-6], 
        "%a %d %b %Y %H:%M:%S"), t2offset, t2[-5]) 

    if t1>t2: 
     print (t1-t2).total_seconds() 
    elif t2>t1: 
     print (t2-t1).total_seconds() 
    else: 
     print 0 

正確的答案是|t1-t2| = 413962293,而我的結果是414041493。這相差79200秒 - > 22小時。我究竟做錯了什麼?我跳過了什麼,或者我應該考慮如何解決這個問題?

+0

誰投它關閉,這是完全有足夠的代碼可以輕鬆地重現該問題有效的問題。 – Andrey

+0

@Andrey,但它不是重現問題的最小*代碼(請參見[mcve]),因爲OP未能執行基本的二進制搜索調試。 – jonrsharpe

+0

@jonrsharpe代碼不是絕對的小,但足夠小,不完美,但很好理解這個問題。這個問題還不夠嚴重,不能關閉。 – Andrey

回答

0

你把偏移的符號放到offset函數中。

'Fri 11 Feb 2078 00:05:21 +0400'[-5:] == '+0400' 

我認爲它應該是唯一的數字:

'Fri 11 Feb 2078 00:05:21 +0400'[-4:] == '0400' 

這樣你的偏移具有負值,並在標準化功能,您再次申請的符號。試試這個:

def main(): 
    t1offset = offset(int(t1[-4:])) 
    t2offset = offset(int(t2[-4:])) 

    t1 = normalize(datetime.strptime(t1[:-6], 
      "%a %d %b %Y %H:%M:%S"), t1offset, t1[-5]) 
    t2 = normalize(datetime.strptime(t2[:-6], 
        "%a %d %b %Y %H:%M:%S"), t2offset, t2[-5]) 

    if t1>t2: 
     print (t1-t2).total_seconds() 
    elif t2>t1: 
     print (t2-t1).total_seconds() 
    else: 
     print 0 

但是,你真的不應該解析字符串時間戳這樣,使用硬編碼字符串的索引。

+0

hege_hegedus,你的回答足以幫助我解決問題。我只是跳過了,我正在使用正常化函數的標誌:) – hebius

+0

@hebius我很高興幫助,並且很高興你的代碼正常工作。如果您沒有進一步的問題,請您接受此答案嗎? –

+0

完成男人:)還有一次thanx爲你提供幫助:) – hebius

-1

這不是解析與日期時區最好的方式,但如果你要這樣說那是你的錯:

def normalize(time, offset, sign): 
    return time+offset if sign == '+' else time-offset 
           ^

正常化應該是周圍的其他方式。

如果您正在使用Python 3+(你應該),你可以這樣做:

datetime.strptime(t1, "%a %d %b %Y %H:%M:%S %z") 

時區符並不在Python 2.x的工作

或者使用dateutils LIB:

import dateutil 
dateutil.parser.parse('Fri 11 Feb 2078 00:05:21 +0400') 

編輯:更好的方式來做它原來的方式是完全放棄標誌比較,並依靠解析麻木的跡象呃:

def offset(arg): 
    return -timedelta(hours = arg/100, minutes = arg % 100) 

def normalize(time, offset): 
    return time+offset 
0

時間格式類似於the date/time format used in emails。你可以使用email模塊來解析它:

>>> from email.utils import parsedate_tz, mktime_tz 
>>> ts1 = mktime_tz(parsedate_tz('Fri 11 Feb 2078 00:05:21 +0400')) 
>>> ts2 = mktime_tz(parsedate_tz('Mon 29 Dec 2064 03:33:48 -1100')) 
>>> ts1 - ts2 
413962293