TwinCAT 3获取GMT+2时区当前小时数,求更优雅实现方案
在TwinCAT 3中优雅获取GMT+2时区当前小时数的方案
你的现有代码Hour:= (Date_to_Dint(time())+1)/3600000依赖本地系统时区设置,且加1的处理属于冗余容错(正常情况下Date_to_Dint(time())不会为0,只要系统时间配置正常)。以下是更优雅、可靠的实现方式:
方案一:基于UTC时间直接计算(推荐)
TwinCAT 3提供了直接获取UTC时间的系统函数,无需依赖本地时区设置,通过时区偏移直接计算GMT+2时间,逻辑清晰且可靠:
VAR utcDateTime : DT; gmtPlus2DateTime : DT; targetHour : BYTE; END_VAR // 获取当前UTC时间 utcDateTime := SYSTEMTIME_TO_DT(SYSTEMTIME_UTC()); // 加上GMT+2的时区偏移(2小时) gmtPlus2DateTime := utcDateTime + DT#2H; // 提取GMT+2时间的小时数 targetHour := DT_TO_TOD(gmtPlus2DateTime).hour;
这个方案完全脱离本地系统时区限制,无论PLC所在系统时区如何设置,都能准确得到GMT+2的当前小时数。
方案二:优化现有代码的时区适配
如果偏好沿用原代码的毫秒数计算思路,可直接对UTC时间的毫秒值做偏移计算,同时去掉冗余的+1处理:
VAR utcMs : DINT; gmtPlus2Ms : DINT; targetHour : DINT; END_VAR // 获取UTC时间的毫秒数(从1970-01-01 00:00:00 UTC开始) utcMs := DATE_TO_DINT(SYSTEMTIME_TO_DT(SYSTEMTIME_UTC())); // 加上GMT+2的偏移(2小时 = 7200000毫秒) gmtPlus2Ms := utcMs + 7200000; // 计算小时数 targetHour := gmtPlus2Ms / 3600000;
此方案同样不依赖本地时区,且去掉了不必要的+1容错(UTC时间的毫秒数永远不会为0)。
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

