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

Hex numbers that translate into date and time stamps

我有一个程序以 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。

0x2583F503A5D680 - 0x2583F5036EE800,间隔1小时,是3600000。一小时有3600秒,一小时有3600000毫秒。那么也许时间的跟踪毫秒数?

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 年相隔 1 年的天数是 366。2020 年是闰年,所以它不是 365 是有道理的,并且有助于确认关于格式的理论。

0x2583F5 在这种格式下是从 0 点开始的 2458613 天。那大约是 6735 年。 Julian Day 计数器的开始日期是 4713BC(或 4714BC,具体取决于您使用的日历)。听起来很般配!

来自维基百科:

Julian dates are expressed as a Julian day number with a decimal fraction added

所以看起来这是使用毫秒表示一天中时间的儒略日期的二进制编码。我不知道为什么作者不使用 REAL 值将它存储在 sqlite 数据库中,特别是因为这将使它可以被 sqlite 的 date and time functions 使用。让我们用它们来验证:

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

与 blob 中的同一天编号。所以你去吧。格式:

  • 3 个字节,将儒略日记录为双字节序整数。
  • 4 字节记录自一天开始以来的毫秒数,作为双字节序整数。