首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解析8个字节到日期时间

解析8个字节到日期时间
EN

Software Engineering用户
提问于 2022-10-30 15:28:26
回答 3查看 460关注 0票数 1

我正试图解析另一个软件创建的文件,但我无法确定如何保存这个日期时间的模式。似乎没有任何一致性。

软件的编程语言是C++,所以我已经尝试了unix/epoch方法,但没有成功。也许有人确实认识到一个模式,或者可以给我一个如何处理这样一个问题的提示。

代码语言:javascript
复制
1/1/2000 12:00:00 AM    00 00 00 00 C0 D5 E1 40
1/1/2000 12:00:01 AM    C9 45 18 00 C0 D5 E1 40
1/1/2000 12:00:10 AM    D6 B9 F2 00 C0 D5 E1 40
1/1/2000 12:01:00 AM    06 5B B0 05 C0 D5 E1 40
1/1/2000 07:00:00 AM    55 55 55 55 C9 D5 E1 40
1/1/2000 07:01:00 AM    5B B0 05 5B C9 D5 E1 40

1/2/2000 07:01:00 AM    5B B0 05 5B E9 D5 E1 40
1/3/2000 07:01:00 AM    5B B0 05 5B 09 D6 E1 40
2/1/2000 07:01:00 AM    5B B0 05 5B A9 D9 E1 40 
3/1/2000 07:01:00 AM    5B B0 05 5B 49 DD E1 40

3/1/2001 07:01:00 AM    5B B0 05 5B E9 0A E2 40
3/1/2002 07:01:00 AM    5B B0 05 5B 89 38 E2 40
EN

回答 3

Software Engineering用户

回答已采纳

发布于 2022-10-31 00:18:21

这是一个"COM日期“或"OLE自动化日期”,这是Windows下相当常见的格式。它被定义为一个双精度浮点数,其值为1899年12月30日午夜以来的天数(包括小数日)。我用以下C#代码验证了这一点:

代码语言:javascript
复制
byte[] bytes = new byte[] { 0x5B, 0xB0, 0x05, 0x5B, 0xA9, 0xD9, 0xE1, 0x40 };
long asInt64 = BitConverter.ToInt64(bytes, 0);
double tr = BitConverter.Int64BitsToDouble(asInt64);
DateTime dt = DateTime.FromOADate(tr);

用于处理此类日期的C++代码内置到Windows中。我不知道你能在其他平台上用什么。

票数 5
EN

Software Engineering用户

发布于 2022-10-31 08:38:59

首先,感谢那些无缘无故决定结束这个问题的人,迫使我先给出一个答复。

这是旧的Microsoft版本用来存储日期和时间的两种格式之一。无论是1900年1月1日还是1904年1月1日,两者都将日期存储为连续数字。1904年的日期格式似乎是基于1984年MacOS内部使用的日期格式,这让您想知道有什么天才喜欢使用两种不兼容的日期格式而不愿添加一行代码。1900年1月1日的值可能被分配为1.0,这样就可以使用0.0值来表示“无日期”。从1900年1月1日到2000年1月1日有25个闰年,因为1900年是闰年。所以,天的差别是36500 + 25闰日。

该数字存储为64位双精度浮点数。2000年1月1日起为40 e1 d5 c0 00 00。有一个位符号,11位偏置指数,和一个53位尾数与前导位没有存储。所以符号= 0,有偏指数= 0x40e,尾数= 11 d5 c0 00 00,最高字节是5位。

数字1.0的有偏指数为0x3ff,因此对于32768到65535的数字,这里的数字的实际指数为0x40e-0x3ff= 15。尾数最高的16位是一天。5位= 17从0x11,8位从0xd 5= 211,3位最高位从0xc 0= 6。总计36526。所以基值1900年1月1日= 1,加上100x 365天,加上25个闰年。

1秒存储为1.0 / 86400。从1900年(2079年左右)到65536天,有37位的小数。在此之前,分辨率为2^37 / 86400,约为每秒1590728.6。

但算法简单:将日期和时间转换为1900年1月1日开始的天数,再加一个,计算结果作为64位浮点存储。若要添加一天,请添加1.0。若要添加第二个,请添加1.0 / 86400。要获得天数和秒,请用(X)表示天数,并将其余的乘以86400以获得秒。

票数 3
EN

Software Engineering用户

发布于 2022-10-30 16:14:27

您在解析日期方面遇到了挫折之一。3/1/2000是3月1日还是1月3日?日期格式不明确。通常,您可以使用以下方法之一解决此问题:

  • 问个人。他们可能知道是因为他们已经在做了。
  • 猜猜看。是的,没错。检查该文件中的日期,看看是否可以确定明确的日期。如果你看到12/4/YYYY,你可以假设这个月是第一个月。
    • 然后向更了解这个文件的人确认这一事实。
    • 同时也要寻找其他的日期格式。如果你也看到YYYY/XX/XX,你的聪明猜测可能仍然是错误的。回到第一点。

  • 向您提供此文件的人请参阅文档。

即使您使用适当的日期库,您仍然有同样的问题。您需要告诉该库正在使用哪种日期格式。

众所周知,约会是很难处理的。唯一的方法是找出所使用的日期格式,无论是猜测,与队友的沟通,或咨询文档。

如果您必须猜测,请将此猜测传达给其他队友、管理人员,或在您正在编写的代码的文档中记录下来。这将是一个很好的主意,指出这种猜测,作为一个风险,无论你正在建设。猜测错误的格式意味着日期是错误的,这可能会影响下游业务流程。

票数 1
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/441983

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档