背景: 我有一个旧的西门子 cpu,它将以 date_and_time 格式向我发送总共 8 个字节。这种格式的构造使得第 4 个字节包含时间,最后 4 个字节包含自 1992 年 1 月 1 日以来的日期。
问题:我开始使用提取最后 4 个日期来计算日期
long long int dt = 0x60592102FC29000;
char a, b, c, d;
a = (dt & 0xFF);
b = ((dt >> 8) & 0xFF);
c = ((dt >> 16) & 0xFF);
d = ((dt >> 24) & 0xFF);
long int date = int((unsigned char)a << 24 |
(unsigned char)b << 16 |
(unsigned char)c << 8 |
(unsigned char)d);
但是在这部分之后我陷入了困境,因为我想不出任何好的方法来计算一天而无需整天循环。
示例:
0x60592102FC29000 等于 2021-06-04 09:55:40.000
0x7A0DC6021C07000 等于 1996-12-24 12:55:34.010
引用资料:
T#0d_0h_0m_0s_0ms 到 T#49d_17h_2m_47s_295ms 值天、小时、分钟的最大两位数, 秒,最多三位毫秒 使用 T#0d_0h_0m_0s_0ms 初始化
D#1992-01-01 到 D#2200-12-31 考虑到闰年,年份有四位数字, 月和日各为两位数 用 D#0001-01-01 初始化
Link to siemens way of calculating
我的最终解决方案受到以下帖子的启发:
//1996-12-24 12:55:34.010
long long int dt = 0x7A0DC6021C070000;
const int dateOffset = 8034;
time_t date_t = 0;
int date =
((dt & 0xFF) << 24) |
(((dt >> 8) & 0xFF) << 16) |
(((dt >> 16) & 0xFF) << 8) |
(((dt >> 24) & 0xFF));
int time =
((dt >> 32 & 0xFF) << 24) |
(((dt >> 40) & 0xFF) << 16) |
(((dt >> 48) & 0xFF) << 8) |
(((dt >> 56) & 0xFF));
tm _dt = *localtime(&date_t);
_dt.tm_mday += dateOffset + date;
_dt.tm_sec += time/1000;
mktime(&_dt);
最佳答案
我认为您应该帮自己一个忙,使用计时库。众所周知,日期问题很难处理并且容易出错。使用计时库,您的问题可以归结为简单的事情
date_time dt=date_time(1992, 1, 1) + days(value);
其中 value
是您的 Siemens CPU 返回的值。
boost::chrono 或 boost::date_time 应该在包括嵌入式系统在内的旧 CPU 上可用。 C++ 标准具有 std::chrono,但您需要的功能仅适用于 C++20。
这是一个使用 boost::date_time 的例子:
#include "boost/date_time/gregorian/gregorian.hpp"
date start(1992,Jan,1);
date yourdate=start + days(value);
关于c++ - 来自西门子的日期和时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67803545/