DateTime.Now 等效于 TimeOnly 和 DateOnly?

DateTime.Now equivalent for TimeOnly and DateOnly?

.NET 6 / C# 10 引入了 TimeOnlyDateOnly 结构,分别表示时间和日期。

旧的 DateTime 结构总是有一个 Now 静态 属性 可以为您提供当前日期和时间。

我期望 TimeOnlyDateOnly 结构具有相似的静态属性;喜欢 TimeOnly.NowDateOnly.Today,但他们显然不喜欢。

那么,如果我想要一个代表当前日期的DateOnly对象,或者一个代表当前时间的TimeOnly对象,我该怎么办?

而且我还想知道为什么他们决定不在这两个新结构中包含这样的属性?

如何调用 .FromDateTime():

var date = DateOnly.FromDateTime(DateTime.UtcNow);
var time = TimeOnly.FromDateTime(DateTime.UtcNow);

有关 DateOnly and TimeOnly 的文档中的详细信息。

可以使用.FromDateTime()方法,

仅获取当前日期:

var dateNow = DateOnly.FromDateTime(DateTime.Now);

仅获取当前时间:

var timeNow = TimeOnly.FromDateTime(DateTime.Now);

更多详情,您可以通过Github issue。有几个很好的评论解释了,为什么 .Now 属性 没有被引入到 DateOnlyTimeOnly

为什么.Today.NowUtcNow属性没有引入DateOnly

  • @tarekgh comment 开始,dotnet 社区正在努力保持 DateOnly 与时区相关

来自 @tarekgh 的下一条评论解释了如果将这些属性引入 DateOnly 会更加复杂。


阅读 github 线程和其他几个文档后,我觉得引入 DateOnlyTimeOnly 结构只是为了解耦 DateTime.

这种日期和时间的解耦将有助于我们将来分别对 DateTime 进行单独计算。

这将帮助我们设计模型 类 精确且精细。

要获取表示当前日期的 DateOnly 对象,您可以使用:

var currentDate = DateOnly.FromDateTime(DateTime.Now);

同样,要获取表示当前日期的TimeOnly对象,您可以使用:

var currentTime = TimeOnly.FromDateTime(DateTime.Now);

这里详细讨论了不包括 .Now 属性 背后的原因: https://github.com/dotnet/runtime/issues/53498

解决方法:

创建表示当前时间或日期的 TimeOnlyDateOnly 对象的方法是使用 FromDateTime 静态方法和 DateTime.Now。所以喜欢:

TimeOnly now = TimeOnly.FromDateTime(DateTime.Now);
DateOnly today = DateOnly.FromDateTime(DateTime.Now);

如果这是您在项目中反复需要的东西,为了避免重复,您可以在 DateTime 上创建扩展方法以将 DateTime 实例转换为 TimeOnlyDateOnly:

public static class DateTimeExtensions
{
    public static TimeOnly ToTimeOnly(this DateTime dateTime)
    {
        return TimeOnly.FromDateTime(dateTime);
    }

    public static DateOnly ToDateOnly(this DateTime dateTime)
    {
        return DateOnly.FromDateTime(dateTime);
    }
}

用法:

TimeOnly now = DateTime.Now.ToTimeOnly();
DateOnly today = DateTime.Now.ToDateOnly();

请注意,这不仅对获取 当前 日期或时间有用 TimeOnlyDateOnly,而且对转换 [= =19=] 到 TimeOnlyDateOnly.

另一种方法是有两个静态 classes,如下所示:

public static class TimeOnlyHelpers
{
    public static TimeOnly Now => TimeOnly.FromDateTime(DateTime.Now);
}
public static class DateOnlyHelpers
{
    public static DateOnly Today => DateOnly.FromDateTime(DateTime.Now);
}

用法:

TimeOnly now = TimeOnlyHelpers.Now;
DateOnly today = DateOnlyHelpers.Today;

为什么 DateOnlyTimeOnly 上没有简单的 属性?

this GitHub issue.

中讨论了为什么没有 NowToday 属性被添加到这些结构背后的基本原理

简而言之,他们不想将时区和所有内容引入 DateOnlyTimeOnly,因为这会增加额外的复杂性,因此他们决定不这样做,并保持新结构简单和明确的。

但是有一些讨论关于是否可以将这样的属性添加到Clock class中(仍然是提案,您可以按照它here)这样用法就类似于 TimeOnly now = SystemClock.Local.Now,或者 DateOnly 类似于 DateOnly today = SystemClock.Local.Today 或类似的东西。但这还没有定论。