代码之家  ›  专栏  ›  技术社区  ›  Kevin

这是什么日期时间格式?

  •  6
  • Kevin  · 技术社区  · 16 年前

    编辑:

    编辑:

    (十六进制值为大端序,日期为mm/dd/yyyy)


    0x40010000=1900年1月1日





    0x40070000=1900年1月1日









    0x40110000=1900年3月1日
    0x40120000=1900年3月1日



    0x40160000=1900年4月1日









    0x40200000=1900年7月1日

    0x40220000=1900年8月1日



    0x40810000=1901年6月27日




    5 回复  |  直到 16 年前
        1
  •  7
  •   Mark Ransom    16 年前

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

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

    double offset = pow(2, (i >> 20) - 0x3ff) * (((i & 0xfffff) + 0x100000) / (double) 0x100000);
    

    再次编辑: 既然你很友好地接受了我的答案,而且你似乎很关心速度,我想我应该把这个问题再完善一点。您不需要实数的小数部分,因此我们可以仅使用位操作将其直接转换为整数。这次在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
    
        2
  •  3
  •   vmarquez    16 年前

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

    在我看来,认为该值是自通常的零日期以来的秒数是合理的。

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

        3
  •  1
  •   Pasi Savolainen    16 年前

    以下是2009-3-21和2009-3月22日作为unix时代的日期:

    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。哪种格式适合你,是吗?

        4
  •  1
  •   Refactor    16 年前

    http://www.slac.stanford.edu/comp/net/bandwidth-tests/eventanalysis/all_100days_sep04/node1.niit.pk

    该参考是由可用带估计工具(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
    
        5
  •  0
  •   mbeckish    16 年前

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

    那么,输出为:

    说明:

    1. 在每个示例中,请注意,n加1会使天数增加2^(m-3)。
    2. 请注意,每次n从F变为0时,m都会递增。

    使用这两条规则,并玩弄数字,你就得到了上面的方程式。 (除了地板,因为输出不显示分数天数而添加了地板)。