一直以来,在.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这些老牌核心库一样方便的使用。
就拿我直接接触到的来说,有如下场景不支持:
- Json.net并不能以友好的方式序列化和反序列化,也不方便作为接口交互
- Mongodb并不能将其作为时间或数值类型存储,除了显示不方便外,查询也是无法使用的。
第三方库的限制影响了它们替换DateTime和TimeSpan的场景,不过好在它们本身是支持扩展的,在官方支持之前,我们是可以用一些自行扩展的方式来支持它们。我在下篇文章中将探讨下如何解决DateOnly和TimeOnly在Json序列化和Mongodb中读写的问题。