在过去的 30 分钟里,我一直试图让我的 FakeClock 在某个时间启动。我在股票市场应用程序中使用它,并且只使用纽约时区。股市晚上 8 点收盘,凌晨 4 点开盘,所以我想我可以避免处理白天的变化(至少现在是这样)。由于我只专注于美国股票,因此我也想避免任何其他时区和困惑。
无论如何,这是我启动应用程序和使用分区的方式
var zoneInfo = DateTimeZoneProviders.Tzdb["America/New_York"];
var NewYorkZonedClock = new ZonedClock((IClock)SystemClock.Instance, zoneInfo, CalendarSystem.Iso);
对于我的测试,我想将时间设置为 2016 年 7 月 1 日凌晨 03:59:59。 FakeClock 构造函数参数的类型为 Instance。我尝试以不同的方式获得这个实例,但我越来越困惑,不确定什么是最安全、最正确的方法。
FakeClock.FromUtc(2016, 07, 01, 03, 59, 59);
首先我尝试了这个,但无法找到一种自然的方法,无需手动移动时间来调整区域偏移。
var dateTimeInstance=new LocalDateTime(2016, 07, 01, 03, 59, 59);
var fakeClock = new FakeClock(dateTimeInstance.InZone(DateTimeZoneProviders.Tzdb["America/New_York"]))
我认为这肯定会起作用,但是 InZone 方法有一个名为 ZoneLocalMapping 的第二个参数,在 NodaTime 库中摸索并谷歌搜索后,我无法理解这里所期望的内容。
最后我找到了一种方法,通过使用 InZoneLeniently() 使其编译时间可以接受
var fakeClock = new FakeClock(new LocalDateTime(2016, 07, 01, 03, 59, 59).InZoneLeniently(zoneInfo).ToInstant());
但是,还有一个 InZoneStrictly()。我应该使用哪一个?
最佳答案
当夏令时切换发生时,这两种方法可以帮助您处理本地时间的间隙或重叠。如果时间在重叠范围内,InZoneLeniently()
将选择较晚的时间,如果在间隙内,它将选择较晚区域间隔的开始时间。如果该区域的本地时间不存在或不明确,InZoneStrictly()
将引发异常。
您预计在 DST 切换期间不会出现本地时间,这可能非常安全,因此其中任何一个都应该适合您。这仅取决于您是否想在发生错误时显示错误。
关于c# - 如何使用NodaTime FakeClock进行时间旅行并测试不同的虚拟时间实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39751494/