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

最新文章

  1. Unity学习疑问记录之图片画质
  2. [k]自定义样式下拉菜单
  3. div加jquery实现iframe标签的功能
  4. 【Linux C中文函数手册】文件内容控制函数
  5. Android 项目利用 Android Studio 和 Gradle 打包多版本APK
  6. JavaScript动态操作style
  7. 点击datalist中Button按钮出现“回发或回调参数无效......”
  8. like-minded 都有什么意思_百度知道
  9. wireshark tls
  10. Struts2和SpringMVC的区别
  11. NavigationView使用过程的问题解决
  12. June 14. 2018 Week 24th Thursday
  13. drf开发中常见问题
  14. linux系统下键盘按键的重新映射——xmodmap工具和xev工具
  15. 阿里云服务器CentOS7怎么分区格式化/挂载硬盘
  16. [NOI1995]石子合并 四边形不等式优化
  17. oracle中如何创建表的自增ID(通过序列)
  18. //{{AFX_MSG、//{{AFX_VIRTUAL、//{{AFX_MSG_MAP、//{{AFX_DATA_INIT
  19. Git 命令快速浏览
  20. cv1.0入门

热门文章

  1. ApacheCN Python 译文集 20211108 更新
  2. Eclipse导入项目java文件中文乱码
  3. 关于CSS3样式中的前缀问题
  4. 聊天泡泡(仿微信)By-H罗
  5. k8s之资源限制以及探针检查
  6. Centos 系统目录概述
  7. Kubernetes 集群日志 和 EFK 架构日志方案
  8. 关于IDA无法从symbol server下载pdb的问题
  9. service与systemctl命令比较
  10. 使用SpringBoot整合MybatisPlus出现 : java.lang.IllegalStateException: Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=...) with your test