【问题标题】:DateTime.Now equivalent for TimeOnly and DateOnly?DateTime.Now 等效于 TimeOnly 和 DateOnly?
【发布时间】:2021-12-16 06:22:28
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • Now 在哪个时区?甚至日期在任何特定时刻都不相同——实际上地球的一半在不同的日期。这就是为什么新 API 要求您明确

标签: c# .net .net-core .net-6.0


【解决方案1】:

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

仅获取当前日期:

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

仅获取当前时间:

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

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

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

  • 来自@tarekgh comment,dotnet 社区正试图保持DateOnly 与时区相关

@tarekgh 的下一条评论解释了如果他们将这些属性引入DateOnly 会进一步复杂化。


在阅读了github线程和其他一些文档之后,我觉得引入DateOnlyTimeOnly结构只是为了解耦DateTime

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

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

【讨论】:

    【解决方案2】:

    解决办法:

    创建表示当前时间或日期的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,还可用于将 DateTime 的任何实例转换为 TimeOnly 或 @987654338 @。

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

    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 类(仍然是一个建议,您可以遵循它here)有一些讨论,以便使用类似于TimeOnly now = SystemClock.Local.Now,或DateOnly 之类的DateOnly today = SystemClock.Local.Today 或类似的东西。但这还没有决定。

    【讨论】:

      【解决方案3】:

      打电话给.FromDateTime()怎么样:

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

      DateOnlyTimeOnly 的文档中的详细信息。

      【讨论】:

        【解决方案4】:

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

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

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

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

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

        【讨论】:

          猜你喜欢
          • 2023-01-11
          • 1970-01-01
          • 2021-12-29
          • 2021-04-04
          • 2010-10-08
          • 2014-05-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多