Я пытаюсь создать модульный тест для тестирования случая на то, когда часовой пояс изменяется на машине, потому что это было неправильно установлено и затем исправлено.
В тесте я должен смочь создать объекты DateTime ни в одном зона местного времени, чтобы гарантировать, что люди, запускающие тест, могут сделать так успешно независимо от того, где они расположены.
Из того, что я вижу от конструктора DateTime, я могу установить TimeZone, чтобы быть или локальным часовым поясом, часовым поясом UTC или не указанный.
Как я создаю DateTime с определенным часовым поясом как PST?
ответ Jon переговоры приблизительно TimeZone, но я предложил бы использовать TimeZoneInfo вместо этого.
Лично мне нравится сохранять вещи в UTC где возможными (по крайней мере, для прошлого; хранение UTC для будущее имеет потенциальные проблемы ), таким образом, я предложил бы структуру как это:
public struct DateTimeWithZone
{
private readonly DateTime utcDateTime;
private readonly TimeZoneInfo timeZone;
public DateTimeWithZone(DateTime dateTime, TimeZoneInfo timeZone)
{
var dateTimeUnspec = DateTime.SpecifyKind(dateTime, DateTimeKind.Unspecified);
utcDateTime = TimeZoneInfo.ConvertTimeToUtc(dateTimeUnspec, timeZone);
this.timeZone = timeZone;
}
public DateTime UniversalTime { get { return utcDateTime; } }
public TimeZoneInfo TimeZone { get { return timeZone; } }
public DateTime LocalTime
{
get
{
return TimeZoneInfo.ConvertTime(utcDateTime, timeZone);
}
}
}
можно хотеть изменить имена "Часового пояса" к "TimeZoneInfo" для создания вещей более ясными - я предпочитаю более краткие имена сам.
Необходимо будет создать пользовательский объект для этого. Ваш пользовательский объект будет содержать два значения:
Не уверенный, если уже существует обеспеченный CLR тип данных, который имеет это, но по крайней мере компонент TimeZone уже доступен.
Используя класс TimeZones помогает создать часовой пояс определенная дата.
TimeZoneInfo.ConvertTime(DateTime.Now, TimeZoneInfo.FindSystemTimeZoneById(TimeZones.Paris.Id));
Структура DateTimeOffset была создана именно для этого типа использования.
См .: http://msdn.microsoft.com/en-us/library/system.datetimeoffset.aspx
Вот пример создания объекта DateTimeOffset с определенным часовым поясом:
DateTimeOffset do1 = new DateTimeOffset ( 2008, 8, 22, 1, 0, 0, новый TimeSpan (-5, 0, 0));