Преобразование Великобритании (как 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();
Предполагая, что сервер базы данных хранит свои данные в том же часовом поясе, что и ваш сервер приложений.