如果条件表达式的计算结果为block,则为Python

问题描述:

我编写了一个方法将日期字符串转换为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 

这就是问题所在:

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