Как я могу конвертировать из 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, что неверно для моего географического местоположения.
Ответы
Ответ 1
Используйте DateTime.ToLocalTime()
:
http://msdn.microsoft.com/en-us/library/system.datetime.tolocaltime.aspx
public static DateTime FromUnixEpochTime(double unixTime)
{
DateTime d = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
d = d.AddSeconds(unixTime);
return d.ToLocalTime();
}
Ответ 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
)