Как я могу преобразовать метку времени Unix в DateTime и наоборот?

Этот пример кода есть, но затем он начинает говорить о проблемах миллисекунды / наносекунды.

Тот же вопрос на MSDN, секунд с эпохи Unix в C # .

Это то, что у меня так далеко:

public Double CreatedEpoch
{
  get
  {
    DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0, 0).ToLocalTime();
    TimeSpan span = (this.Created.ToLocalTime() - epoch);
    return span.TotalSeconds;
  }
  set
  {
    DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0, 0).ToLocalTime();
    this.Created = epoch.AddSeconds(value);
  }
}
вопрос задан 30.10.2008
Mark Ingram
41802 репутация

14 ответов


  • 834 рейтинг

    Вот что вам нужно:

    public static DateTime UnixTimeStampToDateTime( double unixTimeStamp )
    {
        // Unix timestamp is seconds past epoch
        System.DateTime dtDateTime = new DateTime(1970,1,1,0,0,0,0,System.DateTimeKind.Utc);
        dtDateTime = dtDateTime.AddSeconds( unixTimeStamp ).ToLocalTime();
        return dtDateTime;
    }
    

    Или для Java (который отличается, потому что отметка времени указывается в миллисекундах, а не секундах):

    public static DateTime JavaTimeStampToDateTime( double javaTimeStamp )
    {
        // Java timestamp is milliseconds past epoch
        System.DateTime dtDateTime = new DateTime(1970,1,1,0,0,0,0,System.DateTimeKind.Utc);
        dtDateTime = dtDateTime.AddMilliseconds( javaTimeStamp ).ToLocalTime();
        return dtDateTime;
    }
    
    ответ дан ScottCher, с репутацией 10186, 30.10.2008
  • 4 рейтинг

    Я нашел правильный ответ, просто сравнив конверсию с 1/1/1970 без учета местного времени;

    DateTime date = new DateTime(2011, 4, 1, 12, 0, 0, 0);
    DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0, 0);
    TimeSpan span = (date - epoch);
    double unixTime =span.TotalSeconds;
    
    ответ дан n8CodeGuru, с репутацией 185, 12.04.2011
  • 2 рейтинг

    Тик Unix равен 1 секунде (если я хорошо помню) и a. Чистая отметка составляет 100 наносекунд.

    Если у вас возникли проблемы с наносекундами, вы можете попробовать использовать AddTick (значение 10000000 *).

    ответ дан Luk, с репутацией 3664, 30.10.2008