眼见为实:.NET类库中的DateTimeOffset用途何在

时间:2023-03-08 17:31:03
眼见为实:.NET类库中的DateTimeOffset用途何在

EnyimMemcachedCore(支持.NET Core的memached客户端)中实现 Microsoft.Extensions.Caching.Distributed.IDistributedCache 接口时,遇到了一个过期时间处理的问题。

在 IDistributedCache 中用到了 DistributedCacheEntryOptions ,其中有一个属性 AbsoluteExpiration 的类型是 DateTimeOffset 。而 EnyimMemcachedCore 计算过期时间用的是 DateTime,计算方法如下(示例代码):

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

上面的代码中,totalSeconds 的运行结果是 1474951193 。

那使用 DateTimeOffset 时该如何处理呢?

DateTimeOffset 表示的是时间偏移量,那它是基于哪个时间基准的偏移呢?从 DateTimeOffset 的注释中得知它是基于 UTC 时间(Coordinated Universal Time)。它和 DateTime 一样也有 Now 属性,于是有了下面的代码:

DateTimeOffset expiresAtOffset = DateTimeOffset.Now.AddHours();

那如何计算它相对于 1970-1-1 00:00:00 的总秒数呢?发现 DateTimeOffset 有个方法叫 ToUnixTimeSeconds() ,从名称看应该就是它吧。第1次使用它,需要验证一下,眼见为实:

totalSeconds = (uint)expiresAtOffset.ToUnixTimeSeconds();

totalSeconds 的运行结果也是是 1474951193 。

有了 DateTimeOffset ,计算过期时间更方便了,你也可以不用记住 Unix 时间戳的计算起始时间了。