读取悖论时间戳字段

Read paradox timestamp field

本文关键字:字段 时间戳 读取      更新时间:2023-10-16

我正在阅读一个带有.数据库扩展。我已经成功读取了标题和记录,但我在时间戳类型上遇到了一些问题。 时间戳需要8 个字节,格式如下:

浮点数字段,其中整数部分是自 1 月以来的天数 1, 0001 和小数部分是时间 -- 表示为 一天的比例。例如,下午 6:00 将是 .75,因为它是 午夜过后的一天的 3/4。

我已经阅读了日期类型(自 0001 年 1 月 1 日以来的天数(。我知道以下两个:

1 10000101100 1100111100010110100010001100111000010010101010000000  > 14/11/2017 09:05:18
1 10000101100 1100111010011000001111011111111100101100000000000000  > 21/09/2015 15:01:39

我有以下代码:

#include <math.h>
#include <cmath>
union Converter { uint64_t i; double d; };
std::bitset<64> timestamp(0);
double intpart, fractpart;
for (int i = 0; i<end-start; i++) {
timestamp <<= 8;
timestamp ^= (unsigned char)(buffer[start+i]);
}
fractpart = modf(convert(timestamp.to_ullong()),&intpart);
unsigned long int test = (unsigned long int)intpart;
std::cout<<test;

它返回整数部分的786841003,并且该数字太大了,甚至除以 1000。

编辑:

std::cout<<std::fixed<<'n'<<convert(timestamp.to_ullong());
std::cout<<std::fixed<<'n'<<intpart;
-63578530899343.000000
-63578530899343.000000

我没有任何小数部分,我可能以错误的顺序读取字节?

阅读方式是错误的: 时间戳是 1/1/0001 的毫秒数的两倍,所以我像这样转换它:

double tmsDouble = abs(convert(timestamp.to_ullong()));
long long int tms= (long long int)tmsDouble ;
std::cout<<'n'<<((tms/(86400*1000))-719163)*86400;

我得到一个标准的纪元时间。 719163是 1/1/1970 和 1/1/0001 之间的天数。