zoukankan      html  css  js  c++  java
  • 眼见为实:.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 时间戳的计算起始时间了。

  • 相关阅读:
    树形数据深度排序处理示例(递归法).sql
    12种JavaScript MVC框架之比较
    逐级汇总示例(用户定义函数法).sql
    名次查询的处理示例.sql
    实现删除指定结点及所有子节点的处理触发器.sql
    memcpy和memmove的区别
    据说是月薪2W的笔试题
    C++重点知识
    Java初学者需掌握的30个概念
    (转)微软面试题
  • 原文地址:https://www.cnblogs.com/dudu/p/5912328.html
Copyright © 2011-2022 走看看