gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 23:20:27 25 4
gpt4 key购买 nike

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

无论如何,这是我启动应用程序和使用 Zoned 的方式

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);

首先,我尝试了这个,但无法找到一种不手动移动时间来调整 zoneoffset 的自然方式。

 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com