.NET 6: New DateOnly and TimeOnly strcuts

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

posted @   capdiem  阅读(120)  评论(1编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示