Background and Motivation

.NET 目前有用于处理日期和时间的DateTimeDateTimeOffset。但在许多情况下,用户需要处理日期而根本不关心时间部分,也存在需要处理时间而不关心日期部分的场景。当用户试图通过使用DateTimeDateTimeOffset来解决这个问题,需要截断他们不需要的部分,并且希望确保剩下的值不受影响。这很容易出错,因为DateTimeDateTimeOffset也携带一些与时区相关的内容。

这就是为什么 .NET 6 推出了DateOnlyTimeOnly的原因。

Intro

官方介绍:

  • DateOnly只关心DateTime的日期部分
  • TimeOnly只关心DateTime的时间部分。
  • DateOnly适用于生日、周年纪念日和工作日等场景。
  • TimeOnly适用于定期会议、闹钟和每周营业时间等场景。
  • 补充了现有的日期/时间类型(DateTimeDateTimeOffsetTimeSpanTimeZoneInfo)。
  • 定义在System命名空间中,与现有的相关类型一样,由CoreLib中提供。

关于命名,没有直接使用DateTime作为新API的名称,应该是因为避免混淆,因为一个DateTime.Date已经返回了一个DateTime类型的值。既然日期类型只能选择DateOnly了,那么时间类型也自然是TimeOnly啦。

DateOnly

// Without DateOnly
var d1 = DateTime.Parse("2021-11-14");
var d2 = DateTime.Parse("2021-11-14");
var isSameDate = d1.Date == d2.Date;
Assert.IsTrue(isSameDate); // Use DateOnly
var d1 = DateOnly.Parse("2021-11-14");
var d2 = DateOnly.Parse("2021-11-14");
var isSameDate = d1 == d2;
Assert.IsTrue(isSameDate);

DateOnly使用很简单,一般使用DateOnly.FromDateTimeDateOnly.(Try)Parse生成一个DateOnly对象。需要注意的是DateOnly.Parse的传参只能是日期部分的字符串,像2021-11-14 12:34:56这样的参数是会报错的。

TimeOnly

// Without TimeOnly
var workDateTime = DateTimeOffset.Parse("09:00");
var outOfWorkDateTime = DateTimeOffset.Parse("18:00");
var workingDateTime = DateTimeOffset.Parse("10:00");
var workTime = workDateTime.TimeOfDay;
var outOfWorkTime = outOfWorkDateTime.TimeOfDay;
var workingTime = workingDateTime.TimeOfDay;
var noLate = workingTime > workTime && workingTime < outOfWorkTime;
Assert.IsTrue(noLate); // Use TimeOnly
var workTime = TimeOnly.Parse("09:00");
var outOfWorkTime = TimeOnly.Parse("18:00");
var workingTime = TimeOnly.Parse("10:00");
var noLate = workingTime.IsBetween(workTime, outOfWorkTime);
Assert.IsTrue(noLate);

TimeOnly使用方式与DateOnly类似,不过它有个特别的TimeOnly.IsBetween方法。

Supports both "normal"

ranges such as 10:00-12:00, and ranges that span midnight such as 23:00-01:00.

Attentions

  • 目前DateOnlyTimeOnly不被System.Text.JsonNewtonsoft.Json等库支持。

References

.NET 6: New DateOnly and TimeOnly strcuts的更多相关文章

  1. 在.NET 6中使用DateOnly和TimeOnly

    千呼万唤始出来 在.NET 6(preview 4)中引入了两个期待已久的类型,将作为核心库的一部分.DateOnly和TimeOnly允许开发人员表示DateTime的日期或时间部分.这两个类型为值 ...

  2. 官宣.NET 6 预览版4

    我们很高兴发布 .NET 6 Preview 4.我们现在大约完成了 .NET 6 发布的一半.现在是一个很好的时机,可以再次查看.NET6的完整范围.许多功能都接近最终形式,而其他功能将很快推出,因 ...

  3. 20 个 .NET 6 新增的 API

    DateOnly & TimeOnly .NET 6 引入了两种期待已久的类型 - DateOnly 和 TimeOnly, 它们分别代表DateTime的日期和时间部分. DateOnly ...

  4. .NET 6 史上最全攻略

    欢迎使用.NET 6.今天的版本是.NET 团队和社区一年多努力的结果.C# 10 和F# 6 提供了语言改进,使您的代码更简单.更好.性能大幅提升,我们已经看到微软降低了托管云服务的成本..NET ...

  5. .NET性能优化-使用结构体替代类

    前言 我们知道在C#和Java明显的一个区别就是C#可以自定义值类型,也就是今天的主角struct,我们有了更加方便的class为什么微软还加入了struct呢?这其实就是今天要谈到的一个优化性能的T ...

  6. safari 日期对象新建new Date( timeStr ) 参数TimeStr格式

    这是一个浏览器兼容的问题,在此总结一下,别老在这掉坑. 先坐下测试 var timeStrArray = [ '2016-10-04', '2016.10.04', '2016/10/04', '10 ...

  7. Safari中的new Date()格式化坑

    今天在测试的时候发现,在Chrome中的如下代码: new Date("2014-03-09"); 在Safari中报错invalid date.经过查阅资料找到类似的问答: st ...

  8. 一探即将到来的 C# 10

    前言 本来因为懒不想写这篇文章,但是不少人表示有兴趣,于是最后决定还是写一下. .NET 6 最近几个预览版一直都在开发体验(如 hot reload.linker 等).平台支持(如 Android ...

  9. .Net IDE智能提示汉化(.Net6、AspNetCore)

    .Net IDE智能提示汉化(.Net6.AspNetCore) 先上现成的.net6汉化文件,可以手动下载后参照 如何为 .NET 安装本地化的 IntelliSense 文件 进行安装.或者使用后 ...

随机推荐

  1. Programiz 中文系列教程·翻译完成

    原文:Programiz 协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远. 在线阅读 ApacheCN 学习资源 目录 Programiz C ...

  2. HuTool工具包操作csv文件

    CsvUtil是CSV工具类,主要封装了两个方法: getReader 用于对CSV文件读取 getWriter 用于生成CSV文件 1.读取文件 读取为CsvRow CsvReader reader ...

  3. 入门 - 复习Kubernetes核心概念 (八)

    本文将会简单介绍Kubernetes的核心概念.因为这些定义可以在Kubernetes的文档中找到,所以文章也会避免用大段的枯燥的文字介绍.相反,我们会使用一些图表(其中一些是动画)和示例来解释这些概 ...

  4. 解决Android3.0之后不能在主线程中进行HTTP请求

    感谢大佬:https://www.cnblogs.com/falzy/p/5763848.html 在Android3.0以后,会发现,只要是写在主线程(就是Activity)中的HTTP请求,运行时 ...

  5. Ajax不允许缓存方法

    AJAX请求后台时会自动缓存,客户端发起请求首先请求缓存,第一次请求即由缓存再请求服务器,返回数据时同样先返回到缓存再展示再客户端.但是如果数据要求随时性呢,数据变化频率高呢?那么如何不让ajax设置 ...

  6. Java注解和注解处理器使用方法

    原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11492274.html 准备材料: 实体类: PrintDemo 注解类: PrintName ...

  7. Net6 DI源码分析Part3 CallSiteRuntimeResolver,CallSiteVisitor

    CallSiteRuntimeResolver CallSiteRuntimeResolver是实现了CallSiteVisitor之一. 提供的方法主要分三个部分 自有成员方法 Resolve提供服 ...

  8. 【密码学工具】Ciphey和WinDecrypto的使用随笔

    1.Ciphey 官方文档 这个工具安装起来也很容易,用pip下载即可. pip install ciphey -i https://pypi.mirrors.ustc.edu.cn/simple/ ...

  9. VUE3 之 动画与过渡的实现 - 这个系列的教程通俗易懂,适合新手

    1. 概述 光环效应告诉我们: 当一个人在某一方面取得了巨大的成功,人们就会给他贴上正面的标签,这个人从此就被"优秀"的光环所笼罩,他做的一切,人们都认为是正确的. 例如:越是名气 ...

  10. 痞子衡嵌入式:介绍i.MXRT定时器PIT的多通道链接模式及其在coremark测试工程里的应用

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT定时器PIT的多通道链接模式及其在coremark测试里的应用. 早在 2018 年 i.MXRT 系列跨界处理器刚推出的时 ...