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

目录
  • 前言:
  • 举例
    • ​1.创建实例​
    • ​2.类型转换​
    • ​3.操作​
  • 结论:

前言:

在.NET 6之前,没有方法来直接表示没有时间的日期(比如生日)或者没有日期的一天中的时间(比如闹钟)。

虽然我们可以使用DateTime类和TimeSpan类来代替,但是实际使用中会存在一些问题:

var dateOnly = new DateTime(2021, 10, 1);
//输出
2021/10/1 0:00:00
//问题:还是有时间,并不能代表0点出生

var timeOnly = new TimeSpan(11, 22, 0).Add(TimeSpan.FromHours(24));
//输出
1.11:22:00
//问题:过了24小时,应该还是当前时间,实际带了天数

因此,.Net 6引入了DateOnly和TimeOnly结构,可以存储日期和时间

举例

​1.创建实例​

我们可以直接创建DateOnly或者TimeOnly的实例:

var dateOnly = new DateOnly(2021, 10, 1);
//输出
10/1/2021

var timeOnly = new TimeOnly(11, 22, 0);
//输出
11:22 AM

还可以使用​​FromDateTime​​方法从DateTime实例中生成:

var datetime = new DateTime(2021, 10, 1, 10, 1, 0);

var dateOnly = DateOnly.FromDateTime(datetime);

var timeOnly = TimeOnly.FromDateTime(datetime);

还可以使用​​FromTimeSpan​​方法从TimeSpan实例中生成TimeOnly:

var timeSpan = new TimeSpan(11, 22, 0);
 
var timeOnly = TimeOnly.FromTimeSpan(timeSpan);

​2.类型转换​

反之,可以使用​​ToDateTime​​方法将DateOnly实例转换成DateTime:

var dateOnly = new DateOnly(2021, 10, 1);

var timeOnly = new TimeOnly(11, 22, 0);

var datetime = dateOnly.ToDateTime(timeOnly);
//输出
10/1/2021 11:22:00 AM

可以看到,必须同时带上TimeOnly实例才能转换。

也可以使用​​ToTimeSpan​​方法将TimeOnly实例转换成TimeSpan:

var timeOnly = new TimeOnly(11, 22, 0);

var timeSpan = timeOnly.ToTimeSpan();
//输出
11:22:00

​3.操作​

DateOnly和TimeOnly类型还提供了比较运算符(例如​​<​​​和​​>​​​)和​​AddXXX​​方法进行操作:

var noon = new TimeOnly(12, 0);
if (now < noon)
{
    //早上
    ...
}

dateOnly = dateOnly.AddDays(7);

timeOnly = timeOnly.AddHours(24);

需要注意的是:仅仅TimeOnly类型支持​​-​​运算符,获得TimeSpan时间间隔。

结论:

​DateOnly和TimeOnly的引入并不意味着DateTime将不再有用,只是将它们用在不同场景。

到此这篇关于.NET 6新特性试用之DateOnly和TimeOnly类型的文章就介绍到这了,更多相关DateOnly和TimeOnly类型内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • .NET 6新特性试用之Nuget包验证

    目录 前言: Demo 结论: 前言: 我们常常需要将.NET类库打包成Nuget包,以便多个项目公用. 一旦修改类库,​尽管代码可以运行​,并成功打包成新版本​,看起来一切正常​,​但是​你无法保证该更改是安全且兼容的. 而在.Net 6中,提供了包验证工具,帮助我们检测这一点. Demo 使用方式也非常简单,只需修改项目文件,加上​​EnablePackageValidation​​属性: <EnablePackageValidation>true</EnablePackageVal

  • .NET 6中使用DateOnly和TimeOnly类型

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

  • 基于 .NET 6 的ASP.NET Core启动地址配置方法及优先级顺序

    目录 前言: 一.设置方法 ​1.applicationUrl属性​ ​2.环境变量​ ​3.命令行参数​ ​4.UseUrls方法​ .NET5版本 .NET6版本 ​5.UseKestrel方法​ ​6.WebApplication.Urls.Add方法​ ​7.appsettings.json文件​ 二.优先级 三.结论 前言: 上次,我们讨论了如何通过配置或代码方式修改启动地址:<​ ​ASP.NET Core启动地址配置方法及优先级顺序​​>.不过是基于 .NET 5 版本的. 由于

  • .NET 6新特性试用之DateOnly和TimeOnly类型

    目录 前言: 举例 ​1.创建实例​ ​2.类型转换​ ​3.操作​ 结论: 前言: 在.NET 6之前,没有方法来直接表示没有时间的日期(比如生日)或者没有日期的一天中的时间(比如闹钟). 虽然我们可以使用DateTime类和TimeSpan类来代替,但是实际使用中会存在一些问题: var dateOnly = new DateTime(2021, 10, 1); //输出 2021/10/1 0:00:00 //问题:还是有时间,并不能代表0点出生 var timeOnly = new Ti

  • .NET 6新特性试用之DateOnly和TimeOnly类型

    目录 前言: 举例 ​1.创建实例​ ​2.类型转换​ ​3.操作​ 结论: 前言: 在.NET 6之前,没有方法来直接表示没有时间的日期(比如生日)或者没有日期的一天中的时间(比如闹钟). 虽然我们可以使用DateTime类和TimeSpan类来代替,但是实际使用中会存在一些问题: var dateOnly = new DateTime(2021, 10, 1); //输出 2021/10/1 0:00:00 //问题:还是有时间,并不能代表0点出生 var timeOnly = new Ti

  • .NET 6新特性试用之常量内插字符串

    目录 前言: 一.常量内插字符串 结论: 前言: 编写代码时,我们常常需要组合字符串. 如下代码: string scheme = "https"; string host = "xxx.com"; int port = 8080; Console.WriteLine(string.Format("{0}://{1}:{2}", scheme, host, port)); 但是,这种替换方式容易会产生错误,比如写错参数顺序,索引数字无效等. 因此

  • .NET 6新特性试用之TryGetNonEnumeratedCount 方法

    目录 前言: 一.举例 二.原理 结论: 前言: .NET 6新增了​​TryGetNonEnumeratedCount​​方法,计算可枚举类型的元素总数. LINQ不是已经有了​​Count​​方法吗,为什么还要画蛇添足呢? 下文来看看具体情况!!! 一.举例 尝试下列代码: var b = new B<int>(); Console.WriteLine($@"{b.Count()}"); var a = new A<int>(); Console.Write

  • .NET 6新特性试用之System.Text.Json功能改进

    目录 前言: Demo ​1.属性排序​ ​2.序列化通知​ 结论: 前言: ​​System.Text.Json​​作为.NET默认的JSON序列化和反序列化类库,让我们看看,在.NET 6中有哪些功能上的改进? Demo ​1.属性排序​ 在属性上声明​​JsonPropertyOrderAttribute​​来控制属性序列化的顺序,而以前,顺序是由反射顺序决定的,是不确定的. 示例代码如下: public class User {     public int Age { get; set

  • .NET 6新特性试用之System.Text.Json功能改进

    目录 前言: Demo ​1.属性排序​ ​2.序列化通知​ 结论: 前言: ​​System.Text.Json​​作为.NET默认的JSON序列化和反序列化类库,让我们看看,在.NET 6中有哪些功能上的改进? Demo ​1.属性排序​ 在属性上声明​​JsonPropertyOrderAttribute​​来控制属性序列化的顺序,而以前,顺序是由反射顺序决定的,是不确定的. 示例代码如下: public class User {     public int Age { get; set

  • .NET 6新特性试用之常量内插字符串

    目录 前言: 常量内插字符串 结论: 前言: 编写代码时,我们常常需要组合字符串. 如下代码: string scheme = "https"; string host = "xxx.com"; int port = 8080; Console.WriteLine(string.Format("{0}://{1}:{2}", scheme, host, port)); 但是,这种替换方式容易会产生错误,比如写错参数顺序,索引数字无效等. 因此,推

  • .NET 6新特性试用Timer类之PeriodicTimer 

    目录 前言: 一.Demo 结论: 前言: 在.NET中,已经存在了5个Timer类: System.Threading.Timer System.Timers.Timer System.Web.UI.Timer System.Windows.Forms.Timer System.Windows.Threading.DispatcherTimer 不管以前这样设计的原因,现在.NET 6又为我们增加了一个新Timer,​​PeriodicTimer​​. 这又是为什么呢? 一.Demo 与其他T

随机推荐