You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取OPC UA服务器带日期及正确时区的时间戳?

OPC UA 获取带时区时间戳的解决方案

为什么直接打印DataValue()没有时间戳

你直接实例化opcua.ua.DataValue()得到的是一个空的本地对象,没有从OPC UA服务器读取任何实际数据,所以输出里的Value为Null,也没有时间戳数据,这是正常现象。要获取带时间戳的信息,必须从服务器读取节点的完整数据。

获取带时间戳的数据(替代get_values方法)

client.get_values(nodes)方法仅返回节点的纯值,不会附带时间戳、状态码等元数据。要获取包含时间戳的完整数据,需使用client.get_data_values(nodes)方法,它会返回DataValue对象列表,每个对象包含以下关键属性:

  • Value.Value:节点的实际值
  • SourceTimestamp:数据产生时的服务器源时间戳(UTC时区)
  • ServerTimestamp:服务器接收到该数据的时间戳(UTC时区)

示例代码

# 获取包含时间戳的完整数据
data_values = self.client.get_data_values(nodes)

for dv in data_values:
    print(f"节点值: {dv.Value.Value}")
    print(f"源时间戳(UTC): {dv.SourceTimestamp}")
    print(f"服务器时间戳(UTC): {dv.ServerTimestamp}")

时间戳转换为指定时区

OPC UA服务器返回的时间戳默认是UTC时区,如需转换为本地时区或指定时区,可使用Python内置的时区处理工具:

Python 3.9+ 推荐使用zoneinfo

from zoneinfo import ZoneInfo

# 转换为北京时间(Asia/Shanghai)
local_tz = ZoneInfo("Asia/Shanghai")
local_source_time = dv.SourceTimestamp.astimezone(local_tz)
print(f"本地时区源时间戳: {local_source_time}")

兼容旧版本Python 使用pytz

import pytz

local_tz = pytz.timezone("Asia/Shanghai")
# 先给UTC时间戳添加时区信息,再转换到目标时区
local_source_time = dv.SourceTimestamp.replace(tzinfo=pytz.utc).astimezone(local_tz)
print(f"本地时区源时间戳: {local_source_time}")

注意事项

请确保OPC UA服务器配置为返回时间戳,部分服务器可能默认关闭该功能,需检查服务器的相关设置。

内容的提问来源于stack exchange,提问作者dinolover

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 08:52:50