Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 创建一个NodaTime LocalDate,表示;“今天”;_C#_.net_Nodatime - Fatal编程技术网

C# 创建一个NodaTime LocalDate,表示;“今天”;

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); 有更好的方法吗?首先要认识到,当你说“今天”时,对于世界不同地区的不同人群,答案可能不同。因此,为了获得当前的本地日期,您必须考虑时

创建表示“今天”的LocalDate实例的推荐方法是什么。我原以为LocalDate类中会有一个静态的“Now”或“Today”属性,但实际上没有。我目前的做法是使用DateTime。现在:

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:几乎可以肯定没有,但你是一个拥有所有背景的人。野田佳彦的时间方面没有什么特别的事情。