gpt4 book ai didi

datetime - 这是什么日期时间格式?

转载 作者:行者123 更新时间:2023-12-02 22:16:06 25 4
gpt4 key购买 nike

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

编辑:

示例:1088631936 十进制 = 80 34 E3 40 00 00 00 00 十六进制 = 09/07/2007

编辑:

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

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

第三,我用于解释这些值的已失效应用程序仅显示日期部分,因此我不知道时间部分是什么。

示例数据:(十六进制值是大尾数,日期是 mm/dd/yyyy)

0x40000000 = 1900年1月1日
0x40010000 = 1900年1月1日
0x40020000 = 1900年1月1日
0x40030000 = 1900年1月1日
0x40040000 = 1900年1月1日
0x40050000 = 1900年1月1日
0x40060000 = 1900年1月1日
0x40070000 = 1900年1月1日
0x40080000 = 1900年1月2日
0x40090000 = 1900年1月2日
0x400A0000 = 1900年1月2日
0x400B0000 = 1900年1月2日
0x400C0000 = 1900年1月2日
0x400D0000 = 1900年1月2日
0x400E0000 = 1900年1月2日
0x400F0000 = 1900年1月2日
0x40100000 = 1900年1月3日
0x40110000 = 1900年1月3日
0x40120000 = 1900年1月3日
0x40130000 = 1900年1月3日
0x40140000 = 1900年1月4日
0x40150000 = 1900年1月4日
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 = 1900年1月6日
0x401D0000 = 1900 年 1 月 6 日
0x401E0000 = 1900年1月6日
0x401F0000 = 1900年1月6日
0x40200000 = 1900年1月7日
0x40210000 = 1900年1月7日
0x40220000 = 1900年1月8日
0x40230000 = 1900年1月8日
....
0x40800000 = 1901年5月26日
0x40810000 = 1901年6月27日
0x40820000 = 1901年7月29日
....
0x40D00000 = 1944年8月11日
0x40D10000 = 1947 年 8 月 29 日

编辑:我终于弄清楚了这一点,但由于我已经放弃了赏金积分,所以我将推迟解决方案,以防有人想尝试一下。

顺便说一句,这没有时间成分,它纯粹是为了存储日期。

最佳答案

它不是整数,而是一个 32 位 float 。我还没有完全弄清楚格式,它不是 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

关于datetime - 这是什么日期时间格式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/668048/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com