2012-02-29 17 views
2

日付文字列をPythonの日付に変換するメソッドを記述しました。外部メソッドから日付を取得すると、ミリ秒精度が失われますが、メソッド内でキャストを実行すると精度は保持されます。誰かが私にここで何が問題なのかを教えてもらえますか?どうもありがとう!条件式が-1と評価された場合にブロックが実行される場合の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の場合は2回、local_dateの場合は1回とすることで、異なる結果が得られます。

は、私がお勧めします:

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

恐ろしいです。ありがとう!私はかなり新しいPythonです。これが壊れることは分かりませんでした。 Btw、私の '' date_string.find( 'Z') 'の代わりに' date_string.count( 'Z') 'を使用しました。 – Jay

+1

@Jay:文字列の最後に存在する*と*の位置を調べる 'date_string.endswith( 'Z')'がさらに良いでしょう。また、 'date_string = date_string [: - 1]'は最後の文字を切り詰めるのに十分です。 –

+0

提案が実行されました。グレッグありがとう! – Jay

関連する問題