Несоответствие даты и времени Unix

Приведенная ниже функция предназначена для преобразования следующего времени unix в объект C# DateTime:

1362506086000

Время выше должно соответствовать 5 марта 2012 г., 12:54.

Однако каждый раз, когда я запускаю его с помощью приведенной ниже функции, он меняется на 17:54:

3/5/2013 5:54:46 PM

    static readonly DateTime UnixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
    static readonly double MaxUnixSeconds = (DateTime.MaxValue - UnixEpoch).TotalSeconds;

    public static DateTime UnixTimeStampToDateTime(double unixTimeStamp)
    {
        return unixTimeStamp > MaxUnixSeconds
           ? UnixEpoch.AddMilliseconds(unixTimeStamp)
           : UnixEpoch.AddSeconds(unixTimeStamp);
    }

Как я могу заставить время unix правильно отображаться как 12:54 вместо 5:54?


person user1477388    schedule 05.03.2013    source источник
comment
Вероятно, вам нужно найти функции для преобразования GMT (или это UTC в наши дни?) в местное время. Возможно, это поможет: ‹stackoverflow.com/questions/5397775/› Язык может быть другим, но необходимые функции часто имеют одинаковые или очень похожие имена на разных языках.   -  person Steve Valliere    schedule 05.03.2013
comment
Хороший вопрос; Я не знаю, какой часовой пояс они мне посылают. Я просто знаю, что должно быть 12:54, а когда я подключаю его к своей функции, получается 5:45...   -  person user1477388    schedule 05.03.2013
comment
@ user1477388: Вы должны ВСЕГДА спрашивать себя, в каком часовом поясе находится дата или время, ПРЕЖДЕ ЧЕМ что-либо с этим делать.   -  person Pieter Geerkens    schedule 05.03.2013
comment
Трудно понять, какой часовой пояс они мне присылают; Мне нужно знать, где находятся серверы, верно?   -  person user1477388    schedule 05.03.2013
comment
Если кто-то отправляет вам дату и время без часового пояса, и вы понятия не имеете, кто они и где они находятся, то вы на самом деле вообще не знаете, какое время они имели в виду, не так ли? Вам нужно либо согласовать UTC, либо отправить время в формате ISO8601 с явным смещением. Это входит в DateTimeOffset в С#, и вы можете использовать строку формата o для ToString() и Parse().   -  person Matt Johnson-Pint    schedule 06.03.2013


Ответы (2)


Похоже на проблему с часовым поясом. Убедитесь, что часовой пояс, используемый для генерации времени Unix, совпадает с часовым поясом в системе Windows, или преобразуйте его соответствующим образом.

person Eric J.    schedule 05.03.2013

Исправление для меня состояло в том, чтобы добавить ToLocalTime() в код, например:

static readonly DateTime UnixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
static readonly double MaxUnixSeconds = (DateTime.MaxValue - UnixEpoch).TotalSeconds;

public static DateTime UnixTimeStampToDateTime(double unixTimeStamp)
{
    return unixTimeStamp > MaxUnixSeconds
       ? UnixEpoch.AddMilliseconds(unixTimeStamp).ToLocalTime()
       : UnixEpoch.AddSeconds(unixTimeStamp).ToLocalTime();
}
person user1477388    schedule 05.03.2013
comment
Будьте осторожны - ToLocalTime() может получить значение, которое имеет смысл для вас прямо сейчас, но если вы не можете гарантировать, что отметка времени возникла в том же часовом поясе или находится в UTC, тогда у вас возникнут проблемы. Однако временные метки unix предполагаются в формате UTC. Просто убедитесь, что местное время действительно то, что вам нужно. - person Matt Johnson-Pint; 06.03.2013
comment
Спасибо, Мэтт; Я учту это. - person user1477388; 06.03.2013