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

标签 c# datetime testing nodatime

在过去的 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/

相关文章:

c# 去除多余空格的最快方法

c# - 如何测试 DateTime 是否在一周的 2 天之间(DayOfWeek)

php - 在 PHP 中获取小时和分钟

facebook - 如何在 Facebook 上测试运行我的应用程序?

c# - 如何检查用户是否已经登录?

c# - 我把这个自动映射放在哪里?

python pandas 按行数切片日期时间日期

testing - LB 和 RB 边界中的 web_reg_save_param() 是否有任何正则表达式?

testing - 如何使用节流连接运行 TestCafe 测试?

c# - 两个线程使用相同的变量,会产生问题