当前位置:  开发笔记 > 编程语言 > 正文

这是什么日期时间格式?

如何解决《这是什么日期时间格式?》经验,为你挑选了1个好方法。

我有一个旧数据格式的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

编辑:我终于弄明白这一点,但由于我已经放弃了赏金的积分,我会推迟解决方案以防万一有人想要试一试.

顺便说一下,没有时间组件,它纯粹是为了存储日期.



1> Mark Ransom..:

它不是整数,它是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

推荐阅读
小妖694_807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有