2012-02-29 1 views
2

Я написал метод преобразования строки даты в дату в python. Когда я получаю дату из внешнего метода, точность миллисекунды теряется, тогда как когда я выполняю литье внутри метода, точность сохраняется. Может ли кто-нибудь сообщить мне, в чем проблема? Большое спасибо!Python if block выполняется, если выражение условия оценивается до -1

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. Не понимал, что это сломается. Btw, я использовал 'date_string.count ('Z')' вместо find 'date_string.find ('Z')', который отлично работает в моем случае. – Jay

+1

@Jay: Еще лучше будет 'date_string.endswith ('Z')', который проверяет наличие * и * местоположения в конце строки. Кроме того, 'date_string = date_string [: - 1]' достаточно для усечения последнего символа. –

+0

Предложения приняты и реализованы. Спасибо, Грег! – Jay

Смежные вопросы