读取悖论时间戳字段
Read paradox timestamp field
我正在阅读一个带有.数据库扩展。我已经成功读取了标题和记录,但我在时间戳类型上遇到了一些问题。 时间戳需要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 之间的天数。
相关文章:
- 将结构字段的类型展开为可变模板参数
- C++:floor unix时间戳到UTC月份
- 如何在c++中录制具有精确帧时间戳的视频
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 将位字段导出到数组
- 为了方便起见,我应该避免公开私有字段变量吗
- 当字段可以为null时,如何使用C++接口在Avro中写入数据
- 在java中读取c++字节的位字段
- 链接器找不到在虚拟类 c++ 中访问的静态字段的符号
- Google protobuf 时间戳未声明标识符,在 Windows 上具有C++
- 读取悖论时间戳字段
- 类类型的静态constexpr字段在g++中给出链接时间错误
- 如何将time_t插入PostgreSQL时间戳字段
- 如何检查套接字在一段时间内未收到
- Zmq 套接字在一段时间后不工作
- 读取Windows套接字上的SIO_KEEPALIVE_VALS字段(用于保持空闲和间隔时间)
- 如何用O(n)个时间和O(1)个空间对n个对象的群进行排序.每个对象有两个字段:int和string
- 套接字将在一段时间后死亡而不能重新连接
- C++基于 TCP 的服务器套接字需要一段时间才能返回 10054 错误。它不会立即返回
- 套接字编程中的Select在windows中会挂起一段时间