Преобразование британского времени (как BST, так и GMT), представленного в виде строк, в UTC (в C #) - PullRequest
10 голосов
/ 12 октября 2009

Я должен использовать некоторые даты и время из устаревшей базы данных. Они представлены в виде строк. Даты - дд / мм / гг. Время ЧЧ: мм.

Я бы хотел преобразовать их в UTC, как только я извлечу их из базы данных. Я работаю над системами в США, поэтому нужно общее время.

Проблема, с которой я сталкиваюсь, заключается в том, как преобразовать их в значения UTC DateTime. Я могу выполнить разбор и т. Д. Настоящая проблема, которая у меня есть, касается часового пояса.

Я пытаюсь использовать следующий подход:

DateTime ukTime = // Parse the strings in a DateTime value.
TimeZoneInfo timeZoneInformation = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time");
DateTimeOffset utcTime = new DateTimeOffset(ukTime, timeZoneInformation.BaseUtcOffset);

Однако это дает неверные значения, если дата относится к периоду Британского летнего времени.

Я могу использовать «GMT Daylight Time» в эти даты, но для этого необходимо, чтобы я знал, когда происходит переключение. Я уверен, что должен быть менее трудоемкий путь.

Поскольку я не использую машину с настройками британского времени, я не могу полагаться на местное время.

В основном мне нужно что-то вроде:

// Works for both GMT (UTC+0) and BST (UTC+1) regardless of the regional settings of the system it runs on.
DateTime ParseUkTimeAsUtcTime(string date, string time)
{
    ...
}

Я просмотрел сообщения, но не смог найти ничего, что касалось этого напрямую. Конечно, это также проблема с EST, EDT и т. Д.?

Ответы [ 2 ]

6 голосов
/ 12 октября 2009

Попробуйте использовать метод GetUtcOffset() в вашем экземпляре TimeZoneInfo, который учитывает "правила корректировки".

Использование этого метода должно работать в основном так же, как в исходном примере, но вы будете использовать этот метод вместо свойства BaseUtcOffset.

DateTime ukTime = // Parse the strings in a DateTime value.
TimeZoneInfo timeZoneInformation = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time");
DateTimeOffset utcTime = new DateTimeOffset(ukTime, timeZoneInformation.GetUtcOffset(ukTime));
0 голосов
/ 12 октября 2009

Как насчет:

DateTime.Parse(dateTimeString).ToUniversalTime();

Предполагая, что сервер баз данных хранит свои даты и время в том же часовом поясе, что и сервер приложений.

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