C# 创建一个NodaTime LocalDate,表示;“今天”;
创建表示“今天”的LocalDate实例的推荐方法是什么。我原以为LocalDate类中会有一个静态的“Now”或“Today”属性,但实际上没有。我目前的做法是使用DateTime。现在:C# 创建一个NodaTime LocalDate,表示;“今天”;,c#,.net,nodatime,C#,.net,Nodatime,创建表示“今天”的LocalDate实例的推荐方法是什么。我原以为LocalDate类中会有一个静态的“Now”或“Today”属性,但实际上没有。我目前的做法是使用DateTime。现在: var now = DateTime.Now; LocalDate today = new LocalDate(now.Year, now.Month, now.Day); 有更好的方法吗?首先要认识到,当你说“今天”时,对于世界不同地区的不同人群,答案可能不同。因此,为了获得当前的本地日期,您必须考虑时
var now = DateTime.Now;
LocalDate today = new LocalDate(now.Year, now.Month, now.Day);
有更好的方法吗?首先要认识到,当你说“今天”时,对于世界不同地区的不同人群,答案可能不同。因此,为了获得当前的本地日期,您必须考虑时区 当您从
IClock
实现(如系统时钟)调用Now
时,Noda Time会为您提供一个即时
,从而正确地对此进行建模。一个瞬间是通用的,所以你只需要将它转换成某个时区就可以得到该时区的本地日期
// get the current time from the system clock
Instant now = SystemClock.Instance.Now;
// get a time zone
DateTimeZone tz = DateTimeZoneProviders.Tzdb["Asia/Tokyo"];
// use now and tz to get "today"
LocalDate today = now.InZone(tz).Date;
这是最小的代码。当然,如果您想使用计算机的本地时区(就像您使用DateTime.Now
),您可以这样获得:
DateTimeZone tz = DateTimeZoneProviders.Tzdb.GetSystemDefault();
要真正正确地实现它,您应该从IClock
接口调用.Now
,这样您就可以用一个假时钟代替系统时钟进行单元测试
这是一个很好的例子,说明野田佳彦不会故意对你隐瞒事情。当你调用
DateTime.Now
时,所有这些仍然在幕后进行,但你只是看不到而已 马特的答案在野田佳彦时间1.x版中是正确的
在Noda Time 2.0中,我引入了一个分区时钟
,它基本上是IClock
和日期时区
的组合。由于您可能希望当前时间多次位于同一时区,因此可以将其注入(我假设您使用的是依赖项注入),并保留该时间,然后使用它。例如:
class SomeClass
{
private readonly ZonedClock clock;
internal SomeClass(ZonedClock clock)
{
this.clock = clock;
}
internal void DoSomethingWithDate()
{
LocalDate today = clock.GetCurrentDate();
...
}
}
您通常会通过使用IClock
并使用一种新的扩展方法来提供ZonedClock
,例如:
var clock = SystemClock.Instance;
var zoned = clock.InUtc();
// Or...
var zoned = clock.InZone(DateTimeZoneProviders.Tzdb["Europe/London"];
// Or...
var zoned = clock.InTzdbSystemDefaultZone();
// Or...
var zoned = clock.InBclSystemDefaultZone();
请注意,您的1.x代码无论如何都无法在2.x中工作-我正在从
IClock
中删除Now
属性,因为它实际上不应该是属性(考虑到它的变化方式)-它现在是GetCurrentInstant()
方法 乔恩的回答是对的,但我认为把这一切放在一起是有帮助的。对于NodeTime 2.x:
SystemClock.Instance.InTzdbSystemDefaultZone().GetCurrentLocalDateTime().Date
帕特里克的回答是正确的。
但是,您可能希望立即获取当前用户时区的
,而不是系统时区的。
对于NodeTime 3.x:
//Tz是一个DateTimeZone对象,由当前用户的首选时区ID构造而成
SystemClock.Instance.InZone(Tz.GetCurrentZonedDateTime();
您还可以根据您的用例使用GetCurrentLocalDateTime
或GetCurrentOffsetDateTime
。我喜欢它。2.0一直看起来更好!当使用DI时,ZonedClock
应该注册为什么生命周期?@Oskar:我真的不知道如何回答这个问题。你总是想要同样的时钟吗?你总是想要相同的时区吗?用这些问题的答案来驱动你的选择。我总是想要相同的时区。使用同一个时钟有什么坏处吗?@Oskar:几乎可以肯定没有,但你是一个拥有所有背景的人。野田佳彦的时间方面没有什么特别的事情。