2016-08-15 7 views
1

私はPython時間を解析するための多くの方法を見てきました。 Using parse seems link the only method that should workWhile trying to use datetime.strptime causes an error because %z does not work with python 2.7。しかし、parse.parseを使用すると、タイムゾーンが正しく認識されません。PythonのDateutil解析バグが間違った値を返す

私はFri Nov 9 09:04:02 2012 -0500Fri Nov 9 09:04:02 2012 -0800の両方を解析し、UNIX時間で正確に同じタイムスタンプを取得します。 pythonの1352480642

  • マイバージョンdateutil 1.5

の2.7.10

  • 私のバージョンは、ここでテストを実行します私のコードです。

    #!/usr/bin/python 
    import time 
    from dateutil import parser 
    
    def get_timestamp(time_string): 
        timing = parser.parse(time_string) 
        return time.mktime(timing.timetuple()) 
    
    test_time1 = "Fri Nov 9 09:04:02 2012 -0500" 
    test_time2 = "Fri Nov 9 09:04:02 2012 -0800" 
    print get_timestamp(test_time1) 
    print get_timestamp(test_time2) 
    

    出力

    1352480642.0 
    1352480642.0 
    

    の予想される出力

    1352469842.0 
    1352480642.0 
    
  • +0

    、私は両方の行に '1352448242.0'を取得!タイムゾーンが正しく解析されていますか? –

    +0

    わかりません。私はGITログからこれらの文字列をまっすぐに引き出しています。私はPythonを解析していません。 – Whitecat

    +0

    実際は:値はPythonのバージョンによって異なります! –

    答えて

    1

    これは、あなたがいるので、言葉だけでmktime()から同じ動作が表示されますパーサとは何の関係もありませんdatetime.timetuple()にはタイムゾーンのオフセット情報がありません。mktime()localtimeの逆です。あなたはtimetuple()を呼び出す前にlocaltimeに変換することにより、これを修正することができます。これらの表現の間で変換する方法を説明しますdocumentation for time()上のチャート(python 2.x docs)があること

    from time import mktime 
    from datetime import datetime 
    from dateutil import tz 
    
    dt_base = datetime(2012, 11, 9, 9, 4, 2) 
    
    dt_est = dt_base.replace(tzinfo=tz.tzoffset('EST', -5 * 3600)) 
    dt_pst = dt_base.replace(tzinfo=tz.tzoffset('PST', -8 * 3600)) 
    
    def print_mktime(dt): 
        print(mktime(dt.timetuple())) 
    
    # Run in UTC 
    print_mktime(dt_est) # 1352469842.0 
    print_mktime(dt_pst) # 1352469842.0 
    
    # Convert to local time zone first first 
    print_mktime(dt_est.astimezone(tz.tzlocal())) # 1352469842.0 
    print_mktime(dt_pst.astimezone(tz.tzlocal())) # 1352480642.0 
    

    注:

    From      To       Use 
    --------------------------------------------------------------------------- 
    seconds since the epoch | struct_time in UTC  | gmtime() 
    seconds since the epoch | struct_time in local time | localtime() 
    struct_time in UTC  | seconds since the epoch | calendar.timegm() 
    struct_time in local time | seconds since the epoch | mktime() 
    

    マイ個人的には、解析された日付をUTCに変換することがあります。この場合、calendar.timegm()が適切な関数になります。

    Python 3で
    +0

    私は地元の時間に最初に変換する考えが好きです。しかし、私が扱っているデータには、この 'Fri Nov 9 09:04:02 2012 -0800'のような日付文字列があります。とにかく@ datetime(2012、11、9、9、4、2)を行うために各intを個別に選択せずにこれを行うことができますか? – Whitecat

    +0

    @Whitecat DST関連の問題を避けるために、localtimeではなくUTCを使うことを強くお勧めします。私はintを選ぶことに対するあなたの反対を理解していません。私は手動でdateutilパーサの出力を手動で作成して、パーサとは何の関係もないことを示しています。 'timetuple'を呼び出す前に、例のようにパーサーの出力のタイムゾーンを変更するだけです。 – Paul

    +0

    intを手動で選択することに反対する人は、そのパーサーを記述して、文字列のさまざまな部分を識別する必要があります。また、タイムゾーンごとに異なるタイムスケジュールを作成する必要がありますか?タイムゾーンは複数の異なるタイムゾーンのいずれか1つです。 – Whitecat

    関連する問題