Как смоделировать переход на летнее время в модульном тесте? - PullRequest
8 голосов
/ 17 июля 2011

У меня есть код, который сравнивает последнюю отметку времени с фактической отметкой времени. Если фактическая временная метка предшествует последней временной метке, системным временем манипулируют. Из-за перехода с или на летнее время я работаю с 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 утра или летнее время или нет.

Ответы [ 2 ]

4 голосов
/ 17 июля 2011

MSDN говорит :

Операции преобразования между часовыми поясами (например, между 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: Я не могу комментировать, но код выше печатает 02:58 до и после перехода на летнее время.

0 голосов
/ 18 июля 2011

Если вы пытаетесь настроить статические методы или свойства, вы можете посмотреть на PEX / Moles

...