2011-02-03 8 views
2

6つの16進オクテットで構成された日付タイムスタンプをPythonで変換する必要があり、簡単な方法が見つからないようです。私はいくつかのアンチウイルスログからいくつかのエントリを解析しており、日付の時間値を正規の日付のようなものに変換する必要があります。Pythonを使用して6つの16進オクテットのdatetimeスタンプを変換する

例えば

:タイムスタンプは6進数のオクテットで構成されてい

:200A13080122これは私が仕事をしなければならないフォーマットである「2002年11月19日、午前8時01分34秒AM」

に変換する必要があります。彼らは、次のように表す: 最初のオクテット:月、1月= 0 第三オクテット:デーは 第四オクテット:時間 フィフスオクテット:ミニッツ 第六オクテット:たとえば第二 、200A13080122が表す1970 第2オクテット以降の年の数を2002年11月19日8:01:34 AM。

あなたは「通常の日のようなもの」に変換する必要があると言うので、私はそれをこのように表示するの自由を取る

+0

すべての偉大な答えのおかげで –

答えて

2
import binascii, calendar 
Y,M,D,h,m,s = map(ord, binascii.a2b_hex("200A13080122")) 
ampm = "AM" 
if h >= 12: 
    h = h-12 
    ampm = "PM" 
if h == 0: 
    h = 12 
print "%s %d, %d, %d:%d:%d %s" % (calendar.month_name[M+1], D, 1970+Y, 
            h, m, s, ampm) 
+0

偉大な答えは、ちょうど時、分、秒にゼロパディングを追加します。 –

0
import datetime 
def h(i): 
    return int(i,16) 
s = '200A13080122' 
date = datetime.datetime(h(s[0:2]) + 1970, h(s[2:4]) + 1, h(s[4:6]), h(s[6:8]), h(s[8:10]), h(s[10:12])) 

、任意の助けに感謝...

+0

ああ、誰も私のh(i)機能に気付きませんでした。新しいユーザーを歓迎し、別の "日時"に "戻る"ように促しています... – Benjamin

0
import datetime 
dt = "200A13080122" 
y, M, d, h, m, s = (int(o[0]+o[1], 16) for o in zip(dt[::2],dt[1::2])) 
date = datetime.datetime(y+1970, M+1, d, h, m, s) 
print date.strftime("%B %d, %Y, %I:%M:%S %p") 
+0

あなたは2つの変数 'm'を持っています。 –

+0

私はそれにも気づいた。なぜ私が11月の代わりに2月になっているのか不思議でした。ダー。 –

+0

ありがとうございました –

0
import time 
ts = 0x200A13080122 
struct_time = ((ts >> 40) + 1970, (ts >> 32 & 0xFF) + 1, ts >> 24 & 0xFF, ts >> 16 & 0xFF, ts >> 8 & 0xFF, ts & 0xFF, 0, 0, 0) 
print time.strftime("%B %d, %Y, %I:%M:%S %p", struct_time) 
# November 19, 2002, 08:01:34 AM 

各オクテットを取得するには、より良い方法があるかもしれません。

関連する問題