Как имитировать переход на летнее время в модульном тесте?

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


person WaltiD    schedule 17.07.2011    source источник
comment
Если вы используете UTC, вы не наблюдаете переход на летнее время.   -  person Matthew Whited    schedule 17.07.2011
comment
@ Мэтью: я знаю это. Но я хотел бы написать модульный тест, чтобы убедиться, что проверка согласованности работает. Я хотел бы протестировать метод, не зная, что метод работает внутри UTC.   -  person WaltiD    schedule 17.07.2011
comment
Вы понимаете, что сброс sntp и часов также может испортить ваши результаты? Если вы делаете что-то со значением даты, почему бы вам не указать время в качестве параметра метода вместо того, чтобы ожидать, что метод вызовет статический метод/свойство.   -  person Matthew Whited    schedule 18.07.2011


Ответы (2)


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 до и после перехода на летнее время.

person Archie    schedule 17.07.2011
comment
Как я могу добавить минуты в UTC? Нравится TimeSpan.FromMinutes(62).ToUniversalTime().ToLocalTime()? Но вопрос остается: как определить, является ли 02:18 утра 30 октября 2011 года летним временем или нет. - person WaltiD; 18.07.2011
comment
Оказывается, я могу комментировать, сори ;) См. мой пример о добавлении. - person Archie; 18.07.2011
comment
Он также печатает 02:58 до и после перехода на летнее время. - person Archie; 18.07.2011
comment
Отлично, спасибо. Я пропустил конец строки. dayLightChangeEnd = TimeZone.CurrentTimeZone.GetDaylightChanges(DateTime.Now.Year).End.ToUniversalTime(); - ToUniversalTime() выглядит как решение. - person WaltiD; 18.07.2011
comment
Также ToLocal при печати ;) - person Archie; 18.07.2011
comment
И на самом деле голосовать надо не за меня, а за исключительно хорошую документацию MSDN, где я нашел такую ​​информацию. - person Archie; 18.07.2011

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

person Matthew Whited    schedule 17.07.2011