.NET 6/ C# 10引入了TimeOnly和DateOnly结构,分别表示时间和日期。
好的旧DateTime结构总是具有一个Now静态属性,它将为您提供当前的日期和时间。
我原以为TimeOnly和DateOnly结构都具有类似的静态属性;比如TimeOnly.Now或DateOnly.Today,但它们显然没有。
那么,如果我想要一个DateOnly对象表示当前日期,或者一个TimeOnly对象表示当前时间,我应该做什么呢?
我也想知道为什么他们决定不在这两个新结构中包含这样的属性?
发布于 2021-11-01 14:40:41
解决办法:
创建表示当前时间或日期的TimeOnly或DateOnly对象的方法是使用FromDateTime静态方法和DateTime.Now。就像:
TimeOnly now = TimeOnly.FromDateTime(DateTime.Now);
DateOnly today = DateOnly.FromDateTime(DateTime.Now);如果这是您在项目中反复需要的,为了避免重复,您可以在DateTime上创建扩展方法,将DateTime实例转换为TimeOnly或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);
}
}用法:
TimeOnly now = DateTime.Now.ToTimeOnly();
DateOnly today = DateTime.Now.ToDateOnly();请注意,这不仅对于将当前日期或时间获取为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);
}用法:
TimeOnly now = TimeOnlyHelpers.Now;
DateOnly today = DateOnlyHelpers.Today;为什么DateOnly和TimeOnly上没有一个简单的属性
为什么没有向这些结构中添加Now或Today属性的原因在这个GitHub问题中进行了讨论。
简而言之,他们不想在DateOnly和TimeOnly中引入时区和所有东西,因为这会增加额外的复杂性,所以他们决定不这样做,并保持新的结构简单明了。
然而,对于这样的属性是否可以添加到Clock类(仍然是一个提议,您可以遵循这里)进行了一些讨论,这样就可以按照TimeOnly now = SystemClock.Local.Now的方式使用,或者像DateOnly today = SystemClock.Local.Today这样的DateOnly之类的东西。但这还没决定。
发布于 2021-11-01 14:28:10
你可以使用.FromDateTime()方法,
仅获取当前日期:
var dateNow = DateOnly.FromDateTime(DateTime.Now);仅获取当前时间:
var timeNow = TimeOnly.FromDateTime(DateTime.Now);有关更多细节,您可以通过Github问题查看。有几个很好的注释可以解释为什么没有将.Now属性引入DateOnly和TimeOnly
为什么.Today**,** .Now 和 UtcNow 属性没有引入到 DateOnly**?**
DateOnly 而不是与时区相关。接下来来自@tarekgh的评论,解释了如果它们将这些属性引入DateOnly,就会进一步解释复杂性。
在阅读了github线程和其他几个文档之后,我觉得引入DateOnly和TimeOnly结构只是为了将DateTime解耦。
这种日期和时间的脱钩将有助于我们在未来分别在Date和Time上执行单独的计算。
这将帮助我们精确地设计模型类,并在粒度级别上进行设计。
发布于 2021-11-01 14:31:42
要获取表示当前日期的DateOnly对象,可以使用:
var currentDate = DateOnly.FromDateTime(DateTime.Now);类似地,要获取表示当前日期的TimeOnly对象,可以使用:
var currentTime = TimeOnly.FromDateTime(DateTime.Now);在这里详细讨论了不包括.Now属性的原因:https://github.com/dotnet/runtime/issues/53498
https://stackoverflow.com/questions/69798302
复制相似问题