A menos que me falte algo, la "época" es simplemente el punto de origen de un esquema de cronometraje particular. Los ejemplos incluyen 1/1/0001, 1/1/1970 y 1/1/2000. Es más un atributo de un esquema que un esquema (por ejemplo, Julian) en sí mismo.
Bob Kaufman
8
El tiempo transcurrido desde la época es el número de segundos desde el 1 de enero de 1970 UTC.
Taylor Leese
13
@Taylor Esa es la época del tiempo de Unix, y probablemente sea la correcta, pero no es la única época válida. Los usuarios de Unix time no deben confundirse en ese punto.
Para que esto funcione correctamente, tuve que cambiar .AddSeconds a .AddMilliseconds. Necesitará saber si su número proviene de segundos o milisegundos para obtener el resultado correcto. Así, por ejemplo, la siguiente fecha: 1406310305188 (25 de julio de 2014). epochconverter.com también le permitirá verificar sus resultados de conversión.
jrandomuser
55
Debe cambiar el tipo de parámetro a doble (porque AddSeconds acepta doble y, por lo tanto, se convertirá en doble) o agregar un descargo de responsabilidad a la descripción del método de que solo se conservarán 53 de 64 bits de precisión en el argumento.
tomosius
66
@jrandomuser: el tiempo de época de Unix se representa tradicionalmente como segundos desde The Epoch. Desde entonces se ha vuelto común usar milisegundos desde The Epoch (por ejemplo, JavaScript), pero la definición clásica es segundos. En pocas palabras, solo sepa cuál es su valor de entrada (segundos, milisegundos, tics, lo que sea) y use el AddXYZmétodo correcto .
TJ Crowder
Primero intente con AddMilliseconds y si el año aún es 1970, entonces haga AddSeconds. De esta manera funcionará todo el tiempo sin tener que preocuparse por milisegundos o segundos. Además, puede evitar una excisión por desbordamiento. Pasar un gran número a AddSeconds hará que el código se bloquee
Tono Nam
213
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.
long unixTimeStampInMilliseconds= dateTimeOffset.ToUnixTimeMilliseconds();
Nota: Estos métodos convierten desde y hacia DateTimeOffset. Para obtener una DateTimerepresentación simplemente use la DateTimeOffset.DateTimepropiedad:
Tenga en cuenta el siguiente comentario de CodesInChaos de que lo anterior FromUnixTimedevuelve un DateTimecon a Kindde Utc, lo cual está bien, pero lo anterior ToUnixTimees mucho más sospechoso porque no explica qué tipo de DateTimedato datees. Para permitir date's Kindser cualquiera Utco Local, el uso ToUniversalTime:
ToUnixTimesolo funciona correctamente si la fecha está en Utc. Agregue un cheque o conviértalo. (Personalmente prefiero el cheque)
CodesInChaos
2
Acabo de pasar la última hora descubriendo por qué esto no funciona. ¡Necesitas trabajar en millisecondsno segundos!
KristianB
77
@KristianB: "Tiempo de Unix" es tradicionalmente segundos, no milisegundos, desde The Epoch, aunque en estos días tengo cuidado de verificar qué definición está usando alguien. Los segundos solían ser lo suficientemente buenos, y nos dieron un rango razonable a ambos lados de The Epoch en valores de 32 bits con signo. (Y es por eso que justo después de las 3:14 am del 19 de enero de 2038 GMT podría ser un mal momento para algunos ...) El uso de milisegundos es una práctica más moderna gracias a que habitualmente podemos arrojar valores de 64 bits (ambos integrales y doble precisión IEEE-754) ...
TJ Crowder
55
Gracias por el codigo. Solo una pequeña recomendación al crear la base Epoch: asegúrese de establecer explícitamente el valor de milisegundos en 0. es decir, var epoch = new DateTime (1970, 1, 1, 0 / * h * /, 0 / * m * /, 0 / * s * /, 0 / * ms * /, DateTimeKind.Utc); Si no lo configura explícitamente, el valor de milisegundos parece salir como 1. Esto causó algunas inconsistencias en mis pruebas.
ctrlplusb
1
Debe usar AddMillisecondsy debe usar Double NOT Float. De lo contrario, terminarás con un mal momento.
Axel
25
En realidad, desea agregar milisegundos (milisegundos), no segundos. Agregar segundos le dará una excepción fuera de rango.
¿Porqué es eso? epochconverter.com Dice que agrega el número de segundos desde 1/1/970 no ms.
Jamie R Rytlewski
Si va desde ms, obviamente desea AddMillisy si comienza desde segundos, obviamente desea AddSeconds.
Zapato
Tuve el mismo problema que seguía saliendo del rango cuando usaba segundos. El tiempo de Unix que estaba tratando de convertir fue en milisegundos. Pensé que era en segundos. Supongo que el tiempo unix se mide en milisegundos.
DoodleKana
El tiempo de Unix generalmente se expresa en segundos, pero 0.001 es un número válido de segundos (= 1 ms). En caso de duda, utilice la máxima precisión posible.
Scott
9
Si desea un mejor rendimiento, puede usar esta versión.
DateTime.Ticks : cada tic es "cien nanosegundos", por lo que es una "cosa" adicional para recordar. Si omite ambos .Ticks, uno obtendría una buena instancia de TimeSpan de la resta de DateTime.
/// <summary>/// DateTime as UTV for UnixEpoch/// </summary>publicstaticreadonlyDateTimeUnixEpoch=newDateTime(1970,1,1,0,0,0,0,DateTimeKind.Utc);/// <summary>/// Per JWT spec:/// Gets the number of seconds from 1970-01-01T0:0:0Z as measured in UTC until the desired date/time./// </summary>/// <param name="datetime">The DateTime to convert to seconds.</param>/// <remarks>if dateTimeUtc less than UnixEpoch, return 0</remarks>/// <returns>the number of seconds since Unix Epoch.</returns>publicstaticlongGetIntDate(DateTime datetime){DateTime dateTimeUtc = datetime;if(datetime.Kind!=DateTimeKind.Utc){
dateTimeUtc = datetime.ToUniversalTime();}if(dateTimeUtc.ToUniversalTime()<=UnixEpoch){return0;}return(long)(dateTimeUtc -UnixEpoch).TotalSeconds;}
¿esto tiene en cuenta los años bisiestos y los segundos bisiestos, etc.?
Jodrell
1
Para ampliar el comentario anterior, aquí hay un breve video que explica por qué el tiempo es complicado y por qué no debería intentar hacerlo usted mismo: youtube.com/watch?v=-5wpm-gesOY
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
AddXYZmé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:DateTimeOffsetal tiempo de Unix en segundos:DateTimeOffset:DateTimeOffsetal tiempo Unix en milisegundos:Nota: Estos métodos convierten desde y hacia
DateTimeOffset. Para obtener unaDateTimerepresentación simplemente use laDateTimeOffset.DateTimepropiedad: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
FromUnixTimedevuelve unDateTimecon aKinddeUtc, lo cual está bien, pero lo anteriorToUnixTimees mucho más sospechoso porque no explica qué tipo deDateTimedatodatees. Para permitirdate'sKindser cualquieraUtcoLocal, el usoToUniversalTime:ToUniversalTimeconvertirá unLocal(oUnspecified)DateTimeaUtc.si no desea crear la instancia de epoch DateTime al pasar de DateTime a epoch, también puede hacer:
fuente
ToUnixTimesolo funciona correctamente si la fecha está en Utc. Agregue un cheque o conviértalo. (Personalmente prefiero el cheque)millisecondsno segundos!AddMillisecondsy 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
AddMillisy 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
EpochaDateTimecon 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 timeaDateTimesin perder precisión, así es como:fuente
Desde .Net 4.6 y superior, use DateTimeOffset.Now.ToUnixTimeSeconds ()
fuente
Aquí está mi solución:
fuente