我正在解析一些非常不干净的日志,并且每个日志文件都存在一行。
我已经设法用正则表达式将它们分开,只剩下一个奇怪的类似HEX的数字和它的日志字符串。我认为类似HEX的数字中的序列是时间戳,但我无法弄清楚如何解读它。
我想知道是否有人会看到这种模式。
513328F8003D
51332900003D
5133290C003D
5133293C003D
51332945003D
5133294E003D
51332955003D
这是几秒钟之后
5134519A102B
5134519C0039
513451B0132B
513451B3102B
513451B31329
513451B3182B
513451B31A2F
在某些情况下,数字是相同的。但是在大约28000行上它只发生了几次。所以我猜测它每秒记录时间,因此在极少数情况下会在同一时间生成一个编码时间戳,如下所示:
51345D391929
51345D391929
51345D3A042B
日志文件的更新时间(上面所述的双倍时间除外)是今天早上08:45左右。
也许这是一种记录微缩时间的奇怪方式?我无法弄明白:P
答案 0 :(得分:5)
首先,让我们找一下2013-03-04 08:43 GMT + 1的时间戳:
In [25]: import pytz
In [47]: gmt1 = pytz.timezone('Etc/GMT+1')
In [48]: import datetime as DT
In [49]: date = gmt1.localize(DT.datetime(2013, 3, 4, 8, 43))
In [50]: date
Out[50]: datetime.datetime(2013, 3, 4, 8, 43, tzinfo=<StaticTzInfo 'Etc/GMT+1'>)
In [51]: import calendar
In [53]: calendar.timegm(date.utctimetuple())
Out[53]: 1362390180
In [54]: hex(calendar.timegm(date.utctimetuple()))
Out[54]: '0x51346ca4'
这与你发布的十六进制字符串有很大的相似性。
因此,如果将最后4个十六进制数字视为小数部分,则该数字可以解释为UTC时间戳:
import datetime as DT
hexstamps = '''\
513328F8003D
51332900003D
5133290C003D
5133293C003D
51332945003D
5133294E003D
51332955003D
5134519A102B
5134519C0039
513451B0132B
513451B3102B
513451B31329
513451B3182B
513451B31A2F
51345D391929
51345D391929
51345D3A042B'''
for hexstamp in hexstamps.split():
print(DT.datetime.utcfromtimestamp(float(int(hexstamp, 16))/16**4))
产生UTC日期时间:
2013-03-03 10:42:00.000931
2013-03-03 10:42:08.000931
2013-03-03 10:42:20.000931
2013-03-03 10:43:08.000931
2013-03-03 10:43:17.000931
2013-03-03 10:43:26.000931
2013-03-03 10:43:33.000931
2013-03-04 07:47:38.063156
2013-03-04 07:47:40.000870
2013-03-04 07:48:00.074875
2013-03-04 07:48:03.063156
2013-03-04 07:48:03.074844
2013-03-04 07:48:03.094406
2013-03-04 07:48:03.102280
2013-03-04 08:37:13.098282
2013-03-04 08:37:13.098282
2013-03-04 08:37:14.016281
答案 1 :(得分:3)
最左边的四个字节似乎是时间戳:
In [29]: datetime.datetime.fromtimestamp(0x5134519A)
Out[29]: datetime.datetime(2013, 3, 4, 11, 47, 38)
In [30]: datetime.datetime.fromtimestamp(0x51332955)
Out[30]: datetime.datetime(2013, 3, 3, 14, 43, 33)
最右边的两个字节的最大值是多少?如果它们不是统一0000-FFFF
,那么它不太可能仅仅是小数秒。而且它们大于0x3e8
,所以它们不能是毫秒。
答案 2 :(得分:2)
看起来它们是十六进制编码的纪元时间戳(至少前8个字符看起来就像是自纪元以来的秒数,时间戳。
lines = """513328F8003D
51332900003D
5133290C003D
5133293C003D
51332945003D
5133294E003D
51332955003D
5134519A102B
5134519C0039
513451B0132B
513451B3102B
513451B31329
513451B3182B
513451B31A2F""".split("\n")
from datetime import datetime
def convert(x):
return datetime.utcfromtimestamp( eval("0x" + x.strip()[:-4] ) )
for x in lines:
print x, convert(x)
给出....
513328F8003D 2013-03-03 10:42:00
51332900003D 2013-03-03 10:42:08
5133290C003D 2013-03-03 10:42:20
5133293C003D 2013-03-03 10:43:08
51332945003D 2013-03-03 10:43:17
5133294E003D 2013-03-03 10:43:26
51332955003D 2013-03-03 10:43:33
5134519A102B 2013-03-04 07:47:38
5134519C0039 2013-03-04 07:47:40
513451B0132B 2013-03-04 07:48:00
513451B3102B 2013-03-04 07:48:03
513451B31329 2013-03-04 07:48:03
513451B3182B 2013-03-04 07:48:03
我猜测最后四个十六进制数字对应于数据的毫秒/微秒部分,但没有准确的值进行比较,我不会猜测它们是如何编码的。如果你对秒感到满意,那么看起来这可能会起作用。
干杯,
一个。