在Noda Time中以LocalDateTime
的形式获取系统时间的惯用方法是什么?我能想到的最直接的方法是
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
更好的方法。我能想到的最好的办法是使用野田的设施
var zone = NodaTime.TimeZones.BclDateTimeZone.ForSystemDefault();
LocalDateTime systemTime = SystemClock.Instance.Now.InZone(zone).LocalDateTime;
但这似乎相当冗长。
发布于 2014-01-10 05:27:09
你的第二个例子就是你如何做到这一点。它是故意冗长的。参见Noda Time's design philosophy。
把它分成三个部分:
// Instant now = SystemClock.Instance.Now;// NodaTime 1.x Instant now = SystemClock.Instance.GetCurrentInstant();// NodaTime 2.x
DateTimeZoneProviders.Bcl.GetSystemDefault();
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
,这样你就可以在任何地方运行你的代码,而不会被绑定到系统时区。这对于服务器应用程序很重要,但对于桌面/移动应用程序就不那么重要了。
Tzdb
提供程序:DateTimeZoneProviders.Tzdb.GetSystemDefault();= DateTimeZone tz
TZDB区域比BCL区域精确得多。在这个初始调用中,Noda Time会将系统的视窗时区映射到一个时区。
如果你对为什么DateTime.Now
如此紧凑而Noda时间如此冗长感到好奇,可以尝试反编译DateTime.Now
或查看MS参考资料。您将看到它在幕后执行的步骤基本上是相同的。
https://stackoverflow.com/questions/21029489
复制相似问题