我有一个旧数据格式的DateTime结构,我无权访问任何规范.有一个字段指示数据的日期时间,但它不是我识别的任何格式.它似乎存储为32位整数,每天递增20.有没有人遇到这样的事情?
编辑:
示例:1088631936 DEC = 80 34 E3 40 00 00 00 00 HEX = 09/07/2007
编辑:
首先,抱歉延误.我原本希望在周末做些什么,但是无法做到.
其次,这种日期格式比我最初想象的更奇怪.它似乎是某种指数或对数方法,因为日期不会以增加的速率变化.
第三,我用于解释这些值的已解散的应用程序仅显示日期部分,因此我不知道时间部分是什么.
示例数据:(十六进制值为big-endian,日期为mm/dd/yyyy)
0x40000000 = 01/01/1900
0x40010000 = 01/01/1900
0x40020000 = 01/01/1900
0x40030000 = 01/01/1900
0x40040000 = 01/01/1900
0x40050000 = 01/01/1900
0x40060000 = 01/01/1900
0x40070000 = 01/01/1900
0x40080000 = 01/02/1900
0x40090000 = 01/02/1900
0x400A0000 = 01/02/1900
0x400B0000 = 01/02/1900
0x400C0000 = 01/02/1900
0x400D0000 = 01/02/1900
0x400E0000 = 01/02/1900
0x400F0000 = 01/02/1900
0x40100000 = 01/03/1900
0x40110000 = 01/03/1900
0x40120000 = 01/03/1900
0x40130000 = 01/03/1900
0x40140000 =
01/04/1900 0x40150000 = 01/04/1900
0x40160000 = 1900年1月4日
0x40170000 = 1900年1月4日
0x40180000 = 1900年1月5日
0x40190000 = 1900年1月5日
0x401A0000 = 1900年1月5日
0x401B0000 = 1900年1月5日
0x401C0000 = 01/06/1900
0x401D0000 = 01/06/1900
0x401E0000 = 01/06/1900
0x401F0000 = 01/06/1900
0x40200000 = 01/07/1900
0x40210000 = 01/07/1900
0x40220000 = 01/08/1900
0x40230000 = 01/08/1900
....
0x40800000 = 05/26/1901
0x40810000 = 06/27/1901
0x40820000 = 07/29/1901
....
0x40D00000 = 11/08/1944
0x40D10000 = 08/29/1947
编辑:我终于弄明白这一点,但由于我已经放弃了赏金的积分,我会推迟解决方案以防万一有人想要试一试.
顺便说一下,没有时间组件,它纯粹是为了存储日期.
它不是整数,它是32位浮点数.我还没有完全确定格式,它不是IEEE.
编辑:得到它.1位符号,11位指数,偏移量为0x3ff,20位尾数,左侧为隐含位.在C中,仅假设正数:
double offset = pow(2, (i >> 20) - 0x3ff) * (((i & 0xfffff) + 0x100000) / (double) 0x100000);
这会产生0x40000000 = 2.0,因此开始日期必须是12/30/1899.
再次编辑:既然你非常友好地接受了我的答案,而你似乎对速度感到担忧,我想我会稍微改进一下.您不需要实数的小数部分,因此我们可以仅使用按位运算直接转换为整数.在这次Python中,完成测试结果.我已经包含了一些中间值以提高可读性.除了没有负数的限制之外,当指数超过19时,这个版本可能会出现问题,但这应该会让你保持良好状态直到3335年.
>>> def IntFromReal32(i): exponent = (i >> 20) - 0x3ff mantissa = (i & 0xfffff) + 0x100000 return mantissa >> (20 - exponent) >>> testdata = range(0x40000000,0x40240000,0x10000) + range(0x40800000,0x40830000,0x10000) + [1088631936] >>> from datetime import date,timedelta >>> for i in testdata: print "0x%08x" % i, date(1899,12,30) + timedelta(IntFromReal32(i)) 0x40000000 1900-01-01 0x40010000 1900-01-01 0x40020000 1900-01-01 0x40030000 1900-01-01 0x40040000 1900-01-01 0x40050000 1900-01-01 0x40060000 1900-01-01 0x40070000 1900-01-01 0x40080000 1900-01-02 0x40090000 1900-01-02 0x400a0000 1900-01-02 0x400b0000 1900-01-02 0x400c0000 1900-01-02 0x400d0000 1900-01-02 0x400e0000 1900-01-02 0x400f0000 1900-01-02 0x40100000 1900-01-03 0x40110000 1900-01-03 0x40120000 1900-01-03 0x40130000 1900-01-03 0x40140000 1900-01-04 0x40150000 1900-01-04 0x40160000 1900-01-04 0x40170000 1900-01-04 0x40180000 1900-01-05 0x40190000 1900-01-05 0x401a0000 1900-01-05 0x401b0000 1900-01-05 0x401c0000 1900-01-06 0x401d0000 1900-01-06 0x401e0000 1900-01-06 0x401f0000 1900-01-06 0x40200000 1900-01-07 0x40210000 1900-01-07 0x40220000 1900-01-08 0x40230000 1900-01-08 0x40800000 1901-05-26 0x40810000 1901-06-27 0x40820000 1901-07-29 0x40e33480 2007-09-07