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

时间:2011-07-17 19:36:15

标签: c# unit-testing mstest

我有一个代码,用于比较上一个时间戳和实际时间戳。如果实际时间戳在最后一个时间戳之前,则系统时间已被操纵。由于从夏令时过渡到夏令时,我使用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。

2 个答案:

答案 0 :(得分:4)

MSDN says

  

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

IMO您应该以UTC格式添加分钟数,然后转换为本地类型。

这是(更新的)代码:

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

@WaltiD:我不能发表评论,但上面的代码在DST转换之前和之后打印02:58。

答案 1 :(得分:0)

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

相关问题