在.NET 6中使用DateOnly和TimeOnly

千呼万唤始出来

在.NET 6(preview 4)中引入了两个期待已久的类型,将作为核心库的一部分。DateOnly和TimeOnly允许开发人员表示DateTime的日期或时间部分。这两个类型为值类型(struct type),可以在代码中独立处理日期或时间概念时使用,它们定义在System命名控件中,使用它们可以与数据库中允许表示相同类型数据的方式保持一致。具体来说,这些类型与SQL Server数据库中日期和时间类型可以很好的进行匹配。

注意:如果你要使用这两种类型,需要下载并安装.NET 6(preview 4)和Visual Studio 16.11(目前处于预览版中)。如果你想测试一下如何使用,可以使用LinqPad进行测试验证。

在.NET 6中使用DateOnly类型

根据字面意思可以很容易看出它所要表达的意思。当我们需要表示一个没有时间信息的日期类型时,可以使用DateOnly。例如,我们可以在应用程序中表示某人的出生日期。在这种情况下,我们很少需要使用到DateTime类型的时间部分了。一个标准的解决方案时将时间设置为:00:00:00.000。但是使用DateOnly,我们可以更明确的表明我们想要的意图。

我们可以通过年、月、日参数构建一个DateOnly的实例。

var date = new DateOnly(2021, 5, 31);

这样,我们就创建了一个表示2021年5月31日的日期类型。在内部,DataOnly结构使用一个整数来跟踪一个有效天数的时间范围:0(映射为0001年1月1日)-3652058(映射为9999年12月31日)。

通常情况下,我们会从一个现有的DateTime类型的实例开始,希望从它创建一个DateOnly实例。为了实现这一点,我们可以调用FromDateTime方法。

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

与现有的DateTime类型一样,我们也可以使用Parse或TryParse方法将表示日期的字符串解析为DateOnly类型,这两个方法可能会抛出异常,或返回指示成功或失败的bool值。

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

上面的代码尝试从第一个参数(日期的字符串表示)解析日期。由于不同的国家和地区对日期的解释不同,因此日期的解析可能或受到文化的影响。在这个例子中,明确提供CultureInfo选项,以确保它使用日/月/年的格式从字符串中正确解析。在成功解析成DateOnly实例的情况下,它将被写入控制台。再一次强调:CultureInfo选择在这里扮演着重要角色。在本例中,将使用正在运行的线程的当前区域性来确定所使用的格式。根据系统配置,在应用程序线程在en-GB下运行。因此字符串被正确格式化。在LinqPad输出结果:

我们还可以向DateOnly实例中调用AddDays、AddMonths和AddYears方法,以创建一个新的日期类型的实例。

var newDateOnly = 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小时制格式,这样 1 PM 就是13时。

在内部,TimeOnly存储了一个long类型,它表示自定义时间从凌晨后经过的Ticks(100纳秒一个tick)。例如,凌晨1点时一天中的第一个小时,因此,从凌晨开始就有360亿个Tick(00:00:00.0000000)。虽然我们可以通过提供Ticks作为参数来构造TimeOnly。但这个实现细节对于一般使用来说并不是必需的。

public TimeOnly(long ticks);

在定义了开始时间之后,我们可以使用另一个TimeOnly实例定义一个结束时间为5PM。

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

现在就可以对这些TimeOnly实例进行数学操作,比如计算差。

var diff = endTime - startTime;

该操作返回类型是TimeSpan,记录了两个TimeOnly值之间相差的小时数。可以看LinqPad的输出结果。

我们可以执行的另一个检查时识别特定的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 AM)和17:00(5 PM)之间。LinqPad输出的结果进行了稍微的改变,用来输出当前时间。

方法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

LinqPad中的最后一行的输出内容。

TimeOnly还包括用于比较使用循环时钟的时间操作符。

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

这段代码检查上午8点是否早于上午9点,显然是早于9点的。

总结

面向 .NET 6 的新应用程序中,如果您的数据需要独立表示日期或时间,那么 DateOnly 和 TimeOnly 值得考虑。

你喜欢这篇文章吗?觉得它有用吗?如果有,请考虑支持我

广告时间:如果你身边有正在做化妆品的朋友,可以给他们推荐一下。或者自己的女朋友正在为美丽而烦恼,请推荐给你的女朋友!

— END —

「扩展阅读」

Xamarin.Forms: 无限滚动的ListView(懒加载方式)

[GitHub] 75+的 C# 数据结构和算法实现

谁说.NET不适合搞BD,ML、AI

推荐一个集录屏、截图、音频于一体的软件给大家

10个用于C#.NET开发的基本调试工具

Xamarin.Forms 二维码扫描实践

在Asp.Net Core MVC 开发过程中遇到的问题总结

前端小白在asp.net core mvc中使用ECharts

基于Asp.Net Core MVC和AdminLTE的响应式管理后台之侧边栏处理

[译]如何在C#中调试LINQ查询

C# 语言性能提升方法

使用MQTTnet搭建Mqtt服务器

OxyPlot在WinForm中的应用

「公众号推荐」

回复:「rdm」 获取Redis Desktop Manager版的安装包

回复:「redis」 获取5.0.9版的Windows安装包(exe)

回复:「ca」 获取  截图、GIF等工具三件套,便携版和安装版全部包括

「加号主回复”入群“」即可加入群聊



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

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

相关文章

预售┃要孩子逻辑清晰、善于思考,别忽视空间想象力的游戏锻炼!

▲数据汪特别推荐点击上图进入玩酷屋在之前的文章时&#xff0c;马斯提到数学存在一种现象叫“梯次掉队”&#xff0c;原因在于孩子的数学思维地基没有打牢。&#xff08;传送门&#xff09;提到初中孩子需要空间想象能力时&#xff0c;很多父母疑惑为何需要&#xff1f;关于这…

通过Dapr实现一个简单的基于.net的微服务电商系统(十六)——dapr+sentinel中间件实现服务保护...

dapr目前更新到了1.2版本&#xff0c;在之前4月份的时候来自阿里的开发工程师发起了一个dapr集成Alibaba Sentinel的提案&#xff0c;很快被社区加入到了1.2的里程碑中并且在1.2 release 相关升级文档里可以看到已经实现了对Alibaba Sentinel的支持。今天我们就讲讲我们如何通过…

预售┃让苹果CEO库克折服的程序员仅10岁!?

▲数据汪特别推荐点击上图进入玩酷屋在国外&#xff0c;编程教育课早已普及&#xff0c;美国、英国、新加坡等国家少儿编程已进入小学标准必修课程体系。韩国、日本也相继在2017年和2020年开展一年级至初三的编程教育普及。美国总统孙女&#xff0c;五岁开始学习在电脑上编程最…

java 字符串小写_Java字符串如何转换大小写?

程序开发中,经常需要对字符串进行转换操作,例如将字符串转换成数组的形式,将字符串中的字符进行大小写转换等。接下来通过一个案例来演示字符串的转换操作。 public class string03 {public static void main(String[] args) {String str="abcd"; System.out.prin…

入门机器学习,就这么简单!

AI这个词相信大家都非常熟悉&#xff0c;近几年来人工智能圈子格外热闹&#xff0c;光是AlphoGo就让大家对它刮目相看。今天小天就来跟大家唠一唠如何进军人工智能的第一步——机器学习。在机器学习领域&#xff0c;Python已经成为了主流。一方面因为这门语言简单易上手&#x…

java 生成jar_java如何生成jar

将*.class文件压缩成一个文件交付给用户使用&#xff0c;那么这样的文件就称为jar文件。如果要想生成jar文件&#xff0c;直接使用JDK中bin目录里的jar.exe就可以将所有的类文件进行压缩。此命令是随JDK一起安装的&#xff0c;直接在命令行中输入jar&#xff0c;即可看到此命令…

windows server 2012 dhcp 配置故障转移

在前面&#xff0c;青年怪客搭建的活动目录服务&#xff0c;在前面的内容中&#xff0c;我希望能在一个企业中&#xff0c;有一到两台域服务器可以管理我们企业内容中的计算机&#xff0c;但是一般的企业都是需要DHCP服务器的&#xff0c;为此我在前面的内容中&#xff0c;也配…

程序猿秃顶算工伤吗?

全世界只有3.14 % 的人关注了数据与算法之美在各个年龄段的程序猿中&#xff0c;70后以年龄优势遥遥领先&#xff0c;80后开始油腻&#xff0c;90后开始掉发&#xff0c;掉发的迅猛程度隐隐有赶超80后的趋势&#xff0c;脱单已然不是他们最担心的问题&#xff0c;脱发才是!程序…

web容器获取SSL指纹实现和ByPass

前言前段时间对SSL指纹的获取实现很感兴趣&#xff0c;从表面到深入再到实现让我更加深刻理解SSL设计。本篇介绍&#xff1a;SSL指纹在web容器(Kestrel)下如何获取&#xff0c;并实现一个Middleware来很方便集成到web工程里面(下文附源码地址)。解析ClientHello的套路以及如何生…

许可证( License LicenseLicenseLicenseLicenseLicense)服务器配置

在这里我要说明一下&#xff0c;如果你没有lic文件&#xff0c;可以到官方注册帐号&#xff0c;进行申请&#xff0c;我这里我申请的是一个90天的试用的序列号&#xff0c;下面是我在配置过程中的一些截图发出来。大家可以看一下。 老样子&#xff0c;开机过几秒中会提示出来的…

java struts 文件下载_Struts2文件下载实例

通过《Struts2文件下载简介》教程的学习&#xff0c;读者已经了解了使用 Struts2 框架实现在指定的目录中下载指定文件的功能。下面通过案例演示文件下载功能。1)创建下载页面在 struts2Demo06 项目的 WebContent 目录下创建一个名称为 download.jsp 的页面文件&#xff0c;在文…

预售┃16个有趣的海洋实验,美到让人窒息!

▲数据汪特别推荐点击上图进入玩酷屋我们的孩子&#xff0c;在科技发展迅速的年代&#xff0c;从出生就接触着各种高科技&#xff0c;接触电子产品已经是必然。但小木时常在想&#xff0c;除了ipad和那些普通的玩具&#xff0c;我们还能给孩子玩儿些什么呢&#xff1f;有没有宝…

深入LINQ | 揭开IQueryable的面纱

原文&#xff1a;bit.ly/3uAXliC作者&#xff1a;Jeremy Likness译者&#xff1a;精致码农-王亮在上一篇深入LINQ | 动态构建LINQ表达式 博文中&#xff0c;我们探索了表达式的强大&#xff0c;并用它来动态地构建一个基于 JSON 的规则引擎。在这篇文章中&#xff0c;我们反过来…

科幻作家阿西莫夫上世纪预言2019: 计算机彻底变革教育,太空移民进行中

全世界只有3.14 % 的人关注了数据与算法之美2019年必将是充满机遇与挑战的一年&#xff0c;一年的时间世界可能发生很大的变化。我们应该如何期待新的一年&#xff1f;在这&#xff0c;数据汪带大家重新读1983年美国作家艾萨克阿西莫夫&#xff08;Isaac Asimov&#xff09;对2…

6月程序员平均工资出炉,你拖后腿了吗?

据有关部门统计&#xff1a;6月份全国招收程序员435501人&#xff0c;平均工资为15052元&#xff0c;很多小伙伴儿纷纷感慨工资被平均了。然而6月程序员工资的中位数却是13000元&#xff0c;这说明什么&#xff1f;也许不是被平均&#xff0c;而是真的拖后腿了&#xff0c;下面…

学习爬虫限时只需9.9,还在犹豫什么?

收拾行李回老家的小天&#xff0c;新春福利还是要准时送到大家手上的&#xff01;随着互联网的发展&#xff0c;google、百度等搜索引擎让我们获取信息愈加方便。Python是当今世界最热门的编程语言之一&#xff0c;在科研领域也发挥着强大的作用&#xff0c;尤其是在日常的学习…

如何快速正确的安装 Ruby, Rails 运行环境

2019独角兽企业重金招聘Python工程师标准>>> 系统需求 首先确定操作系统环境&#xff0c;不建议在 Windows 上面搞&#xff0c;所以你需要用: Mac OS X任意 Linux 发行版本(Ubuntu,CentOS, Redhat, ArchLinux ...)强烈新手使用 Ubuntu 省掉不必要的麻烦&#xff01;…

你怕是对MD5算法有误解

大家常听到“MD5加密”、“对称加密”、“非对称加密”&#xff0c;那么MD5属于哪种加密算法&#xff1f;面试官问这样的问题&#xff0c;准是在给你挖坑。"MD5加密"纯属口嗨&#xff0c;MD5不是加密算法&#xff0c;是摘要算法。今天小码甲带大家梳理加密算法、摘要…

还在集什么五福,史上最惨锦鲤再次来袭!奖品堪比5年高考3年模拟!

全世界只有3.14 % 的人关注了数据与算法之美在锦鲤盛行的2018年我们超级数学建模也跟风来了一个“史上最惨锦鲤”活动为什么叫史上最惨锦鲤呢因为平常看一本数学书就已经头疼了何况我们奖品还是100本数学书试问除了学霸还有谁能承受这种殊荣巧的是最后的得主还真是一个学霸那就…

Python: logging日志模块简单示例

2019独角兽企业重金招聘Python工程师标准>>> Python的logging模块提供了通用的日志系统&#xff0c;可以方便第三方模块或者是应用使用。这个模块提供不同的日志级别&#xff0c;并可以采用不同的方式记录日志&#xff0c;比如文件&#xff0c;HTTP GET/POST&#x…