2012-02-29 65 views
2

我編寫了一個方法將日期字符串轉換爲python中的日期。當我從外部方法獲取日期時,毫秒精度將會丟失,而當我在該方法內執行轉換時,將保留精度。有人能告訴我這裏有什麼問題嗎?非常感謝!如果條件表達式的計算結果爲block,則爲Python

from datetime import datetime 
from pytz import timezone 

def getUTCTimeFromString(date_string): 
    #allow time with Z in it 
    if date_string: 
     if date_string.find('Z'): 
      date_string = date_string[:len(date_string)-1] 
     return datetime.strptime(date_string,"%Y-%m-%dT%H:%M:%S.%f").replace(tzinfo=timezone('UTC')) 
    return None 

def getStringFromDate(dateObject): 
    return dateObject.strftime('%Y-%m-%d %H:%M:%S.%f') 

#Method being tested 
# Input 2012-02-27T05:32:10.607Z 
def getEasternTimeFromString(date_string): 
    if date_string: 
     if date_string.find('Z'): 
      date_string = date_string[:len(date_string)-1] 
     local_date = datetime.strptime(date_string,"%Y-%m-%dT%H:%M:%S.%f").replace(tzinfo=timezone('UTC')) 
     utc_date = getUTCTimeFromString(date_string) 
     print 'utc date from external method --> '+getStringFromDate(utc_date) 
     print 'utc date calculated locally -->' +getStringFromDate(local_date) 
     return utc_date.astimezone(timezone('US/Eastern')) 
    return None 

回答

4

這就是問題所在:

if date_string.find('Z'): 
    date_string = date_string[:len(date_string)-1] 

的問題是,string.find()返回-1如果目標沒有找到。由於-1不爲零,因此if語句爲true,然後您的代碼截斷字符串的最後一個字符(無論是否爲Z)。

你正在做這個截斷兩次在utc_date的情況下和一旦在local_date的情況下,因此你的不同的結果。

我建議:

if date_string.endswith('Z'): 
    date_string = date_string[:-1] 
+0

真棒。謝謝!我對python相當陌生。沒意識到這會打破。順便說一句,我使用'date_string.count('Z')'而不是查找'date_string.find('Z')'在我的情況下工作正常。 – Jay 2012-02-29 21:50:41

+1

@Jay:更好的是'date_string.endswith('Z')',它檢查字符串末尾的存在*和*位置。而且,'date_string = date_string [: - 1]'足以截斷最後一個字符。 – 2012-02-29 21:56:23

+0

已採取和實施的建議。謝謝格雷格! – Jay 2012-02-29 22:03:36

相關問題