千呼万唤始出来

在.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等工具三件套,便携版和安装版全部包括

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


在.NET 6中使用DateOnly和TimeOnly相关推荐

  1. 在 .NET 6 中使用 DATEONLY 和 TIMEONLY

    在 .NET 6 中使用 DATEONLY 和 TIMEONLY 在 即将发布的.NET 6中,引入了两种期待已久的类型作为核心库的一部分.DateOnly和TimeOnly允许开发人员表示 Date ...

  2. DateOnly和TimeOnly类型居然不能序列化!!! .Net 6下实现自定义JSON序列化

    前言 .Net 6引入了DateOnly和TimeOnly结构,可以存储日期和时间. 但在实际使用时,发现一个很尴尬的问题,DateOnly和TimeOnly居然不能被序列化: var builder ...

  3. .NET 6新特性试用 | DateOnly和TimeOnly类型

    前言 在.NET 6之前,没有方法来直接表示没有时间的日期(比如生日)或者没有日期的一天中的时间(比如闹钟). 虽然我们可以使用DateTime类和TimeSpan类来代替,但是实际使用中会存在一些问 ...

  4. GNU Make 使用手册(于凤昌中译版)

    GNU Make 使用手册(中译版) 翻译:于凤昌 GNU make Version 3.79 April 2000 Richard M. Stallman and Roland McGrath 1 ...

  5. Npgsql 6.0.2 发布,赶紧升级!!!

    ❝ PostgreSQL 是一种特性非常齐全的自由软件的对象-关系型数据库管理系统(ORDBMS),是以加州大学计算机系开发的 POSTGRES,4.2版本为基础的对象关系型数据库管理系统.POSTG ...

  6. .NET 6 Preview 4 已发布,这些新功能值得关注!

    作者 | WeihanLi       责编 | 欧阳姝黎 出品 | amazingdotnet 我们很高兴地发布 .NET 6 Preview 4.现在,我们到 .NET 6 正式发布尚有一半.现在 ...

  7. RAML规范1.0(译文)

    版本1.0 What's RAML ? RAML: RESTful API Modeling Language即RESTful API建模语言,是对RESTful API的一种简单直接的描述.它是一种 ...

  8. .NET周报【11月第4期 2022-11-30】

    国内文章 .NET 7 的 AOT 到底能不能扛反编译? https://www.cnblogs.com/huangxincheng/p/16917197.html 在 B 站,公众号上发了一篇 AO ...

  9. .NET 6 史上最全攻略

    欢迎使用.NET 6.今天的版本是.NET 团队和社区一年多努力的结果.C# 10 和F# 6 提供了语言改进,使您的代码更简单.更好.性能大幅提升,我们已经看到微软降低了托管云服务的成本..NET ...

最新文章

  1. Error in eval(predvars, data, env) : object ‘**‘ not found
  2. 23.C++类对象的指针为空时,调用成员函数不会挂掉
  3. android 牛人必修 ant 编译android工程
  4. 【工业控制】UV打印机喷头波形和墨水关系
  5. 每个产品经理都应该知道的机器学习术语
  6. 什么是原子操作?Linux下有哪些原子操作API
  7. latex如何取消自动编号_latex 取消自动编号
  8. php如何解决高并发问题
  9. 使用UICollectionView实现首页的滚动效果
  10. MSF之persistence权限维持
  11. 用PS绘制立体字的效果教程
  12. linux启动菜单ubuntu,在Ubuntu上用BURG来美化开机选择菜单
  13. windows server 2012 安装 VC++ 安装失败0x80240017解决方法
  14. 如何使用JS实现banner图滚动
  15. Jquery版本对IE浏览器的支持
  16. 三个等于符号 和两个等于符号的区别
  17. linux who命令详解,Linux who命令实例详解
  18. Mysterious Bacteria(唯一分解定理)
  19. EasyUi 快速入门
  20. 非线性规划与KKT(二)

热门文章

  1. ASP.NET(c#)常用类函数
  2. SEO | 重新认识一下Meta标签
  3. Java笔记:包装类、toString()方法、单例类、比较(==和equals方法)
  4. 性能测试一些相关的概念
  5. JAVA多线程之先行发生原则
  6. 洛谷 P2951 [USACO09OPEN]捉迷藏Hide and Seek
  7. jenkins2 groovy语法
  8. BZOJ3924 : [Zjoi2015]幻想乡战略游戏
  9. Echart..js插件渲染报错 data.length1?
  10. std::vectorChannel2* m_allChannels;容器,以及如何根据channelid的意义