【问题标题】:Seen this binary date format?见过这种二进制日期格式吗?
【发布时间】:2010-09-21 14:47:54
【问题描述】:

3/10/2008 = 1822556159

2/10/2008 = 1822523391

2008 年 1 月 10 日 = 1822490623

30/09/2008 = 1822392319

29/09/2008 = 1822359551

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

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

有人见过这种二进制日期格式吗?如何提取正确的日期?


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

【问题讨论】:

  • 请也添加十六进制值,这样更容易分析。
  • 你有任何关于你在哪里遇到它的上下文吗?

标签: binary date


【解决方案1】:

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

【讨论】:

  • 0x0ffff - 取前 5 位 = 0x01 = 1 Alnitak ...您的上述陈述是什么意思?你能扩展吗?
  • 他的意思是0x0ffff的最高5位是00001。所以值的最后20位中,格式为当天使用5位,其余15位全部设置为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)和天。

末尾的 1 可以保留用于表示秒/毫秒。

【讨论】:

    【解决方案3】:

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

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

    编辑:这是一个使用 DateTime.FromOADate 的C# example。以下是来自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 代表上午 6:00 1900 年 1 月 2 日,以此类推。

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

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

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

    【讨论】:

    • 这显然是固定格式的二进制格式,而不是浮点表示
    【解决方案4】:

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

    【讨论】:

    • 如果内存服务,FAT 文件系统上的日期格式使用 15 位表示一天中的时间,这意味着它只能将时间保持到最接近的 2.5 秒...
    猜你喜欢
    • 2018-03-07
    • 2016-11-15
    • 1970-01-01
    • 1970-01-01
    • 2019-11-19
    • 2015-12-26
    • 1970-01-01
    • 2011-05-29
    • 2011-01-22
    相关资源
    最近更新 更多