.NET 6 中的 DateOnly 类型

在.NET 6中,引入了这种期待已久的类型作为核心库的一部分。DateOnly允许开发人员表示 DateTime 的日期部分。这种新类型是结构体(值类型),可以在您的代码独立处理日期概念时使用。这种类型都可以在 System 命名空间中找到。使用这些新类型可能与数据库允许表示类似数据的方式很好地保持一致。具体来说,这些类型与 SQL Server 日期和时间数据类型非常吻合。

这些类型对于它们所代表的内容几乎是不言自明的。当我们需要表示没有时间组件的日期时,我们可以使用 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类型