¿Cómo puedo convertir una marca de tiempo de Unix a DateTime y viceversa?
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);
}
}
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;
}
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);
DateTimeOffset
a Unix tiempo en segundos:
long unixTimeStampInSeconds = dateTimeOffset.ToUnixTimeSeconds();
- Hora Unix en milisegundos a UTC
DateTimeOffset
:
DateTimeOffset dateTimeOffset = DateTimeOffset.FromUnixTimeMilliseconds(1000000);
DateTimeOffset
al tiempo de Unix en milisegundos:
long unixTimeStampInMilliseconds = dateTimeOffset.ToUnixTimeMilliseconds();
Nota: Estos métodos convierten hacia y desde UTC DateTimeOffset
. Para obtener una DateTime
representación simplemente use las propiedades DateTimeOffset.UtcDateTime
o DateTimeOffset.LocalDateTime
:
DateTime dateTime = dateTimeOffset.UtcDateTime;
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;
}
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