如何使用NodaTime FakeClock进行时间旅行和测试不同的虚拟时间实例

本文关键字:时间 测试 实例 虚拟 旅行 NodaTime 何使用 FakeClock | 更新日期: 2023-09-27 18:09:11

在过去的30分钟里,我一直在尝试让我的FakeClock在特定的时间启动。我在一个股票市场应用中使用它,我只是使用纽约时区。股票市场在晚上8点收盘,凌晨4点开盘,所以我认为我可以避免处理白天的变化(至少现在)。既然我只关注美国股票,我也想避免任何其他时区和混乱。

无论如何,这是我如何启动应用程序并使用Zoned

var zoneInfo = DateTimeZoneProviders.Tzdb["America/New_York"];
var  NewYorkZonedClock = new ZonedClock((IClock)SystemClock.Instance, zoneInfo, CalendarSystem.Iso);

对于我的测试,我想将时间设置为July 1, 2016 03:59:59 am。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()。我应该用哪一个?

如何使用NodaTime FakeClock进行时间旅行和测试不同的虚拟时间实例

这两种方法可以帮助您处理发生夏令时切换时本地时间的间隙或重叠。如果时间在重叠区域内,则InZoneLeniently()将选择较晚的时间,如果时间在间隙内,则选择较晚的区域间隔的开始时间。如果本地时间在该区域不存在或有歧义,InZoneStrictly()将抛出异常。

您期望在DST切换期间本地时间不会发生,这可能是相当安全的,因此任何一种都应该适合您。这取决于你是否想在错误发生时显示出来