DateTime.Now 等效于 TimeOnly 和 DateOnly?
DateTime.Now equivalent for TimeOnly and DateOnly?
.NET 6 / C# 10 引入了 TimeOnly
和 DateOnly
结构,分别表示时间和日期。
旧的 DateTime
结构总是有一个 Now
静态 属性 可以为您提供当前日期和时间。
我期望 TimeOnly
和 DateOnly
结构具有相似的静态属性;喜欢 TimeOnly.Now
或 DateOnly.Today
,但他们显然不喜欢。
那么,如果我想要一个代表当前日期的DateOnly
对象,或者一个代表当前时间的TimeOnly
对象,我该怎么办?
而且我还想知道为什么他们决定不在这两个新结构中包含这样的属性?
如何调用 .FromDateTime()
:
var date = DateOnly.FromDateTime(DateTime.UtcNow);
var time = TimeOnly.FromDateTime(DateTime.UtcNow);
可以使用.FromDateTime()
方法,
仅获取当前日期:
var dateNow = DateOnly.FromDateTime(DateTime.Now);
仅获取当前时间:
var timeNow = TimeOnly.FromDateTime(DateTime.Now);
更多详情,您可以通过Github issue。有几个很好的评论解释了,为什么 .Now
属性 没有被引入到 DateOnly
和 TimeOnly
为什么.Today
、.Now
和UtcNow
属性没有引入DateOnly
?
- 从 @tarekgh comment 开始,dotnet 社区正在努力保持
DateOnly
不 与时区相关
来自 @tarekgh 的下一条评论解释了如果将这些属性引入 DateOnly
会更加复杂。
阅读 github 线程和其他几个文档后,我觉得引入 DateOnly
和 TimeOnly
结构只是为了解耦 DateTime
.
这种日期和时间的解耦将有助于我们将来分别对 Date
和 Time
进行单独计算。
这将帮助我们设计模型 类 精确且精细。
要获取表示当前日期的 DateOnly 对象,您可以使用:
var currentDate = DateOnly.FromDateTime(DateTime.Now);
同样,要获取表示当前日期的TimeOnly对象,您可以使用:
var currentTime = TimeOnly.FromDateTime(DateTime.Now);
这里详细讨论了不包括 .Now 属性 背后的原因:
https://github.com/dotnet/runtime/issues/53498
解决方法:
创建表示当前时间或日期的 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
,而且对转换 [= =19=] 到 TimeOnly
或 DateOnly
.
另一种方法是有两个静态 classes,如下所示:
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
属性被添加到这些结构背后的基本原理
简而言之,他们不想将时区和所有内容引入 DateOnly
和 TimeOnly
,因为这会增加额外的复杂性,因此他们决定不这样做,并保持新结构简单和明确的。
但是有一些讨论关于是否可以将这样的属性添加到Clock
class中(仍然是提案,您可以按照它here)这样用法就类似于 TimeOnly now = SystemClock.Local.Now
,或者 DateOnly
类似于 DateOnly today = SystemClock.Local.Today
或类似的东西。但这还没有定论。
.NET 6 / C# 10 引入了 TimeOnly
和 DateOnly
结构,分别表示时间和日期。
旧的 DateTime
结构总是有一个 Now
静态 属性 可以为您提供当前日期和时间。
我期望 TimeOnly
和 DateOnly
结构具有相似的静态属性;喜欢 TimeOnly.Now
或 DateOnly.Today
,但他们显然不喜欢。
那么,如果我想要一个代表当前日期的DateOnly
对象,或者一个代表当前时间的TimeOnly
对象,我该怎么办?
而且我还想知道为什么他们决定不在这两个新结构中包含这样的属性?
如何调用 .FromDateTime()
:
var date = DateOnly.FromDateTime(DateTime.UtcNow);
var time = TimeOnly.FromDateTime(DateTime.UtcNow);
可以使用.FromDateTime()
方法,
仅获取当前日期:
var dateNow = DateOnly.FromDateTime(DateTime.Now);
仅获取当前时间:
var timeNow = TimeOnly.FromDateTime(DateTime.Now);
更多详情,您可以通过Github issue。有几个很好的评论解释了,为什么 .Now
属性 没有被引入到 DateOnly
和 TimeOnly
为什么.Today
、.Now
和UtcNow
属性没有引入DateOnly
?
- 从 @tarekgh comment 开始,dotnet 社区正在努力保持
DateOnly
不 与时区相关
来自 @tarekgh 的下一条评论解释了如果将这些属性引入 DateOnly
会更加复杂。
阅读 github 线程和其他几个文档后,我觉得引入 DateOnly
和 TimeOnly
结构只是为了解耦 DateTime
.
这种日期和时间的解耦将有助于我们将来分别对 Date
和 Time
进行单独计算。
这将帮助我们设计模型 类 精确且精细。
要获取表示当前日期的 DateOnly 对象,您可以使用:
var currentDate = DateOnly.FromDateTime(DateTime.Now);
同样,要获取表示当前日期的TimeOnly对象,您可以使用:
var currentTime = TimeOnly.FromDateTime(DateTime.Now);
这里详细讨论了不包括 .Now 属性 背后的原因: https://github.com/dotnet/runtime/issues/53498
解决方法:
创建表示当前时间或日期的 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
,而且对转换 [= =19=] 到 TimeOnly
或 DateOnly
.
另一种方法是有两个静态 classes,如下所示:
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
属性被添加到这些结构背后的基本原理
简而言之,他们不想将时区和所有内容引入 DateOnly
和 TimeOnly
,因为这会增加额外的复杂性,因此他们决定不这样做,并保持新结构简单和明确的。
但是有一些讨论关于是否可以将这样的属性添加到Clock
class中(仍然是提案,您可以按照它here)这样用法就类似于 TimeOnly now = SystemClock.Local.Now
,或者 DateOnly
类似于 DateOnly today = SystemClock.Local.Today
或类似的东西。但这还没有定论。