在 .NET 6 中使用 DATEONLY 和 TIMEONLY

在 .NET 6 中使用 DATEONLY 和 TIMEONLY

在 即将发布的.NET 6中,引入了两种期待已久的类型作为核心库的一部分。DateOnlyTimeOnly允许开发人员表示 DateTime 的日期或时间部分。这两种新类型是结构体(值类型),可以在您的代码独立处理日期或时间概念时使用。这两种类型都可以在 System 命名空间中找到。使用这些新类型可能与数据库允许表示类似数据的方式很好地保持一致。具体来说,这些类型与 SQL Server 日期和时间数据类型非常吻合。

注意:要访问这些类型,您需要下载并安装 .NET 6 预览版 4[1](或更新版本)和Visual Studio 16.11(当前处于预览版)[2]

在 .NET 6 中使用 DATEONLY

这些类型对于它们所代表的内容几乎是不言自明的。当我们需要表示没有时间组件的日期时,我们可以使用 DateOnly。例如,也许我们在应用程序中代表某人的出生日期。在这种情况下,我们很少需要使用 DateTime 的时间部分,标准的解决方案是将时间设置为 00:00:00.000。使用 DateOnly,我们可以更明确地说明我们的意图。

我们可以在 DateOnly 上构造一个实例,将年、月和日作为参数传递:

var date = new DateOnly(2020, 04, 20);

这将创建一个表示 2020 年 4 月 20 日的 DateOnly。在内部,DateOnly 结构使用一个整数来跟踪有效范围为 0(映射到 0001 年 1 月 1 日到 3,652,058,映射到 9999 年 12 月 31 日)的日数。

通常,您将开始使用现有的 DateTime 并希望从中创建一个 DateOnly 实例。为此,我们可以调用 FromDateTime 方法:

var currentDate = DateOnly.FromDateTime(DateTime.Now);

与现有的 DateTime 类型一样,我们也可以使用 Parse 将表示日期的字符串解析为其 DateOnly 表示,这可能会引发异常或 TryParse,它返回一个指示成功或失败的布尔值。

if (DateOnly.TryParse("28/09/1984", new CultureInfo("en-GB"), DateTimeStyles.None, out var result))
{Console.WriteLine(result);
}

上面的代码尝试从第一个参数(日期的字符串表示)解析日期。由于不同的国家和地区对日期的解释不同,因此日期的解析可能会受到文化的影响。在此示例中,我明确提供了 en-GB 区域性以确保它使用日/月/年格式从字符串中正确解析。

如果 DateOnly 已成功解析,则将其写入控制台。再次; 文化在这里扮演着重要的角色。在此示例中,正在运行的线程的当前区域性用于确定所使用的格式。根据我的系统配置,我的应用程序线程恰好在 en-GB 下运行,因此格式化的字符串显示为:

28/09/1984

要了解有关解析和格式化的更多信息,您可以查看我最新的 Pluralsight 课程,C# 中的字符串操作:最佳实践[3]

我们还可以向 DateOnly 实例添加天数、月数或年数,从而产生具有调整日期的新实例。

var newDate = date.AddDays(1).AddMonths(1).AddYears(1);

在 .NET 6 中使用 TIMEONLY

TimeOnly 结构体用于表示与日期无关的时间。例如,想象一下创建一个闹钟应用程序,让用户创建一个重复发生的闹钟。在这种情况下,我们想要存储闹钟应该响起的时间,但日期无关紧要。

TimeOnly 类型有几个构造函数重载。我希望大多数开发人员使用的更常见的允许我们创建一个日期,接受时间的小时和分钟,小时,分钟和秒,或小时,分钟,秒和毫秒。

public TimeOnly(int hour, int minute)
public TimeOnly(int hour, int minute, int second)
public TimeOnly(int hour, int minute, int second, int millisecond)

例如,要表示上午 10:30,我们可以创建以下 TimeOnly 实例。

var startTime = new TimeOnly(10, 30);

小时部分预计将使用 24 小时时钟格式提供,其中 1pm 是 13 小时。

在内部,TimeOnly 存储一个 long,它表示从午夜到定义的时间已经过去的滴答数(100 纳秒间隔)。例如,凌晨 1 点是一天中的 1 小时,因此自午夜 (00:00:00.0000000) 起有 36,000,000,000 个滴答声。尽管我们也可以通过提供刻度作为参数来构造 TimeOnly,但此实现细节对于一般用途而言并非必不可少。

public TimeOnly(long ticks);

在上面定义了开始时间后,让我们使用另一个 TimeOnly 实例定义下午 5 点的结束时间。

var endTime = new TimeOnly(17, 00, 00);

我们现在可以对这些 TimeOnly 实例执行数学运算,例如计算差异。

var diff = endTime - startTime;

此操作的返回类型是 TimeSpan,然后我们可以使用它来写入两次之间的小时数。

Console.WriteLine($"Hours: {diff.TotalHours}");// Output = Hours: 6.5

我们可以执行的另一个检查是确定特定的 TimeOnly 是否在时间窗口内。例如,假设我们要检查当前时间是否在我们已经定义的开始时间和结束时间之间。与 DateOnly 一样,我们可以使用 FromDateTime 静态方法将现有 DateTime 转换为 TimeOnly。

var currentTime = TimeOnly.FromDateTime(DateTime.Now);var isBetween = currentTime.IsBetween(startTime, endTime);Console.WriteLine($"Current time {(isBetween ? "is" : "is not")} between start and end");

上面的代码现在将写入控制台当前时间是否介于 10:30(上午 10:30)和 17:00(下午 5 点)之间。

IsBetween 方法接受正常范围(例如我们在前面的示例中使用的范围)以及跨越午夜的范围(例如 22:00-02:00)。

var startTime = new TimeOnly(22, 00);var endTime = new TimeOnly(02, 00);var now = new TimeOnly(23, 25);  var isBetween = now.IsBetween(startTime, endTime);Console.WriteLine($"Current time {(isBetween ? "is" : "is not")} between start and end"); // Output = Current time is between start and end

TimeOnly 还包括使用循环时钟比较时间的运算符。

var startTime = new TimeOnly(08, 00);var endTime = new TimeOnly(09, 00);  Console.WriteLine($"{startTime < endTime}");// Output = True

此代码检查上午 8 点是否早于上午 9 点,这显然是!

概括

我们对这两种新类型的早期研究到此结束,这两种类型已经在 .NET 6 预览版 4 中出现。我觉得值得强调这些类型的存在,因为当我们习惯于默认为 DateTime/DateTimeOffset 时,这些更改很容易错过在过去。如果您的数据需要独立表示日期或时间,那么 DateOnly 和 TimeOnly 值得考虑用于面向 .NET 6 的新应用程序。

References

[1] 安装 .NET 6 预览版 4: https://dotnet.microsoft.com/download/dotnet/6.0?WT.mc_id=DT-MVP-5002866
[2] Visual Studio 16.11(当前处于预览版): https://visualstudio.microsoft.com/vs/preview/?WT.mc_id=DT-MVP-5002866
[3] C# 中的字符串操作:最佳实践: https://www.stevejgordon.co.uk/pluralsight.pxf.io/EaEV1P

1888e09d5253fdf2d2bf0f5d594b7a8c.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/298043.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue 3.0 正式版_Vuejs 3 Release:One Piece. Vuejs 3.0 正式版发布!代号:海贼王

Vuejs 3.0 在北京时间2020年9月19日凌晨&#xff0c;终于发布了 3.0 版本&#xff0c;代号&#xff1a;One Piece。此次vue3.0 为用户提供了全新的 composition-api 以及更小的包大小&#xff0c;和更好的 TypeScript 支持。Vue3.0发布链接​github.comVue 是当前非常流行的框架…

Linux IPC实践(6) --System V消息队列(3)

消息队列综合案例 消息队列实现回射客户/服务器 server进程接收时, 指定msgtyp为0, 从队首不断接收消息 server进程发送时, 将mtype指定为接收到的client进程的pid client进程发送的时候, mtype指定为自己进程的pid client进程接收时, 需要将msgtyp指定为自己进程的pid, 只接收…

100斤的铁和100斤女生哪个重?

1 你是不是有别的猫了&#xff1f;-2 兔兔这么可爱我们沾点孜然再吃会更香3 解压的最好方式4 人不如猫系列5 这演技没sei了&#xff01;&#xff01;&#xff01;6 100斤的铁和100斤女生哪个重&#xff1f;7 如果只能选一个&#xff0c;你会选什么你点的每个赞&#xff…

JailbreakMe.com-最新浏览器模式破解iPhones,iPads和iPod Touches方法

一位***建立了该网站(JailbreakMe.com)&#xff0c;可以通过浏览器登录的形式破解几乎所有的iOS&#xff0c;这包括了iPhone,iPad,和iPod Touch&#xff0c;将解除Apple对这些设备的软件限制。 用户如果想尝试未经授权的app或者想在多个不同国家使用这些设备&#xff0c;都可以…

谷歌开源3D舞蹈生成模型FACT,舞姿清奇!

文 | 御坂弟弟出品 | OSC开源社区&#xff08;ID&#xff1a;oschina2013&#xff09;谷歌开源了其基于 AIST 的 3D 舞蹈生成模型 FACT。该模型不仅可以学习音乐-运动对应关系&#xff0c;还可以生成以音乐为基础的 3D 运动序列。此前&#xff0c;谷歌层发布了大规模的多模态 3…

vue click事件_vue指令用法

vue指令指令式带有 v- 前缀的特殊特性v-text和v-html都属于指令将数据和dom做关联&#xff0c;当表达式的值改变时&#xff0c;响应式地作用在视图解决大胡子语法闪烁案例[v-cloak] {dispaly: none; }一般把v-cloak绑在Vue实例el属性绑定的节点上<!DOCTYPE html> <htm…

冒泡排序c java c,冒泡排序,c语言冒泡排序法代码

冒泡排序&#xff0c;c语言冒泡排序法代码冒泡排序冒泡排序(Bubble Sort)&#xff0c;是一种计算机科学领域的较简单的排序算法。它重复地走访过要排序的元素列&#xff0c;依次比较两个相邻的元素&#xff0c;如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元…

男人从小到大的梦想

1 哪个男孩子不想拥有挖掘机呢2 竟然还有这种操作&#xff1f;&#xff1f;&#xff1f;3 这难道是传说中的好冷鸭 哈哈哈4 这些。。都是我的吗&#xff1f;&#xff1f;&#xff01;&#xff01;5 流浪的小可爱被收养之后&#xff0c;终于可以睡个安稳觉了&#xff01;6 好好的…

10个人里有几个大学生?

大家好&#xff0c;我是Z哥。昨天看了一份报告&#xff0c;感触特别深&#xff0c;想随便聊几句。留给未来作为父亲时的自己。前几天教育部发布了 2020 年的《教育发展统计公报》&#xff0c;看着里面的一张张图表&#xff0c;不由得感叹一句&#xff0c;“读书这事真的是快内卷…

win2003无法进入桌面_救急,如何通过命令行备份桌面重要文件?

今天要说的问题&#xff0c;日常使用中还蛮常见的&#xff0c;比如出现紧急:近期系统更新后进不了系统的一定要看!中类似的情况。对于具有U盘启动盘的朋友们来说&#xff0c;这不是事&#xff0c;因为我们可以通过U盘启动进PE来备份数据&#xff0c;但是日常中&#xff0c;大部…

操作系统概念 ppt_智能家居操作系统三国拉锯,要出结果了吗?

海尔、百度、华为盘踞的智能家居操作系统&#xff0c;谁拿下传统家电企业了&#xff1f;文/郭锴来源/智能相对论(aixdlun)福特曾说&#xff0c;如果你问消费者他们想要什么&#xff0c;得到的答案只会是一匹更快的马。汽车大王福特给消费者了汽车&#xff0c;手机教父乔布斯拿出…

垃圾站

http://www.heiqu.com/

史上超强的学科碰撞,有生之年必看系列!

▲ 点击查看 马云在一次演讲中&#xff0c;说过这样一段话&#xff1a;现今社会&#xff0c;如果我们继续以前的教学方法对我们的孩子进行记、背、算这些东西&#xff0c;不让孩子去体验&#xff0c;去玩&#xff0c;不让他们去尝试琴棋书画。我可以保证&#xff1a;三十年后孩…

使用zipKin构建NetCore分布式链路跟踪

本文主要讲解使用ZipKin构建NetCore分布式链路跟踪场景因为最近公司业务量增加&#xff0c;而项目也需要增大部署数量&#xff0c;K8S中Pod基本都扩容了一倍&#xff0c;新增了若干物理机&#xff0c;部分物理机网络通信存在问题&#xff0c;导致部分请求打入有问题的物理机时总…

微信又添新功能!这个微信群可以学英语,而且全程免费

全世界只有3.14 % 的人关注了爆炸吧知识最近不少网友发现&#xff0c;在微信群里居然可以学英语&#xff01;而且全程免费&#xff01;群里面会有免费的英语直播课&#xff0c;免费的课程资料&#xff0c;还有专业的英语老师辅导学习。 更重要的是&#xff0c;不需要集赞&#…

C# winform 窗体接收命令行参数自动登录进行系统,模拟600个WCF客户端的并发压力测试...

我们想要达到的目的是模拟&#xff16;&#xff10;&#xff10;个客户端的消息提醒功能&#xff0c;当然我们没有&#xff16;&#xff10;&#xff10;个电脑可以拿来测试&#xff0c;我们只有&#xff14;&#xff0d;&#xff15;台电脑可以用来测试&#xff0c;那我们就想…

UpdatePanel的用法

UpdatePanel控件也是Ajax里用得最多的控件之中的一个&#xff0c;UpdatePanel控件是用来局部更新网页上的内容&#xff0c;网页上要局部更新的内容必须放在UpdatePanel控件里&#xff0c;他必须和上一次说的ScriptManager控件一起使用。如今来看UpdatePanel的属性UpdatePanel重…

JMeter压测笔记

每个资深测试工程师&#xff0c;必须掌握的测试工具&#xff0c;熟练使用Jmeter能大大提高工作效率。熟练使用Jmeter后&#xff0c; 能用Jmeter搞定的事情&#xff0c;你就不会使用LoadRunner了。Jmeter 是一款使用Java开发的&#xff0c;开源免费的&#xff0c;测试工具&#…

系统同传软件_如何戴耳机录制自己的同传练习?

在学校上课的话&#xff0c;有同传实验室的模拟会议系统可以完成同传的录制&#xff0c;但是自己的练习的时候就会出现录制的问题。曾经在一次导专课上遇到过这种尴尬&#xff0c;由于需要将自己的同传练习录音分享给老师和同学听&#xff0c;所以就要把源语和译入语都录制下来…

颜宁课题组再发Cell!1个月时间内4篇顶刊!

全世界只有3.14 % 的人关注了爆炸吧知识本文来源&#xff1a;iNature&#xff08;作者&#xff1a;枫叶&#xff09;、微博转自&#xff1a;募格学术6月15日晚&#xff0c;颜宁团队和新南威尔士大学杨洪远团队合作&#xff0c;在Cell 《细胞》在线发表了题为“Structural Basis…