.NET 6: New DateOnly and TimeOnly strcuts
Background and Motivation
.NET 目前有用于处理日期和时间的DateTime
和DateTimeOffset
。但在许多情况下,用户需要处理日期而根本不关心时间部分,也存在需要处理时间而不关心日期部分的场景。当用户试图通过使用DateTime
和DateTimeOffset
来解决这个问题,需要截断他们不需要的部分,并且希望确保剩下的值不受影响。这很容易出错,因为DateTime
和DateTimeOffset
也携带一些与时区相关的内容。
这就是为什么 .NET 6 推出了DateOnly
和TimeOnly
的原因。
Intro
官方介绍:
DateOnly
只关心DateTime
的日期部分TimeOnly
只关心DateTime
的时间部分。DateOnly
适用于生日、周年纪念日和工作日等场景。TimeOnly
适用于定期会议、闹钟和每周营业时间等场景。- 补充了现有的日期/时间类型(
DateTime
,DateTimeOffset
,TimeSpan
,TimeZoneInfo
)。 - 定义在
System
命名空间中,与现有的相关类型一样,由CoreLib中提供。
关于命名,没有直接使用
Date
和Time
作为新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.FromDateTime
和DateOnly.(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
- 目前
DateOnly
和TimeOnly
不被System.Text.Json
和Newtonsoft.Json
等库支持。
References
- https://devblogs.microsoft.com/dotnet/announcing-net-6/#new-dateonly-and-timeonly-structs
- https://github.com/dotnet/runtime/issues/49036
- https://github.com/dotnet/runtime/blob/main/src/libraries/System.Private.CoreLib/src/System/DateOnly.cs
- https://github.com/dotnet/runtime/blob/main/src/libraries/System.Private.CoreLib/src/System/TimeOnly.cs
.NET 6: New DateOnly and TimeOnly strcuts的更多相关文章
- 在.NET 6中使用DateOnly和TimeOnly
千呼万唤始出来 在.NET 6(preview 4)中引入了两个期待已久的类型,将作为核心库的一部分.DateOnly和TimeOnly允许开发人员表示DateTime的日期或时间部分.这两个类型为值 ...
- 官宣.NET 6 预览版4
我们很高兴发布 .NET 6 Preview 4.我们现在大约完成了 .NET 6 发布的一半.现在是一个很好的时机,可以再次查看.NET6的完整范围.许多功能都接近最终形式,而其他功能将很快推出,因 ...
- 20 个 .NET 6 新增的 API
DateOnly & TimeOnly .NET 6 引入了两种期待已久的类型 - DateOnly 和 TimeOnly, 它们分别代表DateTime的日期和时间部分. DateOnly ...
- .NET 6 史上最全攻略
欢迎使用.NET 6.今天的版本是.NET 团队和社区一年多努力的结果.C# 10 和F# 6 提供了语言改进,使您的代码更简单.更好.性能大幅提升,我们已经看到微软降低了托管云服务的成本..NET ...
- .NET性能优化-使用结构体替代类
前言 我们知道在C#和Java明显的一个区别就是C#可以自定义值类型,也就是今天的主角struct,我们有了更加方便的class为什么微软还加入了struct呢?这其实就是今天要谈到的一个优化性能的T ...
- safari 日期对象新建new Date( timeStr ) 参数TimeStr格式
这是一个浏览器兼容的问题,在此总结一下,别老在这掉坑. 先坐下测试 var timeStrArray = [ '2016-10-04', '2016.10.04', '2016/10/04', '10 ...
- Safari中的new Date()格式化坑
今天在测试的时候发现,在Chrome中的如下代码: new Date("2014-03-09"); 在Safari中报错invalid date.经过查阅资料找到类似的问答: st ...
- 一探即将到来的 C# 10
前言 本来因为懒不想写这篇文章,但是不少人表示有兴趣,于是最后决定还是写一下. .NET 6 最近几个预览版一直都在开发体验(如 hot reload.linker 等).平台支持(如 Android ...
- .Net IDE智能提示汉化(.Net6、AspNetCore)
.Net IDE智能提示汉化(.Net6.AspNetCore) 先上现成的.net6汉化文件,可以手动下载后参照 如何为 .NET 安装本地化的 IntelliSense 文件 进行安装.或者使用后 ...
随机推荐
- Thread中常用API
1.sleep方法 线程的 sleep 方法会使线程休眠指定的时间长度.休眠的意思是,当前逻辑执行到此不再继续执行,而是等待指定的时间.但在这段时间内,该线程持有的锁并不会释放.这样设计很好理解,因为 ...
- JavaScript与java语法区别
网页中各种技术的作用 感谢大佬:https://blog.csdn.net/RookiexiaoMu_a/article/details/89052768 HTML 制作网页的结构 CSS 美化网页 ...
- shell下快捷键
### 1.快捷键 ^C 终止前台运行的程序 ^D 退出 等价于exit ^L 清屏 ^A 光标移动到命令行的最前端 ^E 光标移动到命令行的最后端 ^U 删除光标前所有字符 ...
- 一键部署lnmp
一键部署lnmp 提前将nginx .mysql .php 所需安装包都放在/opt目录下 脚本启动结束时,重启一下nginx 服务,就能在火狐浏览器更新出php测试页 脚本如下:(脚本里的软件 ...
- Content-Type: multipart/form-data;文件上传利用
当我们找到一个文件上传接口时,发现他的MIME类型检测为Content-Type: multipart/form-data;时,我们就可以尝试下面几种方法来绕过限制. ---------------- ...
- latex知识点
sensors期刊下载的laTex模板错误修改 把上面的那个删了,原因是什么那,请看下文...... 如何使用endnote + latex 1.使用word将文献按照word引用顺序导出成一个新的e ...
- C语言中各种输入函数之间的区别
以下内容全部来自Bay(百度百科) scanf的返回值 scanf()函数返回成功赋值的数据项数,读到文件末尾出错时则返回EOF. 如: scanf("%d%d", &a, ...
- springboot学习第一步
关于springboot的介绍就不多说了,可以去百度. 默认的情况下,springboot1.4.0版本要求Java7以上和spring4.3.2以上,当然你也可以使用java1.6,只不过你需要额外 ...
- 基于Oracle数据库登陆界面及功能实现 Java版
首先要在Oracle数据库创建表文件,包括建立表头以及关键字(唯一标识符),此次程序所用的表名称为SW_USER_INFO,表头有UNAME.UKEY.USEX等,关键字为UCC,然后添加一条记录,用 ...
- Solution -「CF 1023F」Mobile Phone Network
\(\mathcal{Description}\) Link. 有一个 \(n\) 个结点的图,并给定 \(m_1\) 条无向带权黑边,\(m_2\) 条无向无权白边.你需要为每条白边指定边权 ...