Как я могу конвертировать из unix epoch time и account для перехода на летнее время в С#?

У меня есть функция, которая преобразует время unix эпохи в значение .NET DateTime:

public static DateTime FromUnixEpochTime(double unixTime )
{
  DateTime d = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
  return d.AddSeconds(unixTime);
}

Где я (Великобритания) часы ходят на час вперед на летнее время.

В Python я получаю локальное время Epoch, используя time.time() (и ради аргумента, прямо сейчас время 17:15:00), которое дает мне значение 1286122500.

Если я преобразую это обратно в человеко-читаемое время, используя time.localtime(), он преобразуется обратно в 17:15, как и следовало ожидать.

Как мне преобразовать время эпохи unix обратно в значение .NET DateTime AND для локального летнего времени. Моя функция выше преобразует 1286122500 обратно в 16:15, что неверно для моего географического местоположения.

Ответ 2

Класс TimeZoneInfo отлично подходит для одной сделки с разными временами и часовыми поясами. Он использует информацию о часовом поясе, которую Windows встроила для преобразования между различными часовыми поясами.

Здесь вы можете использовать его для своей проблемы:

//Get your unix epoch time into a DateTime object
DateTime unixTime = 
    new DateTime(1970,1,1,0,0,0, DateTimeKind.Utc).AddSeconds(1286122500);

//Convert to local time
DateTime localTime = TimeZoneInfo.ConvertTime(unixTime, TimeZoneInfo.Local);

TimeZoneInfo.Local возвращает TimeZoneInfo, который представляет локальный часовой пояс.

Ответ 3

Является ли ваш дневной свет законченным? Если это так, ваши файлы часового пояса могут быть устаревшими, считая, что это уже закончилось. (Я не знаю о Великобритании, но в США, объем летних сбережений был расширен 3 года назад, и многие установки по-прежнему не имеют обновленных данных.)

Короче говоря, убедитесь, что данные вашего часового пояса обновлены.: -)

Ответ 4

Это 17:15 для 1286122500 в часовом поясе BST (или GMT + 1) (британское летнее время).

В вашей функции используется DateTimeKind.Utc, которая сообщает ему использовать UTC (aka GMT), поэтому вы получаете время в GMT: 16:15. Кроме того, я не думаю, что изменение часового пояса ссылки unix epoch необходимо будет правильно повлиять на текущий часовой пояс.

Вместо этого вы можете попробовать что-то вроде этого:

DateTime unixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
DateTime d = unixEpoch + new TimeSpan(unixTime);

(и затем преобразуется в DateTimeKind.Local)