簡體   English   中英

獲取獨立於SystemTime的實際DateTime

[英]Get actual DateTime independent of SystemTime

目標:我正在開發一個既可以在線也可以離線使用的應用程序。 該應用程序具有在應用程序內部創建和保存注釋的功能。 此外,該應用首次打開時需要互聯網連接。 之后,它可以在離線模式下工作,一旦應用程序獲得互聯網連接,它將發送所有便箋

問題:我需要將確切的“創建日期”字段以及“注釋”發送到服務器。 即使系統時間錯誤,“創建日期”時間也必須准確。

當應用程序首次連接到互聯網時,我的服務器時間正確。 是否有可能與我們從服務器首次獲得的時間(與應用程序關閉或系統重新啟動)無關地跟蹤與系統時間無關的時間。

我嘗試使用PerformanceCounter("System", "System Up Time"來賦予系統正常運行時間。即使應用程序關閉,我也可以跟蹤時間。但是無法跟蹤用戶是否重新啟動了系統。

另外,即使用戶在脫機模式下故意更改系統時間,我也需要跟蹤正確的時間。 C#中是否為此有任何回調函數?

注意:我使用SQLlite作為后端,對此我能做些什么?

您可以考慮以下兩種選擇:

  • 使用Stopwatch ,該Stopwatch用於測量經過時間。 從檢索服務器時間開始,然后可以在需要時將經過時間添加到服務器時間。 但是,我不知道如果有人暫停了計算機而將您暫停到Stopwatch會發生什么。
  • 在獲取服務器時間時,請注意系統時鍾的值(使用DateTime.UtcNow此處不涉及本地時間),並比較兩個時間以獲得兩個時鍾之間的增量。 您可以隨時使用增量來預測服務器時鍾的輸出。 使用此方法的注意事項:
    • 如果本地時鍾運行得慢或快(或被諸如Windows Time服務之類的東西調整),則增量可能會變得不正確。
    • 如果用戶調整系統本地時鍾,則會遇到問題。

基本上沒有互聯網連接,您唯一的時間來源就是本地系統。 問題的嚴重程度取決於您擔心的故障模式-如果只是為了方便便箋以確保正確的時間而您又不必擔心惡意用戶更改時鍾,那就是可能不是太大的問題。 如果您絕對需要准確,獨立的時間戳,則基本上會遇到麻煩。

(當然,您可以通過重復花費服務器時間並將其與您期望的時間進行比較來略微改進這些方案,這可以幫助檢測篡改或偶然的漂移。但是在某些時候,您將脫機,並且沒有從那時起到下次下次上網之間,您可以做很多事情。)

嘗試使用UTC日期而不是正常的獲取日期功能

在C#中

DateTime.UTCNow

在Sql Server中

getutcdate()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM