Преобразование времени Unix в С#

Я пытаюсь получить GMT в unix время. Я использую следующий код:


        public static long GetGMTInMS()
        {
            var unixTime = DateTime.Now.ToUniversalTime() -
                new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);

            return (long)unixTime.TotalMilliseconds;
        }

Чтобы затем преобразовать время unix обратно в объект DatTime, я использую это:


        public static DateTime UnixTimeStampToDateTime(double unixTimeStamp)
        {
            System.DateTime dtDateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0);
            dtDateTime = dtDateTime.AddMilliseconds(unixTimeStamp).ToLocalTime();
            return dtDateTime;
        }

Когда я запустил его, GetGMTInMS() 1320249196267. Когда я передаю его UnixTimeStampToDateTime(), я получаю {11/2/2011 11:53:16 AM}

Это нормально. Это правильное время, когда я запускал свой код. Проблема заключается в том, что когда я пытаюсь добавить 1320249196267 в unix-конвертер времени, например this, он возвращает совершенно неправильное время.

Другой вопрос: я нахожусь в восточном часовом поясе. Это вернуло время в моем часовом поясе. Это что-то, что обрабатывает объект DateTime, или я не получаю GMT.

Ответ 1

"Временная метка Unix" означает секунды с эпохи в большинстве ситуаций, а не миллисекунды... будьте осторожны! Тем не менее, такие вещи, как Java, используют "миллисекунды с эпохи", что может быть тем, что вам действительно нужно, несмотря на инструмент, который вы показали. Это действительно зависит от того, что вам нужно.

Кроме того, вы не должны делать ничего с местным временем. Придерживайтесь универсального времени.

Я бы:

private static readonly DateTime UnixEpoch =
    new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);

public static long GetCurrentUnixTimestampMillis()
{
    return (long) (DateTime.UtcNow - UnixEpoch).TotalMilliseconds;
}

public static DateTime DateTimeFromUnixTimestampMillis(long millis)
{
    return UnixEpoch.AddMilliseconds(millis);
}

public static long GetCurrentUnixTimestampSeconds()
{
    return (long) (DateTime.UtcNow - UnixEpoch).TotalSeconds;
}

public static DateTime DateTimeFromUnixTimestampSeconds(long seconds)
{
    return UnixEpoch.AddSeconds(seconds);
}

Ответ 2

Время UNIX - секунды с 1/1/1970, а не миллисекунды. Измените код на использование секунд, а не миллисекунд, и он должен работать,