¿Cómo se convierte el tiempo de época de Unix en tiempo real en C #? (Época comenzando el 1/1/1970)
377
¿Cómo se convierte el tiempo de época de Unix en tiempo real en C #? (Época comenzando el 1/1/1970)
Respuestas:
Supongo que te refieres a la hora de Unix , que se define como el número de segundos desde la medianoche (UTC) del 1 de enero de 1970.
fuente
AddXYZ
método correcto .La última versión de .Net (v4.6) acaba de agregar soporte incorporado para las conversiones de tiempo Unix. Eso incluye el tiempo hacia y desde Unix representado por segundos o milisegundos.
DateTimeOffset
:DateTimeOffset
al tiempo de Unix en segundos:DateTimeOffset
:DateTimeOffset
al tiempo Unix en milisegundos:Nota: Estos métodos convierten desde y hacia
DateTimeOffset
. Para obtener unaDateTime
representación simplemente use laDateTimeOffset.DateTime
propiedad:fuente
'DateTimeOffset' does not contain a definition for 'FromUnixTimeSeconds'
¿Cómo haría para resolver esto?Con todo el crédito a LukeH, he reunido algunos métodos de extensión para un uso fácil:
Tenga en cuenta el siguiente comentario de CodesInChaos de que lo anterior
FromUnixTime
devuelve unDateTime
con aKind
deUtc
, lo cual está bien, pero lo anteriorToUnixTime
es mucho más sospechoso porque no explica qué tipo deDateTime
datodate
es. Para permitirdate
'sKind
ser cualquieraUtc
oLocal
, el usoToUniversalTime
:ToUniversalTime
convertirá unLocal
(oUnspecified
)DateTime
aUtc
.si no desea crear la instancia de epoch DateTime al pasar de DateTime a epoch, también puede hacer:
fuente
ToUnixTime
solo funciona correctamente si la fecha está en Utc. Agregue un cheque o conviértalo. (Personalmente prefiero el cheque)milliseconds
no segundos!AddMilliseconds
y debe usar Double NOT Float. De lo contrario, terminarás con un mal momento.En realidad, desea agregar milisegundos (milisegundos), no segundos. Agregar segundos le dará una excepción fuera de rango.
fuente
AddMillis
y si comienza desde segundos, obviamente deseaAddSeconds
.Si desea un mejor rendimiento, puede usar esta versión.
De un punto de referencia rápido (BenchmarkDotNet) bajo net471 obtengo este número:
2 veces más rápido contra la versión de LukeH (si es el rendimiento mater)
Esto es similar al funcionamiento interno de DateTime.
fuente
Use el método DateTimeOffset.ToUnixTimeMilliseconds () Devuelve el número de milisegundos que han transcurrido desde 1970-01-01T00: 00: 00.000Z.
Está bien documentado aquí DateTimeOffset.ToUnixTimeMilliseconds
La otra salida es usar lo siguiente
Para obtener el EPOCH con solo segundos, puede usar
y convertir el
Epoch
aDateTime
con el siguiente métodofuente
.Ticks
, uno obtendría una buena instancia de TimeSpan de la resta de DateTime.Debería usar ToUniversalTime () para el objeto DateTime.
fuente
Yo uso los siguientes métodos de extensión para la conversión de época
fuente
Para no preocuparse por usar milisegundos o segundos, simplemente haga lo siguiente:
Si el tiempo de la época es en segundos, no hay forma de que pueda pasar el año 1972 agregando milisegundos.
fuente
Si no está utilizando 4.6, esto puede ayudar Fuente: System.IdentityModel.Tokens
fuente
using Microsoft.IdentityModel.Tokens; ... EpochTime.GetIntDate(dateTime);
En caso de que necesite convertir una estructura timeval (segundos, microsegundos) que contenga
UNIX time
aDateTime
sin perder precisión, así es como:fuente
Desde .Net 4.6 y superior, use DateTimeOffset.Now.ToUnixTimeSeconds ()
fuente
Aquí está mi solución:
fuente