Я столкнулся с проблемой, когда мой сервер ожидает объекты даты и времени в формате GMT, а мое приложение пользовательского интерфейса всегда создает и манипулирует всеми объектами даты и времени в соответствии с местной культурой. Я не могу изменить культуру, поскольку существуют другие функции, для которых нужны объекты даты и времени быть в соответствии с местным форматом. Я написал конвертер для этого, не уверен, есть ли какой-либо готовый API, который позволяет мне это делать. Также немного смущен метод GetUtcOffset на timezoneinfo, это дает разницу между местным временем и временем gmt? Я пытался документация, доступная на msdn, была для меня немного криптична. Не могли бы вы помочь? Также, как мне выполнить ее модульное тестирование, изменив культуру и проверив вывод?
Приведенный ниже класс преобразует объекты даты и времени в эквивалент времени по Гринвичу, а также преобразует его обратно при получении с сервера.
Примечание: и мой сервер, и пользовательский интерфейс работают в режиме CET, однако эти объекты даты и времени относятся к Великобритании и, следовательно, сервер нуждается в них в GMT.
public class GmtConverter : IDateConverter
{
private readonly TimeZoneInfo timeZoneInfo;
public GmtConverter()
: this(TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time"))
{
}
public GmtConverter(TimeZoneInfo timeZoneInfo)
{
this.timeZoneInfo = timeZoneInfo;
}
public DateTime Convert(DateTime localDate)
{
var utcOffset = timeZoneInfo.GetUtcOffset(localDate);
var unSpecified = localDate + utcOffset;
return DateTime.SpecifyKind(unSpecified, DateTimeKind.Unspecified);
}
public DateTime ConvertBack(object local)
{
var localDate = (DateTime) local;
var utcOffset = timeZoneInfo.GetUtcOffset(localDate);
var unSpecified = localDate - utcOffset;
return DateTime.SpecifyKind(unSpecified, DateTimeKind.Unspecified);
}
}