TimeZoneInfo | GetUtcOffset: лучшее решение? - PullRequest
2 голосов
/ 25 октября 2010

Я столкнулся с проблемой, когда мой сервер ожидает объекты даты и времени в формате 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);            
        }
    }

1 Ответ

0 голосов
/ 26 октября 2010

Когда вы говорите GMT, вы имеете в виду UTC? От Википедия :

При повседневном использовании, когда фракции Второе не важно, Гринвич Среднее время (GMT) можно считать эквивалентно UTC или UT1. Сказать "GMT" часто подразумевает UTC или UT1, когда используется в неформальной или повседневной контексты. В техническом контексте, использование «GMT» избегается; однозначный Терминология "UTC" или "UT1" является предпочтительным.

Если это так, проблема решена:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...