.NET 6 中的 TimeOnly 类型

说了.NET 6 中的DateOnly类型,再说说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 点,这显然是!