DateTime.Now 相当于 TimeOnly 和 DateOnly?

Ami*_*adi 74 c# datetime .net-6.0 c#-10.0 dateonly

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

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

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

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

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

Pra*_*kar 90

您可以使用.FromDateTime()方法,

仅获取当前日期:

var dateNow = DateOnly.FromDateTime(DateTime.Now);
Run Code Online (Sandbox Code Playgroud)

仅获取当前时间:

var timeNow = TimeOnly.FromDateTime(DateTime.Now);
Run Code Online (Sandbox Code Playgroud)

欲了解更多详细信息,您可以浏览Github Issue。有几条很好的评论解释了为什么 .Now财产没有被引入DateOnlyTimeOnly

为什么.Today.Now属性UtcNow没有介绍到DateOnly

@tarekgh的下一条评论解释了如果他们将这些属性引入到DateOnly.


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

这种日期和时间的解耦将有助于我们将来分别执行单独的Date计算Time

这将帮助我们精确、细粒度地设计模型类。

  • 遗留问题......从程序员的角度来看,感觉非常错误: var date = DateOnly.FromDateTime(DateTime.Now); (4认同)

Ami*_*adi 32

解决方案:

创建表示当前时间或日期的TimeOnly或对象的方法是将静态方法与 一起DateOnly使用。所以就像:FromDateTimeDateTime.Now

TimeOnly now = TimeOnly.FromDateTime(DateTime.Now);
DateOnly today = DateOnly.FromDateTime(DateTime.Now);
Run Code Online (Sandbox Code Playgroud)

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

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

TimeOnly now = DateTime.Now.ToTimeOnly();
DateOnly today = DateTime.Now.ToDateOnly();
Run Code Online (Sandbox Code Playgroud)

请注意,这不仅对于获取当前日期或时间为TimeOnly或有用DateOnly,而且对于将 的任何实例转换DateTimeTimeOnly或 有用DateOnly

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

public static class TimeOnlyHelpers
{
    public static TimeOnly Now => TimeOnly.FromDateTime(DateTime.Now);
}
public static class DateOnlyHelpers
{
    public static DateOnly Today => DateOnly.FromDateTime(DateTime.Now);
}
Run Code Online (Sandbox Code Playgroud)

用法:

TimeOnly now = TimeOnlyHelpers.Now;
DateOnly today = DateOnlyHelpers.Today;
Run Code Online (Sandbox Code Playgroud)

DateOnly为什么and上没有一个简单的属性TimeOnly

在此 GitHub 问题Now中讨论了为什么不Today向这些结构添加属性的基本原理。

简而言之,他们不想引入时区和所有内容DateOnlyTimeOnly因为这会增加额外的复杂性,所以他们决定反对这一点,并保持新结构的简单和原子性。

然而,有一些关于是否可以将类似的属性添加到类中的讨论Clock(仍然是一个提案,您可以在此处遵循它),以便使用类似于TimeOnly now = SystemClock.Local.Now、 或DateOnly类似DateOnly today = SystemClock.Local.Today或类似的东西。但这还没有决定。


小智 9

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

var currentDate = DateOnly.FromDateTime(DateTime.Now);
Run Code Online (Sandbox Code Playgroud)

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

var currentTime = TimeOnly.FromDateTime(DateTime.Now);
Run Code Online (Sandbox Code Playgroud)

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