3/10/2008 = 1822556159
2/10/2008 = 1822523391
1/10/2008 = 1822490623
30/09/2008 = 1822392319
29/09/2008 = 1822359551
这是我目前所知的所有信息。
日期增加32768,除非更改月份时增量为32768 x 2(65536)。
有没有人看过这种二进制日期格式,如何提取正确的日期?
日期的剩余部分可能是时间(小时,分钟,秒)
答案 0 :(得分:9)
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个一位是什么。
编辑:我的意思是前5位:
day_of_month = (value >> 15) & 0x1f
类似地:
year = (value >> 24) & 0xff + 1900
month = (value >> 20) & 0x0f
答案 1 :(得分: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)和几天。
最后的1s可以保留用于表示秒/毫秒。
答案 2 :(得分:2)
编辑:Alnitak对于这是一个定点二进制日期表示是正确的。然而,原理可以类似于下面描述的内容;而不是小数位,格式是固定的,较低的15位很可能是时间。如果您有任何示例,请发布它们,我们将尽力提供帮助。
ORIGINAL:这很可能是Windows OLE / COM日期格式,它使用Double来表示日期和时间。数字的整数部分用于日期,分数用于时间。它可以表示1月1日,100日和9999年12月31日之间的日期。您可以在MSDN或谷歌搜索更多信息,以获取OLE日期COM双倍。
编辑:这是使用DateTime.FromOADate的一个C# example。以下是MSDN VariantTimeToSystemTime的详细信息。
变体时间存储为8字节实数值(双精度),表示1753年1月1日到2078年12月31日(含)之间的日期。
值2.0代表1900年1月1日; 3.0代表1900年1月2日,依此类推。
将值加1会使日期增加一天。值的小数部分表示一天中的时间。因此,2.5代表1900年1月1日中午; 3.25代表上午6点。在1900年1月2日,等等。
负数表示1899年12月30日之前的日期。
这有点矛盾,因为COleDateTime文档说它支持100年1月1日,而本文档说它支持1753年1月1日。
有VB的接口(使用CDbl()和CDate()),C#(DateTime.FromOADate / ToOADate),Java(OLEDate - 看起来不赞成使用),Delphi,{{3等等。
答案 3 :(得分:0)
32768是2 ^ 15;他们在这些日子里保留了15位,我认为它不会平均分为几小时,几分钟和/或几秒钟的任何有用组合。