读取悖论时间戳字段

Posted

技术标签:

【中文标题】读取悖论时间戳字段【英文标题】:Read paradox timestamp field 【发布时间】:2018-09-19 08:29:11 【问题描述】:

我正在阅读一个带有 .DB 扩展名的 paradox 文件。我已成功读取标题和记录,但时间戳类型有一些问题。 时间戳占用 8 个字节,格式如下:

浮点字段,其中整数部分是自一月以来的天数 1、0001,小数部分是时间——表示为 一天的比例。例如,下午 6:00 将是 0.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

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

【问题讨论】:

你为什么要玩这些花哨的小玩意儿。它是双精度数,使用标准方法获取双精度数的整数部分和小数部分 ***.com/questions/23993898/… 【参考方案1】:

阅读方式不对: 时间戳是从 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 之间的天数。

【讨论】:

以上是关于读取悖论时间戳字段的主要内容,如果未能解决你的问题,请参考以下文章

Presto odbc 无法读取 HIVE 中的时间戳字段

如何处理mysql中的时间戳读取问题

如何处理mysql中的时间戳读取问题

如何处理mysql中的时间戳读取问题

蜂巢时间戳不接受 Spark 时间戳类型

从具有时间戳的镶木地板蜂巢表中读取火花