眼見為實:.NET類庫中的DateTimeOffset用途何在


EnyimMemcachedCore(支持.NET Core的memached客戶端)中實現 Microsoft.Extensions.Caching.Distributed.IDistributedCache 接口時,遇到了一個過期時間處理的問題。

在 IDistributedCache 中用到了 DistributedCacheEntryOptions ,其中有一個屬性 AbsoluteExpiration 的類型是 DateTimeOffset 。而 EnyimMemcachedCore 計算過期時間用的是 DateTime,計算方法如下(示例代碼):

DateTime expiresAt = DateTime.Now.AddHours(1);
DateTime unixEpoch = new DateTime(1970, 1, 1);
var totalSeconds = (uint)(expiresAt.ToUniversalTime() - unixEpoch).TotalSeconds;

上面的代碼中,totalSeconds 的運行結果是 1474951193 。

那使用 DateTimeOffset 時該如何處理呢?

DateTimeOffset 表示的是時間偏移量,那它是基於哪個時間基准的偏移呢?從 DateTimeOffset 的注釋中得知它是基於 UTC 時間(Coordinated Universal Time)。它和 DateTime 一樣也有 Now 屬性,於是有了下面的代碼:

DateTimeOffset expiresAtOffset = DateTimeOffset.Now.AddHours(1);

那如何計算它相對於 1970-1-1 00:00:00 的總秒數呢?發現 DateTimeOffset 有個方法叫 ToUnixTimeSeconds() ,從名稱看應該就是它吧。第1次使用它,需要驗證一下,眼見為實:

totalSeconds = (uint)expiresAtOffset.ToUnixTimeSeconds();

totalSeconds 的運行結果也是是 1474951193 。

有了 DateTimeOffset ,計算過期時間更方便了,你也可以不用記住 Unix 時間戳的計算起始時間了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM