如何获取.NET 6中TimeOnly和DateOnly对应DateTime.Now的等效值?
获取当前DateOnly/TimeOnly实例的实现方式
直接通过现有DateTime的对应属性转换即可,实现非常简单:
- 获取本地当前日期:
DateOnly.FromDateTime(DateTime.Now),如果需要UTC时区的当前日期,替换为DateTime.UtcNow即可 - 获取本地当前时间:
TimeOnly.FromDateTime(DateTime.Now),同理UTC时区当前时间替换为DateTime.UtcNow即可
如果高频使用这类写法,你可以自行封装静态属性简化调用,示例如下:
// 封装自定义静态属性 public static class DateOnlyHelper { // 本地日期 public static DateOnly Today => DateOnly.FromDateTime(DateTime.Now); // UTC日期 public static DateOnly UtcToday => DateOnly.FromDateTime(DateTime.UtcNow); } public static class TimeOnlyHelper { // 本地时间 public static TimeOnly Now => TimeOnly.FromDateTime(DateTime.Now); // UTC时间 public static TimeOnly UtcNow => TimeOnly.FromDateTime(DateTime.UtcNow); } // 调用示例 var today = DateOnlyHelper.Today; var nowTime = TimeOnlyHelper.Now;
官方不内置对应静态属性的原因
这个设计决策在.NET官方的设计文档中有明确说明,核心出发点是规避隐性时区歧义问题:
DateTime.Now、DateTime.Today本身长期存在隐性时区缺陷:默认返回运行设备本地时区的时间,很多开发者容易混淆本地时间和UTC时间,引发时区相关的线上bugDateOnly和TimeOnly的设计定位是「与时区无关的纯日期/纯时间值」,典型使用场景比如生日、固定营业时间、闹钟设置等,本身不需要绑定时区属性。如果内置Now/Today这类属性,会违背类型的设计初衷,强制给类型附加时区属性- 官方希望开发者显式声明自己需要的时区来源,从API设计层面减少隐性bug的出现概率。
内容的提问来源于stack exchange,提问作者Arad
相关产品推荐
相关产品推荐

