转换为日期和时间戳的十六进制数字

时间:2019-05-09 21:21:33

标签: sqlite timestamp unix-timestamp timestamp-with-timezone sql-timestamp

我有一个程序以BLOB格式将数据存储在SQLite数据库中。

此BLOB字段中包含的部分数据是日期和时间设置。

我正在尝试了解此日期和时间的格式。

我无权访问该程序的实际代码,只能访问SQLite数据库以观察所做的更改。

例如,如果我将程序设置为日期和时间为2019-05-09-0500PM,则十六进制代码似乎为:

25 83 F5 03 A5 D6 80

我一直在研究日期和时间设置,以查看存储在数据库中的内容,但是我无法弄清楚这是哪种时间戳。

以下是我观察到的一些示例设置,它们是我对程序中日期和时间设置所做的每次更改:

Actual date and time    HEX code
2019-05-09 - 0400 PM    25 83 F5 03 6E E8 00
2019-05-09 - 0500 PM    25 83 F5 03 A5 D6 80
2020-05-09 - 1100 PM    25 83 F5 04 EF 6D 80
2019-05-10 - 1200 AM    25 83 F6 00 00 00 00
2019-05-10 - 0300 AM    25 83 F6 00 A4 CB 80
2019-05-10 - 0400 AM    25 83 F6 00 DB BA 00
2019-05-10 - 0400 PM    25 83 F6 03 6E E8 00
2019-06-09 - 0400 PM    25 84 14 03 6E E8 00
2020-05-09 - 0400 PM    25 85 63 03 6E E8 00

有人知道这种格式是什么,如何将自己的新日期和时间写入BLOB字段?

程序在Windows 10上运行。

1 个答案:

答案 0 :(得分:1)

0x2583F503A5D680 - 0x2583F5036EE800(相隔1小时)是360万。一个小时中有3600秒,因此一个小时中有360万毫秒。那么也许时间就是毫秒数?

0x2583F6036EE800 - 0x2583F600DBBA00(相隔12小时)是43200000。这也意味着毫秒。

但是... 0x2583F6036EE800 - 0x2583F5036EE800(相隔24小时)为4294967296。但是,在24小时中有86400000毫秒。 4294967296并不能被24整除。很好奇。但是... 0x2583F6 - 0x2583F5是1,而0x036EE800 - 0x036EE800当然是0。那么看起来前三个字节是跟踪日期,后4个数字是从一天开始算起的毫秒数? 0x03A5D680为61200000,也为3600000 * 17,因此在这种情况下,对于下午5点应该是这样。我们正在做某事!

0x258563 - 0x2583F5,在2019年和2020年相隔一年的天数是366。在2020年是so年,因此它不是365是有道理的,并有助于确认有关格式的理论。

0x2583F5距离此格式的0点是2458613天。大约是6735年。 Julian Day计数器的开始日期为4713BC(或4714BC,具体取决于您使用的日历)。听起来像是一场比赛!

来自维基百科:

  

朱利安日期表示为朱利安天数,并加上小数部分

因此,这看起来像是朱利安日期的二进制编码,在一天中的时间使用毫秒。我不知道为什么作者不使用REAL值将其存储在sqlite数据库中,特别是因为那样会使sqlite的date and time functions使用它。让我们用它们来验证:

sqlite> select julianday('2019-05-09 17:00:00');
2458613.208333333

与blob中的日期相同。所以你去了。格式:

  • 3个字节来记录儒略日为一个bigendian整数。
  • 4个字节,用于记录自一天开始以来的毫秒(以bigendian整数表示)。