c++ - 来自西门子的日期和时间

标签 c++

背景: 我有一个旧的西门子 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

Siemens manual, page 107

我的最终解决方案受到以下帖子的启发:

    //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/

相关文章:

c++ - 使用仿函数时,括号前的表达式必须具有指向函数的指针类型

c++ - 可以重新排序对 volatiles 的访问吗?

c++ - 无法在 QtCreator 中使用 g++ 7.2 使用 c++17 功能

c++ - 为什么 parse_config_file 在流上设置 failbit?

c++对象未跨文件注册

java - 我需要能够在 eclipse 中找到行号和方法名称

c++ - 为什么 "std::is_pointer<std::nullptr_t>::value"等于 false?

c++ - 如何将 *signed* 24 位 int 存储到另一个变量中?

c++ - 来自 static constexpr std::array 的 UTF-8 constexpr std::string_view 在 MSVC 上无效

c++ - 如何通过读取文件将不同数据类型的数据推送到一个 vector 中?