字符串差 1 小時)
在 FieldPoint 控制器上把時間戳轉(zhuǎn)成字符串同一個時間戳、同一個格式串只因為 UTC format? 輸入給的是 True 還是 False兩個顯示控件就給出相差一小時、日期也不同的結(jié)果??刂破鲿r區(qū)本就設(shè)為 UTCDST 補償也是關(guān)閉的兩條路徑按理應(yīng)當(dāng)一致。左utc_time.vi 的框圖同一個時間戳經(jīng) Format Date/Time String 轉(zhuǎn)換UTC format? 分別接 True 與 False輸出到兩個顯示控件右前面板結(jié)果Time Now (UTC) 為 16 Jun 2009 23:17:42Time Now (UTC) 2 為 17 Jun 2009 00:17:4201 現(xiàn)象一個把時間戳轉(zhuǎn)成字符串的 VI輸入同一個時間戳、同一個格式串 %d %b %Y %H:%M:%S只把 UTC format? 這個布爾輸入分別接 True 和 False兩個顯示控件的結(jié)果就不一樣接 True 的顯示 16 Jun 2009 23:17:42接 False 的顯示 17 Jun 2009 00:17:42。兩者正好差一小時而且跨過了零點日期也跟著差一天。運行環(huán)境是 FieldPoint 控制器控制器時區(qū)設(shè)為 UTCDST 補償關(guān)閉RT 版本為 8.5.1。正因為時區(qū)是 UTC、又不做夏令時補償True 和 False 本應(yīng)給出同一個結(jié)果。值得注意的是MAX 里讀到的數(shù)據(jù)時間戳本身是正確的用 UTC format? 接 True 得到的字符串也是正確的。也就是說正確值一直都在出錯的只有 False 這一條路徑。02 根因這是 FieldPoint 控制器上的一處已知問題。官方復(fù)現(xiàn)之后確認(rèn)研發(fā)側(cè)已經(jīng)知曉并且給出了明確的范圍邊界受影響的是 PharLap 架構(gòu)的 FieldPointVxWorks 架構(gòu)的 FieldPoint 不受影響。成因不在調(diào)用方。同一個時間戳、同一個格式串差的只是一個布爾端子所以問題出在 False 這條轉(zhuǎn)換路徑對時間的處理上與傳入的時間戳格式無關(guān)也與前面的數(shù)據(jù)采集無關(guān)。UTC format? 這個端子決定的是轉(zhuǎn)換時把輸入當(dāng)作 UTC 還是當(dāng)作本地時間去解釋而控制器時區(qū)本來就是 UTC、DST 補償也是關(guān)閉的兩條路徑的基準(zhǔn)本該重合。既然結(jié)果是 True 對、False 錯那偏差就只能來自 False 這條路徑對時區(qū)偏移的處理而不是來自輸入數(shù)據(jù)。這個現(xiàn)象能在多個版本上復(fù)現(xiàn)從 RT 6.1 到 8.5.1、8.6.1 都有報告可見它不是某一版的偶發(fā)回歸而是這條路徑上一段穩(wěn)定存在的舊邏輯。后續(xù)信息顯示它對應(yīng)的問題編號為 CAR 41190并已修復(fù)只是當(dāng)時沒有給出具體的修復(fù)版本號。也就是說在拿到對應(yīng)的修復(fù)版本之前能依靠的只有繞開這條分支。03 怎么做最直接的做法是把 True 接到 UTC format? 端子上。既然 False 這條路徑算錯、True 這條路徑算對而現(xiàn)場的需求恰恰就是 UTC 時間字符串那么直接繞開有問題的分支即可不必等版本升級。如果確實需要在 False 分支上繼續(xù)用比如字符串里要帶本地時間語義就要留意在拿到修復(fù)版本之前的 PharLap FieldPoint 上這條路出來的時間不可信不能拿它去對齊數(shù)據(jù)。穩(wěn)妥的辦法是在程序里統(tǒng)一走 True把時區(qū)換算放到明確的地方去做而不是依賴這個端子的默認(rèn)行為。上機核對時可以讓兩條路徑在同一時刻各輸出一次再拿 MAX 里讀到的數(shù)據(jù)時間戳作基準(zhǔn)去比True 分支與 MAX 一致False 分支偏離就說明命中的是這里的已知問題而不是程序里格式串寫錯或者數(shù)據(jù)源本身帶了錯誤的時區(qū)。排查時還要分清平臺。后來出現(xiàn)過在 LabVIEW 2012 上觀察到類似偏差的報告但經(jīng)核實那是 LabVIEW 在本地時間與 UTC 轉(zhuǎn)換上的另一個問題出現(xiàn)在 BST 期間與這里的 FieldPoint 問題不是同一回事。所以遇到時間差一小時、差一天這類現(xiàn)象先確認(rèn)代碼是跑在 RT 目標(biāo)上還是 Windows 上再決定往哪個方向查。平臺不同責(zé)任方和修法都不同混在一起排查只會繞遠(yuǎn)路。04 記住這幾條同一個時間戳、同一個格式串只有 UTC format? 端子不同結(jié)果就不一樣——先把變量收斂到這一個端子上。PharLap 架構(gòu)的 FieldPoint 受影響VxWorks 架構(gòu)不受影響排查先看平臺。需要正確的 UTC 字符串時把 True 接上即可不必等升級。MAX 里的時間戳和 True 分支的輸出都是對的可以用它們反過來驗證 False 分支。我們專注 LabVIEW 軟件開發(fā)與測試測量系統(tǒng)集成從硬件選型、方案設(shè)計到現(xiàn)場交付調(diào)試提供一站式服務(wù)。手上有一臺設(shè)備想接進(jìn) LabVIEW或者幾臺設(shè)備要串成一套系統(tǒng)歡迎在評論區(qū)留言身邊朋友有類似項目也歡迎幫忙引薦。