.Net 6中的新数据结构DateOnly和TimeOnly(1)

一直以来,在.net中是没有直接表示日期和时间的数据类型的,我们往往是通过DateTime和TimeSpan来替代。但这两个结构本身的作用范围是更宽的,使用时语义仍然不够明确。为了解决这个问题,在.net 6中引入了时间类型DateOnly和TimeOnly:

    var dateOnly = new DateOnly(2022, 1, 1);
    var timeOnly = new TimeOnly(11, 22, 0);

它们的功能非常明确,表示日期和时间,具有更清晰的语义,使用起来更加直观。也能避免DateTime和TimeSpan中额外的功能带来的副作用。

他们也能直接从DateTime中获取

    var now = DateTime.Now;
    var dateOnly = DateOnly.FromDateTime(now);
    var timeOnly = TimeOnly.FromDateTime(now);

也能方便的转换为DateTime:

    var dateTime = dateOnly.ToDateTime(timeOnly);
									

这两个结构本身使用比较简单,网上也有不少文章介绍它,要更深入了解的朋友可以看下如下文章:

生态问题

我在项目中尝试使用了一下这两个结构,发现由于.net 6太新,第三方库并不能直接支持,而是当一个普通的struct来对待,和DateTime和TimeSpan这些老牌核心库一样方便的使用。

就拿我直接接触到的来说,有如下场景不支持:

  1. Json.net并不能以友好的方式序列化和反序列化,也不方便作为接口交互
  2. Mongodb并不能将其作为时间或数值类型存储,除了显示不方便外,查询也是无法使用的。

第三方库的限制影响了它们替换DateTime和TimeSpan的场景,不过好在它们本身是支持扩展的,在官方支持之前,我们是可以用一些自行扩展的方式来支持它们。我在下篇文章中将探讨下如何解决DateOnly和TimeOnly在Json序列化和Mongodb中读写的问题。

原文地址:https://www.cnblogs.com/TianFang/p/15763895.html