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

Sqlite 转换为日期和时间戳的十六进制数字,sqlite,timestamp,unix-timestamp,timestamp-with-timezone,sql-timestamp,Sqlite,Timestamp,Unix Timestamp,Timestamp With Timezone,Sql Timestamp,我有一个以BLOB格式在SQLite数据库中存储数据的程序 此BLOB字段中包含的部分数据是日期和时间设置 我正在努力理解这个日期和时间的格式 我无法访问程序的实际代码,只能访问SQLite数据库来观察所做的更改 例如,如果我将程序的日期和时间设置为2019-05-09-0500PM,十六进制代码似乎是: 25 83 F5 03 A5 D6 80 我已经使用了日期和时间设置来查看数据库中存储了什么,但我无法确定这是什么类型的时间戳 以下是我观察程序中日期和时间设置每次更改时的一些示例设置: A

我有一个以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年相隔一年的天数是366天。2020年是闰年,所以它不是365是有意义的,这有助于证实关于格式的理论

0x2583F5
是自该格式中的0点起的2458613天。大约是6735年。计数器的开始日期为公元前4713年(或公元前4714年,取决于您使用的日历)。听起来像是一场比赛

来自维基百科:

儒略日期表示为添加小数点的儒略日数

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

sqlite> select julianday('2019-05-09 17:00:00');
2458613.208333333
与blob中的日期相同。好了。格式:

  • 3字节,将儒略日记录为bigendian整数
  • 4字节,将一天开始后的毫秒记录为bigendian整数

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年相隔一年的天数是366天。2020年是闰年,所以它不是365是有意义的,这有助于证实关于格式的理论

0x2583F5
是自该格式中的0点起的2458613天。大约是6735年。计数器的开始日期为公元前4713年(或公元前4714年,取决于您使用的日历)。听起来像是一场比赛

来自维基百科:

儒略日期表示为添加小数点的儒略日数

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

sqlite> select julianday('2019-05-09 17:00:00');
2458613.208333333
与blob中的日期相同。好了。格式:

  • 3字节,将儒略日记录为bigendian整数
  • 4字节,将一天开始后的毫秒记录为bigendian整数

我怀疑前3个字节编码日期,后3个字节编码时间,但中间的一个字节可能会出现任何情况。你能包括一些AM时间戳吗?我添加了一些附加信息。谢谢。您还可以获得
2019-05-09-1159PM
2019-05-10-1200AM
的值吗?我不能给您任何分或秒,只有整小时。这就是我试图破译这个时间戳的部分原因。我希望编写一些代码来添加更精确的时间戳。我怀疑前3个字节编码日期,最后3个字节编码时间,但中间的一个可能是任意一种方式。你能包括一些AM时间戳吗?我添加了一些附加信息。谢谢。您还可以获得
2019-05-09-1159PM
2019-05-10-1200AM
的值吗?我不能给您任何分或秒,只有整小时。这就是我试图破译这个时间戳的部分原因。我希望写一些代码来添加更精确的时间戳。哇,就是这样。谢谢大家!@亚伦,我希望