4

2008 年 3 月 10 日 = 1822556159

2008 年 2 月 10 日 = 1822523391

2008 年 1 月 10 日 = 1822490623

2008 年 9 月 30 日 = 1822392319

2008 年 9 月 29 日 = 1822359551

这是我目前所知道的所有信息。

日期以 32768 递增,除非当增量为 32768 x 2 (65536) 时更改月份。

有没有人见过这种二进制日期格式,我怎样才能提取正确的日期?


日期的剩余部分可能是时间(小时、分钟、秒)

4

4 回答 4

10

2008 年 9 月 30 日

1822392319 = 0x6c9f7fff
0x6c = 108 = 2008 (based on 1900 start date)
0x9 = 9 = September
0xf7fff - take top 5 bits = 0x1e = 30

2008 年 10 月 1 日

1822490623 = 0x6ca0ffff
0x6c = 108 = 2008
0xa = 10  = October
0x0ffff  - take top 5 bits = 0x01 = 1

如果有的话,任何人都可以猜测剩余的 15 个 1 位是干什么用的。

编辑:通过获取前 5 位,我的意思是:

day_of_month = (value >> 15) & 0x1f

相似地:

year = (value >> 24) & 0xff + 1900
month = (value >> 20) & 0x0f
于 2008-11-10T11:41:31.973 回答
2

以二进制格式写下来:

a = 1822556159
1101100 1010 00011 111111111111111
b = 1822523391
1101100 1010 00010 111111111111111
c = 1822490623
1101100 1010 00001 111111111111111
d = 1822392319    
1101100 1001 11110 111111111111111

其中 1101100 是 108,正如 Alnitak 所说,其余的是月份(1010 或 1001)和天。

最后的 1 可以保留用于表示秒/毫秒。

于 2008-11-10T11:43:48.833 回答
2

编辑:Alnitak 关于这是一个定点二进制日期表示是正确的。但是,这些原理可能与下面描述的相似;格式是固定的,而不是小数位,低 15 位很可能是时间。如果您有任何示例,请发布它们,我们将尽力提供帮助。

ORIGINAL:这很可能是 Windows OLE/COM 日期格式,它使用 Double 来表示日期和时间。数字的整数部分用于日期,小数部分用于时间。它可以表示 100 年 1 月 1 日和 9999 年 12 月 31 日之间的日期。您可以在MSDN或 google 上找到有关 OLE date COM double 的更多信息。

编辑:这是一个使用 DateTime.FromOADate的C# 示例。这是MSDN VariantTimeToSystemTime的更多细节。

变体时间存储为 8 字节实数值(双精度),表示 1753 年 1 月 1 日和 2078 年 12 月 31 日之间的日期,包括 1753 年 1 月 1 日和 2078 年 12 月 31 日之间的日期。

值 2.0 代表 1900 年 1 月 1 日;3.0 代表 1900 年 1 月 2 日,以此类推。

将值加 1 会使日期增加一天。该值的小数部分表示一天中的时间。因此,2.5 代表 1900 年 1 月 1 日中午;3.25 表示 1900 年 1 月 2 日上午 6:00,依此类推。

负数表示 1899 年 12 月 30 日之前的日期。

这有点矛盾,因为COleDateTime文档说它支持 100 年 1 月 1 日,而该文档说它支持 1753 年 1 月 1 日。

有用于 VB(使用 CDbl() 和 CDate())、C#(DateTime.FromOADate/ToOADate)、Java(OLEDate - 虽然看起来已弃用)、DelphiPython等的接口。

于 2008-11-10T12:01:31.013 回答
0

32768 是 2^15;他们为这些天保留了 15 位,我认为这不会均匀地划分为小时、分钟和/或秒的任何有用组合。

于 2008-11-10T11:47:31.883 回答