В настоящее время я пишу инструмент, который анализирует файлы с нестандартным нестандартным форматом. Файлы содержат данные для нескольких точек измерения с временными метками (одно измерение каждые 30 секунд). Эти временные метки находятся в часовом поясе CET / CEST, что означает, что, когда, например, время изменяется с летнего на зимнее время, в файле будет несколько измерений с одной и той же временной меткой, поскольку каждая метка времени между 2:00 и 3:00 в В файле дважды будет указано утро (одно до и одно после измененного времени).
Я уже могу проанализировать все нужные мне метки времени (год, месяц, день, часы и минуты) из файл, но мне также нужно преобразовать его в UT C. Есть ли какая-либо функциональность в. NET Framework или в сторонней библиотеке для выполнения этого преобразования?
Я уже пытался использовать TimeZoneInfo.ConvertTimeToUtc
, но мне уже нужно иметь объект DateTime для того, что я не делаю ' не знаю, как создать еще. Я не могу просто создать новый объект DateTime, используя один из конструкторов DateTime, потому что, скажем, я предоставляю одну из временных меток, которая существует дважды в файле из-за перехода с летнего на зимнее время. Как он узнает, что эта метка времени была раньше? или после того, как время изменилось?
Я думал, что это, вероятно, довольно распространенная проблема при работе с метками времени, но я пока не смог найти хорошего решения для своей проблемы. Нужно ли вручную отслеживать, когда происходит изменение времени в файле, чтобы правильно преобразовать время в UT C? Если да, то как я могу это сделать?
ОБНОВЛЕНИЕ: Вот очень упрощенный пример проблемы, которую я пытаюсь решить: это могут быть некоторые данные, которые мой инструмент проанализировал по временным меткам в file:
Day: 27 - Month: 10 - Year: 2019 - Hour: 1 - Minute: 45 - Second: 0
Day: 27 - Month: 10 - Year: 2019 - Hour: 2 - Minute: 0 - Second: 0
Day: 27 - Month: 10 - Year: 2019 - Hour: 2 - Minute: 15 - Second: 0
Day: 27 - Month: 10 - Year: 2019 - Hour: 2 - Minute: 30 - Second: 0
Day: 27 - Month: 10 - Year: 2019 - Hour: 2 - Minute: 45 - Second: 0
Day: 27 - Month: 10 - Year: 2019 - Hour: 2 - Minute: 0 - Second: 0
Day: 27 - Month: 10 - Year: 2019 - Hour: 2 - Minute: 15 - Second: 0
Day: 27 - Month: 10 - Year: 2019 - Hour: 2 - Minute: 30 - Second: 0
Day: 27 - Month: 10 - Year: 2019 - Hour: 2 - Minute: 45 - Second: 0
Day: 27 - Month: 10 - Year: 2019 - Hour: 3 - Minute: 0 - Second: 0
Day: 27 - Month: 10 - Year: 2019 - Hour: 3 - Minute: 15 - Second: 0
Day: 27 - Month: 10 - Year: 2019 - Hour: 3 - Minute: 30 - Second: 0
(на самом деле данных в час намного больше, но для примера это не имеет значения)
В этом примере часы устанавливаются на один час назад из 3 : С 00:00 до 2:00 утра, потому что здесь заканчивается летнее время, и поэтому мы переходим с CEST на CET. Противоположная вещь происходит ~ 6 месяцев спустя (и, очевидно, также 6 месяцев назад), когда начинается период перехода на летнее время и часы перемещаются на один час вперед.
В файлах нет никаких признаков того, что мой инструмент анализирует, находится ли временная метка в CET или CEST, поэтому мой логин разбора c должен это обработать. В основном у меня есть al oop, который перебирает строки в файле, анализирует метки времени и затем вызывает эту функцию, чтобы получить объект DateTime для каждой метки времени:
private static DateTime toDateTimeUTC(int year, int month, int day, int hour, int minute, int second)
{
// ToDo
return new DateTime(year, month, day, hour, minute, second, DateTimeKind.Utc); // This is WRONG!
}
Этот код, очевидно, не работает правильно пока, потому что это только предполагает, что метки времени находятся в UT C.