C# 如何在单元测试中模拟夏令时转换?

C# 如何在单元测试中模拟夏令时转换?,c#,unit-testing,mstest,C#,Unit Testing,Mstest,我有一个代码,可以比较最后的时间戳和实际的时间戳。如果实际时间戳早于最后一个时间戳,则systemtime已被操纵。由于从夏令时到夏令时的转换,我使用UTC。 现在我想为这种特殊情况编写一个单元测试 public void TransitionFromDSTToNonDST() { var dayLightChangeEnd= TimeZone.CurrentTimeZone.GetDaylightChanges(DateTime.Now.Year).End; var still

我有一个代码,可以比较最后的时间戳和实际的时间戳。如果实际时间戳早于最后一个时间戳,则systemtime已被操纵。由于从夏令时到夏令时的转换,我使用UTC。
现在我想为这种特殊情况编写一个单元测试

public void TransitionFromDSTToNonDST()
{
    var dayLightChangeEnd= TimeZone.CurrentTimeZone.GetDaylightChanges(DateTime.Now.Year).End;
    var stillInDaylightSavingTime= dayLightChangeEnd.Subtract(TimeSpan.FromMinutes(62));
    //stillInDaylightSavingTime.IsDaylightSavingTime() returns true
    //stillInDaylightSavingTime is 01.58 am
    var noDaylightSavingTimeAnymore= dayLightChangeEnd.Subtract(TimeSpan.FromMinutes(32));
    //noDaylightSavingTimeAnymore.IsDaylightSavingTime() returns false
    //noDaylightSavingTimeAnymore is 02.28 am
}
但实际上我想模拟一下:

var stillInDaylightSavingTime = //for example 02.18 am BEFORE switching to Non-DST
var noDaylightSavingTimeAnymore = //for example 02.10 am AFTER switching to Non-DST
因此,问题是如何定义02.18 am是否为DST。

MSDN:

时区之间的转换操作(如UTC和当地时间之间,或一个时区和另一个时区之间)考虑夏令时,但算术和比较操作不考虑

在我看来,您应该在UTC中添加分钟数,然后转换为本地种类

以下是(更新的)代码:


@WaltiD:我不能评论,但上面的代码在DST轮班前后打印02:58。

如果您试图测试静态方法或属性,您可以查看PEX/Moles

  • (一些随机的博客帖子)


如果您使用UTC,则不遵守日光节约。@Matthew:我知道。但是我想编写一个单元测试,以确保一致性检查工作正常。我想在不知道该方法在UTC内部工作的情况下测试该方法。您是否意识到sntp和时钟重置也可能会干扰您的结果?如果使用日期值执行某些操作,为什么不将时间作为参数公开给该方法,而不是期望该方法调用静态方法/属性。如何在UTC中添加分钟?比如
TimeSpan.FromMinutes(62).ToUniversalTime().ToLocalTime()
?但问题仍然是:如何定义2011年10月30日凌晨2点18分是否为DST。事实证明,我可以评论,sry;)请参阅我关于添加的示例。它还打印DST轮班前后的02:58。非常好,谢谢。我没赶上队伍的尽头
dayLightChangeEnd=TimeZone.CurrentTimeZone.GetDaylightChanges(DateTime.Now.Year.End.ToUniversalTime()
-ToUniversalTime()看起来像是解决方案。事实上,应该投票支持我的不是我,而是我发现这些信息的非常好的MSDN文档。
var dayLightChangeEnd = TimeZone.CurrentTimeZone.GetDaylightChanges(DateTime.Now.Year).End.ToUniversalTime();
var stillInDaylightSavingTime = dayLightChangeEnd.Subtract(TimeSpan.FromMinutes(62)).ToLocalTime();
Console.WriteLine(stillInDaylightSavingTime);
Console.WriteLine(stillInDaylightSavingTime.IsDaylightSavingTime());
var noDaylightSavingTimeAnymore = dayLightChangeEnd.Subtract(TimeSpan.FromMinutes(2)).ToLocalTime();
Console.WriteLine(noDaylightSavingTimeAnymore);
Console.WriteLine(noDaylightSavingTimeAnymore.IsDaylightSavingTime());