首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DateTime.Now等价于TimeOnly和DateOnly?

DateTime.Now等价于TimeOnly和DateOnly?
EN

Stack Overflow用户
提问于 2021-11-01 14:23:38
回答 3查看 11.3K关注 0票数 37

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

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

我原以为TimeOnlyDateOnly结构都具有类似的静态属性;比如TimeOnly.NowDateOnly.Today,但它们显然没有。

那么,如果我想要一个DateOnly对象表示当前日期,或者一个TimeOnly对象表示当前时间,我应该做什么呢?

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-11-01 14:40:41

解决办法:

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

代码语言:javascript
复制
TimeOnly now = TimeOnly.FromDateTime(DateTime.Now);
DateOnly today = DateOnly.FromDateTime(DateTime.Now);

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

代码语言:javascript
复制
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);
    }
}

用法:

代码语言:javascript
复制
TimeOnly now = DateTime.Now.ToTimeOnly();
DateOnly today = DateTime.Now.ToDateOnly();

请注意,这不仅对于将当前日期或时间获取为TimeOnlyDateOnly非常有用,而且对于将DateTime的任何实例转换为TimeOnlyDateOnly都很有用。

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

代码语言:javascript
复制
public static class TimeOnlyHelpers
{
    public static TimeOnly Now => TimeOnly.FromDateTime(DateTime.Now);
}
public static class DateOnlyHelpers
{
    public static DateOnly Today => DateOnly.FromDateTime(DateTime.Now);
}

用法:

代码语言:javascript
复制
TimeOnly now = TimeOnlyHelpers.Now;
DateOnly today = DateOnlyHelpers.Today;

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

为什么没有向这些结构中添加NowToday属性的原因在这个GitHub问题中进行了讨论。

简而言之,他们不想在DateOnlyTimeOnly中引入时区和所有东西,因为这会增加额外的复杂性,所以他们决定不这样做,并保持新的结构简单明了。

然而,对于这样的属性是否可以添加到Clock类(仍然是一个提议,您可以遵循这里)进行了一些讨论,这样就可以按照TimeOnly now = SystemClock.Local.Now的方式使用,或者像DateOnly today = SystemClock.Local.Today这样的DateOnly之类的东西。但这还没决定。

票数 19
EN

Stack Overflow用户

发布于 2021-11-01 14:28:10

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

仅获取当前日期:

代码语言:javascript
复制
var dateNow = DateOnly.FromDateTime(DateTime.Now);

仅获取当前时间:

代码语言:javascript
复制
var timeNow = TimeOnly.FromDateTime(DateTime.Now);

有关更多细节,您可以通过Github问题查看。有几个很好的注释可以解释为什么没有将.Now属性引入DateOnlyTimeOnly

为什么.Today**,** .Now UtcNow 属性没有引入到 DateOnly**?**

  • @tarekgh评论,dotnet社区试图保持DateOnly 而不是与时区相关。

接下来来自@tarekgh的评论,解释了如果它们将这些属性引入DateOnly,就会进一步解释复杂性。

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

这种日期和时间的脱钩将有助于我们在未来分别在DateTime上执行单独的计算。

这将帮助我们精确地设计模型类,并在粒度级别上进行设计。

票数 47
EN

Stack Overflow用户

发布于 2021-11-01 14:31:42

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

代码语言:javascript
复制
var currentDate = DateOnly.FromDateTime(DateTime.Now);

类似地,要获取表示当前日期的TimeOnly对象,可以使用:

代码语言:javascript
复制
var currentTime = TimeOnly.FromDateTime(DateTime.Now);

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69798302

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档