¿Cómo puedo convertir una marca de tiempo de Unix a DateTime y viceversa?

Resuelto Mark Ingram asked hace 16 años • 24 respuestas

Existe este código de ejemplo, pero luego comienza a hablar de problemas de milisegundos/nanosegundos.

La misma pregunta está en MSDN, Segundos desde la época de Unix en C# .

Esto es lo que tengo hasta ahora:

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);
  }
}
Mark Ingram avatar Oct 30 '08 17:10 Mark Ingram
Aceptado

Esto es lo que necesitas:

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

O, para Java (que es diferente porque la marca de tiempo está en milisegundos, no en segundos):

public static DateTime JavaTimeStampToDateTime( double javaTimeStamp )
{
    // Java timestamp is milliseconds past epoch
    DateTime dateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
    dateTime = dateTime.AddMilliseconds( javaTimeStamp ).ToLocalTime();
    return dateTime;
}
ScottCher avatar Oct 30 '2008 14:10 ScottCher

La última versión de .NET (v4.6) ha agregado soporte integrado para conversiones de hora de Unix. Eso incluye el tiempo de ida y vuelta de Unix representado por segundos o milisegundos.

  • Tiempo Unix en segundos a UTC DateTimeOffset:

DateTimeOffset dateTimeOffset = DateTimeOffset.FromUnixTimeSeconds(1000);
  • DateTimeOffseta Unix tiempo en segundos:

long unixTimeStampInSeconds = dateTimeOffset.ToUnixTimeSeconds();
  • Hora Unix en milisegundos a UTC DateTimeOffset:

DateTimeOffset dateTimeOffset = DateTimeOffset.FromUnixTimeMilliseconds(1000000);
  • DateTimeOffsetal tiempo de Unix en milisegundos:

long unixTimeStampInMilliseconds = dateTimeOffset.ToUnixTimeMilliseconds();

Nota: Estos métodos convierten hacia y desde UTC DateTimeOffset. Para obtener una DateTimerepresentación simplemente use las propiedades DateTimeOffset.UtcDateTimeo DateTimeOffset.LocalDateTime:

DateTime dateTime = dateTimeOffset.UtcDateTime;
i3arnon avatar Oct 06 '2014 22:10 i3arnon

Fecha y hora a marca de tiempo UNIX:

public static double DateTimeToUnixTimestamp(DateTime dateTime)
{
    return (TimeZoneInfo.ConvertTimeToUtc(dateTime) - 
           new DateTime(1970, 1, 1, 0, 0, 0, 0, System.DateTimeKind.Utc)).TotalSeconds;
}
Dmitry Fedorkov avatar Sep 29 '2011 11:09 Dmitry Fedorkov

Puedes usar DateTimeOffset .

Por ejemplo. Tengo un objeto DateTime

var dateTime1 = DateTime.Now;

Si quiero convertirlo a las marcas de tiempo de Unix, se puede lograr de la siguiente manera

var unixTimeSeconds = new DateTimeOffset(dateTime1).ToUnixTimeSeconds()

Si desea convertir unix timeStamp a DateTime normal, puede usar este código:

var dateTime2 = DateTimeOffset.FromUnixTimeSeconds(unixTimeSeconds).LocalDateTime;

o

var dateTime2 = DateTimeOffset.FromUnixTimeSeconds(unixTimeSeconds).UtcDateTime;

Para obtener más información, visite este enlace:

Método DateTimeOffset.ToUnixTimeSeconds ,
DateTimeOffset.FromUnixTimeSeconds

Ramil Aliyev 007 avatar Apr 23 '2020 06:04 Ramil Aliyev 007