Datetime 这是什么日期时间格式?

Datetime 这是什么日期时间格式?,datetime,format,Datetime,Format,我有一个旧数据格式的DateTime结构,我无法访问它的任何规范。有一个字段指示数据的日期时间,但它不是我能识别的任何格式。它似乎存储为32位整数,每天递增20。有人遇到过这样的事情吗 编辑: 示例:1088631936 DEC=80 34 E3 40 00 HEX=09/07/2007 编辑: 首先,抱歉耽搁了。我本来希望在周末做些事情,但没能做到 其次,这种日期格式比我最初认为的更奇怪。这似乎是某种指数或对数方法,因为日期不会以递增的速度变化 第三,我用来解释这些值的已经失效的应用程序只显示

我有一个旧数据格式的DateTime结构,我无法访问它的任何规范。有一个字段指示数据的日期时间,但它不是我能识别的任何格式。它似乎存储为32位整数,每天递增20。有人遇到过这样的事情吗

编辑:

示例:1088631936 DEC=80 34 E3 40 00 HEX=09/07/2007

编辑:

首先,抱歉耽搁了。我本来希望在周末做些事情,但没能做到

其次,这种日期格式比我最初认为的更奇怪。这似乎是某种指数或对数方法,因为日期不会以递增的速度变化

第三,我用来解释这些值的已经失效的应用程序只显示日期部分,所以我不知道时间部分是什么

示例数据: (十六进制值为大端,日期为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
0x401200000=01/03/1900
0x4013000=01/03/1900
0x4014000=01/04/1900
0x40150000=01/04/1900
0x40160000=01/04/1900
0x40170000=01/04/1900
0x40180000=01/05/1900
0x4019000=01/05/1900
0x40110000=01/05/1900
0x401B0000=01/05/1900
0x401C0000=01/06/1900
0x40140000=01/06/1900
0x40110000=01/06/1900
0x401F0000=01/06/1900
0x40200000=01/07/1900
0x40210000=01/07/1900
0x402220000=01/08/1900
0x4023000=01/08/1900
..
0x4080000=05/26/1901
0x4081000=06/27/1901
0x4082000=07/29/1901
..
0x40D00000=1944年8月11日
0x40D10000=08/29/1947

编辑:我终于弄明白了,但既然我已经放弃了悬赏积分,我会暂缓解决方案,以防有人想尝试一下


顺便说一句,这个没有时间组件,它纯粹用于存储日期。

您确定这些值对应于2007年7月9日吗

我这样问是因为1088631936是自Linux(等人)归零日期起的秒数:01/01/1970 00:00:00到06/30/2004 21:45:36

在我看来,从这个通常的零日期开始,这个值是秒是合理的


编辑:我知道这很可能不是正确的答案。这只是一种方法(一种有效的方法),但我认为还需要更多的信息(见评论)。编辑此(再次)将问题带到前面,希望其他人回答或给出想法。我:带着公平、运动和分享的精神:D

我想说vmarquez离我们很近了

以下是2009年3月21日和2009年3月22日的unix epochtime日期:

In [8]: time.strftime("%s", (2009, 3, 21, 1, 1, 0, 0,0,0))
Out[8]: '1237590060'

In [9]: time.strftime("%s", (2009, 3, 22, 1, 1, 0, 0,0,0))
Out[9]: '1237676460'
这里是十六进制:

In [10]: print("%0x %0x" % (1237590060, 1237676460))
49c4202c 49c571ac

如果只取前5位数,增长率为21。哪一种符合您的格式,neg?

一些上下文可能会有用。如果您的数据文件看起来像这个文件,从字面上或至少从象征意义上看,那么vmarquez就是钱

该引用是由可用的Bandwith Estimation tool(ABwE)生成的数据——奇怪的是,它实际上包含1088631936值以及上下文。那个例子

 date     time       abw     xtr   dbcap   avabw   avxtr  avdbcap      rtt    timestamp
06/30/04 14:43:48  1.000   0.000   1.100   1.042   0.003    1.095  384.387   1088631828
06/30/04 14:45:36  1.100   0.000   1.100   1.051   0.003    1.096  376.408   1088631936
06/30/04 14:47:23  1.000   0.000   1.100   1.043   0.003    1.097  375.196   1088632043

似乎与建议的21:45:36时间值有7小时的偏移。(可能是斯坦福本地,在夏令时运行。)

好吧,您只向我们展示了您的程序如何使用8位数字中的2位,因此我们必须假设其他6位被忽略(因为您的程序可以使用其他数字做任何它想做的事情)

因此,我们可以说输入格式是: 4000万 其中m和n是两个十六进制数字

然后,输出为: 1900年1月1日+楼层((2^(m+1)-2)+n*2^(m-3))天

说明:

  • 在每个示例中,请注意,将n增加1将使天数增加2^(m-3)
  • 请注意,每次n从F变为0时,m都会递增
  • 使用这两条规则,再利用这些数字,你可以得到上面的等式。 (除了floor,因为输出不显示小数天,所以添加了floor)


    我想你可以通过用一个2位的十六进制数H替换两个独立的十六进制变量m和n来重写它。但是,我认为这会使方程变得更难看。

    它不是整数,而是一个32位的浮点数。我还没有完全弄清楚格式,它不是IEEE

    编辑:明白了。1位符号、偏移量为0x3ff的11位指数和左侧隐含位的20位尾数。在C中,仅假设正数:

    double offset = pow(2, (i >> 20) - 0x3ff) * (((i & 0xfffff) + 0x100000) / (double) 0x100000);
    
    这将产生0x40000000=2.0,因此开始日期必须是1899年12月30日

    再次编辑:既然你很好地接受了我的回答,而且你似乎也很关心速度,我想我应该对这个问题做一点改进。您不需要实数的小数部分,因此我们可以仅使用位运算将直线转换为整数。在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
    

    你知道数据格式吗,比如相关程序的名称?对不起,你的例子对我来说没有任何意义。你说的“DEC=”和“OCT=”是什么意思?为什么它们“等于”不同的类型?DEC=十进制,OCT表示八进制。除了他用十六进制代替八进制:多大岁数?你确定这不是某种固定宽度的文本字段,可能是EBCDIC吗?你的问题提到这是一个日期