我有一个程序以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上运行。
答案 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中的日期相同。所以你去了。格式: