首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Noda时间内获取系统的LocalDateTime

在Noda时间内获取系统的LocalDateTime
EN

Stack Overflow用户
提问于 2014-01-10 03:35:00
回答 1查看 8.7K关注 0票数 24

在Noda Time中以LocalDateTime的形式获取系统时间的惯用方法是什么?我能想到的最直接的方法是

代码语言:javascript
复制
var dt = DateTime.Now
LocalDateTime systemTime = new LocalDateTime(dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute);

但是考虑到Noda Time的entire purpose is to replace DateTime with something that has nicer semantics,我假设有一种比以上述方式使用DateTime更好的方法。我能想到的最好的办法是使用野田的设施

代码语言:javascript
复制
var zone = NodaTime.TimeZones.BclDateTimeZone.ForSystemDefault();
LocalDateTime systemTime = SystemClock.Instance.Now.InZone(zone).LocalDateTime;

但这似乎相当冗长。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-10 05:27:09

你的第二个例子就是你如何做到这一点。它是故意冗长的。参见Noda Time's design philosophy

把它分成三个部分:

  1. 获取当前时间点:

// Instant now = SystemClock.Instance.Now;// NodaTime 1.x Instant now = SystemClock.Instance.GetCurrentInstant();// NodaTime 2.x

  • 获取系统的时区。(这是首选语法)

DateTimeZoneProviders.Bcl.GetSystemDefault();

  • Apply tz = DateTimeZone将时区转换到当前时刻:

zdt = now.InZone(tz); ZonedDateTime

获取LocalDateTime的最后一步是微不足道的,但要认识到,当您这样做时,您正在剥离任何时区信息。NodaTime中的“本地”并不意味着“运行代码的计算机的本地”。(换句话说,它不像DateTimeKind.Local)

需要考虑的其他事情:

  • 您可能更喜欢使用IClock接口提取时钟:

IClock时钟= SystemClock.Instance;//立即启动= clock.Now;// NodaTime 1.x立即启动= clock.GetCurrentInstant();// NodaTime 2.x

然后,您可以将时钟作为方法参数传递,或者使用您喜欢的DI/IoC框架注入它。(Autofac,Ninject,StructureMap,诸如此类...)好处是您可以在单元测试期间使用NodaTime.Testing.FakeClock

  • 你可能更喜欢传入DateTimeZone,这样你就可以在任何地方运行你的代码,而不会被绑定到系统时区。这对于服务器应用程序很重要,但对于桌面/移动应用程序就不那么重要了。

  • 如果您有其他工作正在使用IANA时区,或者如果您正在使用Noda Time的.NET标准构建,则将步骤2更改为使用Tzdb提供程序:

DateTimeZoneProviders.Tzdb.GetSystemDefault();= DateTimeZone tz

TZDB区域比BCL区域精确得多。在这个初始调用中,Noda Time会将系统的视窗时区映射到一个时区。

如果你对为什么DateTime.Now如此紧凑而Noda时间如此冗长感到好奇,可以尝试反编译DateTime.Now或查看MS参考资料。您将看到它在幕后执行的步骤基本上是相同的。

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

https://stackoverflow.com/questions/21029489

复制
相关文章

相似问题

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