在 .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

在 .NET 6 中使用 DATEONLY 和 TIMEONLY相关推荐

  1. 在.NET 6中使用DateOnly和TimeOnly

    千呼万唤始出来 在.NET 6(preview 4)中引入了两个期待已久的类型,将作为核心库的一部分.DateOnly和TimeOnly允许开发人员表示DateTime的日期或时间部分.这两个类型为值 ...

  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. hdu 2602 Bone Collector
  2. mac安装完mysql后关机特别慢_解决Mac升级到10.12后关机很慢的问题
  3. springboot 事务统一配置_Spring Boot实现分布式微服务开发实战系列(五)
  4. mysql 重复了更新_MYSql id相同就更新
  5. rbac yii 1
  6. Swift开发之简单计算器项目
  7. 使用360文件粉碎机卸载北信源软件
  8. torch.cuda.is_available()返回false——解决办法
  9. 软考嵌入式系统设计师2012年上午试题总结
  10. 特殊符号大全复制_王者荣耀名字特殊符号2019 稀有漂亮最新热门符号大全
  11. Linux内核抢占机制(preempt)
  12. 关于同比和环比的几个问题
  13. 阿里巴巴集团急招职位
  14. java8 peek
  15. 数据增广:旋转,缩放,平移以及错切
  16. python0表示剪刀_简化Python代码(石头、纸、剪刀)
  17. 百度中的高级搜索功能
  18. 金蝶EAS客户端批量执行sql代码
  19. hdu_3003Pupu(快速幂)
  20. python老是提醒双引号错误_避免最常见的python语法错误,建议收藏!

热门文章

  1. 《奠基计算机网络》清华大学出版社 之 IPv6和IPv4共存技术
  2. Hotspot hotswap, who and who are best freinds
  3. python之爬虫(四)之 Requests库的基本使用
  4. 使用Spring访问Mongodb的方法大全——Spring Data MongoDB查询指南
  5. 我到底要选择一种什么样的生活方式,度过这一辈子呢:人生自由与职业发展方向(下)...
  6. Git删除不存在对应远程分支的本地分支
  7. [for循环之等腰三角形]
  8. android 系统之ContentProvider
  9. mysql索引三个字段查询两个字段_mysql中关于关联索引的问题——对a,b,c三个字段建立联合索引,那么查询时使用其中的2个作为查询条件,是否还会走索引?...
  10. 阿里云对象存储OSS支持版本管理特性