将 TIMESTAMP 转换为人类日期和时间

Posted

技术标签:

【中文标题】将 TIMESTAMP 转换为人类日期和时间【英文标题】:Convert TSTAMP to human date and time 【发布时间】:2021-12-23 06:20:19 【问题描述】:

我正在尝试使用 Modbus RTU 读取设备。这些字段的类型是 TSTAMP。当我读取这些字段时,它会为每个字段返回一个整数。手册中有一个表格,其中包含地址和类型。

每个日期由读取 2 个地址组成。例如:我想读取“Volts”字段,所以我需要读取地址 8400-8402。读取这些字段会返回值 46229483

如何将这 2 个整数转换为日期和时间格式?

手册:

阅读:

【问题讨论】:

【参考方案1】:

TSTAMP 的格式应该在您手册的其他地方,可能在最后。

如果我咨询this manual,格式是

TSTAMP:3 个相邻的寄存器,每个 2 个字节。第一个(最低寻址)寄存器高字节是年(0-99),低字节是月(1-12)。

中间寄存器的高字节是天(1-31),低字节是小时(0-23加上DST位)。 DST(夏令时)位是位 6 (0x40)。

第三个寄存器高字节是分钟(0-59),低字节是秒(0-59)。例如,假设 DST 生效,2049 年 10 月 12 日上午 9:35:07 将是 0x310A、0x0C49、0x2307

【讨论】:

如何转换4622和9483(读数返回)?这将是 2046 年,第 22 个月,第 94 天和第 83 小时。 不要将它们读取为十进制值。它们存储为单独的字节。例如,4622 是 0x120E,您将单独读取字节(0x12 = 18, 0x0E = 14)。当然,当您应该获得三个寄存器值时,您只获得了两个寄存器值这一事实表明可能涉及另一个问题。 我的坏..阅读位置是8400-8402。所以缺少 1 个位置。现在读取所有 3 个数字,它返回:4622、9483、3331。读取为字节:1814、3711、133。按照约翰发布的手册规则,它将是:2018 年,第 14 个月,第 37 天,第 11 小时和第二个 133。它仍然没有意义,即使读取为一个字节。

以上是关于将 TIMESTAMP 转换为人类日期和时间的主要内容,如果未能解决你的问题,请参考以下文章

如何将此特定的 varchar 转换为人类可读的日期格式?

如何使用 sed 将纪元转换为人类可读的日期时间

将纪元转换为人类可读的日期在 python 中不起作用

在javascript中将时间戳转换为人类日期的函数

使用 Java 将 unix 纪元转换为人类可读时的日期不正确

在 Mac OSX 上将 unix 纪元时间转换为人类可读的日期 - BSD