Преобразование Великобритании (как BST, так и GMT) представлено в виде строк в формате UTC (в С#)

Мне нужно использовать некоторые даты и время из старой базы данных. Они представлены как строки. Даты: dd/MM/yy. Времена HH: мм.

Я хотел бы преобразовать их в 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 и т.д.

Ответ 1

Попробуйте использовать метод 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));

Ответ 2

Как насчет:

DateTime.Parse(dateTimeString).ToUniversalTime();

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