Ami*_*adi 74 c# datetime .net-6.0 c#-10.0 dateonly
.NET 6 / C# 10 引入了TimeOnly
和DateOnly
结构,分别表示仅时间和日期。
好的旧DateTime
结构总是有一个Now
静态属性,它可以为您提供当前的日期和时间。
我期望TimeOnly
和DateOnly
结构具有相似的静态属性;喜欢TimeOnly.Now
或DateOnly.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
财产没有被引入DateOnly
和TimeOnly
为什么.Today
,.Now
属性UtcNow
没有介绍到DateOnly
?
DateOnly
无关@tarekgh的下一条评论解释了如果他们将这些属性引入到DateOnly
.
在阅读了 github 线程和其他几个文档之后,我觉得引入DateOnly
和TimeOnly
struct 只是为了解耦DateTime
.
这种日期和时间的解耦将有助于我们将来分别执行单独的Date
计算Time
。
这将帮助我们精确、细粒度地设计模型类。
Ami*_*adi 32
创建表示当前时间或日期的TimeOnly
或对象的方法是将静态方法与 一起DateOnly
使用。所以就像:FromDateTime
DateTime.Now
TimeOnly now = TimeOnly.FromDateTime(DateTime.Now);
DateOnly today = DateOnly.FromDateTime(DateTime.Now);
Run Code Online (Sandbox Code Playgroud)
如果这是您在项目中反复需要的东西,为了避免重复,您可以创建扩展方法来DateTime
将实例转换DateTime
为TimeOnly
or 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
,而且对于将 的任何实例转换DateTime
为TimeOnly
或 有用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
向这些结构添加属性的基本原理。
简而言之,他们不想引入时区和所有内容DateOnly
,TimeOnly
因为这会增加额外的复杂性,所以他们决定反对这一点,并保持新结构的简单和原子性。
然而,有一些关于是否可以将类似的属性添加到类中的讨论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
归档时间: |
|
查看次数: |
33776 次 |
最近记录: |