2

次のように表示される時間が1つあります。

2012-11-12 15:16:08.648521

そして別の時間は次のように表示されます:

14:44:02 Mon Nov 12 2012

2 番目の時間形式を最初の時間形式の形式に変換する方法はありますか (例: 14:44:02 Mon Nov 12 2012 は 2012-11-12 14:44:02.????? になります)? 正しいファイルを取得していることを確認するために、2 番目の日付 (ログから取得した日付) を他の日付と比較する必要があります。

4

2 に答える 2

6

datetime.datetime.strptimeを見てください。

各形式の形式仕様を記述し、両方の値をdatetimeオブジェクトに変換して比較するだけです。(ある文字列形式を別の文字列形式に変換して文字列を比較することもできますが、以下で説明するように、それはアイデアとしては適切ではありません。)

例えば:

>>> import datetime
>>> fmt1 = '%Y-%m-%d %H:%M:%S.%f'
>>> fmt2 = '%H:%M:%S %a %b %d %Y'
>>> s1 = '2012-11-12 15:16:08.648521'
>>> s2 = '14:44:02 Mon Nov 12 2012'
>>> dt1 = datetime.datetime.strptime(s1, fmt1)
>>> dt2 = datetime.datetime.strptime(s2, fmt2)
>>> cmp(dt1, dt2)
1
>>> dt1
datetime.datetime(2012, 11, 12, 15, 16, 8, 648521)
>>> dt2
datetime.datetime(2012, 11, 12, 14, 44, 2)

時間形式の 1 つにはマイクロ秒が含まれ、もう 1 つには含まれていないことに注意してください。つまり、最初の形式が 2 番目のマーク (で終わる) に正確にある場合にのみ、実際には等しくなります.000000。それに対処する方法は、何をしようとしているのかによって異なります。

たとえば、最も近い秒に丸めたい場合は、次のようにすることができます。

dt1 = datetime.datetime(dt1.year, dt1.month, dt1.day, 
                        dt1.hour, dt1.minute, 
                        dt1.second + (1 if dt1.microsecond >= 500000 else 0), 0)

または、特定のデルタ範囲内で等しいかどうかを確認する場合は、次のようにします。

abs(dt2 - dt1) < datetime.timedelta(0, 1)

遭遇する可能性のあるもう 1 つの問題は、タイムゾーンです。これらの日付の 1 つがローカルで、もう 1 つが GMT である場合、解析後にどちらか一方を変換する必要があります。

元の質問は、ある形式を別の形式に変換する方法を尋ねています。これを行ってから文字列として比較することもできますが、実際のdatetime値として比較する方がはるかに優れています。1 つには、両方を 2 番目の形式に変換すると、文字列として適切に比較することさえできません ( 23 時間後14:44:02 Mon Nov 12 2012よりも短いです)。15:44:02 Sun Nov 11 2012また、マイクロ秒、タイム ゾーンなどの処理がより複雑になります。しかし、あなたが本当にそれをしたいのであればstrftime、の反対の機能strptimeです:

>>> datetime.datetime.strftime(dt2, fmt1)
'2012-11-12 14:44:02.00000'
于 2012-11-12T20:21:44.760 に答える
1

試す

datetime.strptime("14:44:02 Mon Nov 12 2012", "%H:%M:%S %a %m %d %Y").strftime("%Y-%m-%d %H:%M:%S.%f")
于 2012-11-12T20:25:22.880 に答える