Mismo resultado con "DateTimeOffset.UtcNow.ToUnixTimeMilliseconds ()"
Ramunas
74
Un modismo común en Java es usar el currentTimeMillis()para propósitos de sincronización o programación, donde no está interesado en los milisegundos reales desde 1970, sino que calcula algún valor relativo y compara las invocaciones posteriores currentTimeMillis()con ese valor.
Si eso es lo que está buscando, el equivalente de C # es Environment.TickCount.
Pero ambos dan números de diferencia. ¿Cómo se comparan correctamente? C# give : 2688547yJava give : 1390707872687
Elshan
1
@Elshan No puedes compararlos. Son garrapatas diferentes. Esta técnica es para cronometrar y programar dentro de una aplicación, no entre aplicaciones.
Barend
System.currentTimeMillis()devuelve la hora UTC en ms desde 1970, mientras que Environment.TickCountdevuelve ms desde que se inició la aplicación. System.currentTimeMillis()es bueno para verificar el tiempo transcurrido, pero si desea que dos duraciones sean comparables, debe usar System.nanoTime().
michelpm
12
Si está interesado en TIMING, agregue una referencia a System.Diagnostics y use un cronómetro.
Por ejemplo:
var sw = Stopwatch.StartNew();
...
var elapsedStage1 = sw.ElapsedMilliseconds;
...
var elapsedStage2 = sw.ElapsedMilliseconds;
...
sw.Stop();
DateTime. Ahora usa la hora local, no UTC. No sé exactamente qué sucede cuando resta un tipo desconocido de DateTime de uno local, pero es mejor configurar ambos en UTC :)
Jon Skeet
7
También podríamos ponernos un poco elegantes y hacerlo como un método de extensión, para que cuelgue de la clase DateTime:
¿No es esto un poco malo? Este método de extensión se transferirá a cualquier instancia de DateTime, pero no usa la instancia. Parece confuso ... No creo que deba requerir un parámetro que no use
mortb
1
@mortb Ese es un método de extensión. Así es como se define en C # para "agregar un método" a una clase sin modificar la clase. El compilador interpreta el método y puede aplicarlo a una instancia del parámetro "this" como si fuera un método de instancia en la propia clase. Funciona igual que un método en la clase estática, pero el compilador permite escribir una sintaxis alternativa más fácil.
Suncat2000
1
El problema es que dno se utiliza el valor del parámetro . Para usar este código, podría escribir var date = new DateTime(); var millis = date.currentTimeMillis();Pero la datevariable sería redundante y su estado nunca se usaría. Cuando no se usa el estado del objeto, la creación de un método de extensión solo oscurece el código. La respuesta proporcionada por @Hath es más sencilla y, por lo tanto, mejor (para mí). ¿Quizás @Joel Coehoorn tenía la intención de usar el valor en dlugar del DateTime.UtcNowcuerpo del método? Utilizo mucho métodos de extensión, pero no para esto.
mortb
¿Por qué crearías una extensión que no use la fecha? Usé este código y me sorprendió. La versión correcta es: return (long) ((d.ToUniversalTime () - Jan1st1970) .TotalMilliseconds);
Mark G
4
A continuación, se muestra una forma sencilla de aproximar la marca de tiempo de Unix. El uso de UTC está más cerca del concepto de Unix, y necesita cambiar de doublea long.
El marco no incluye los viejos segundos (o milisegundos) desde 1970. Lo más cercano que obtiene es DateTime.Ticks, que es el número de 100 nanosegundos desde el 1 de enero de 0001.
Sé que la pregunta solicita el equivalente, pero como uso esos 2 para las mismas tareas, lanzo GetTickCount . Puede que sea nostálgico, pero System.currentTimeMillis () y GetTickCount () son los únicos que uso para obtener tics.
Respuestas:
Una alternativa:
private static readonly DateTime Jan1st1970 = new DateTime (1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); public static long CurrentTimeMillis() { return (long) (DateTime.UtcNow - Jan1st1970).TotalMilliseconds; }
fuente
Un modismo común en Java es usar el
currentTimeMillis()
para propósitos de sincronización o programación, donde no está interesado en los milisegundos reales desde 1970, sino que calcula algún valor relativo y compara las invocaciones posteriorescurrentTimeMillis()
con ese valor.Si eso es lo que está buscando, el equivalente de C # es
Environment.TickCount
.fuente
C# give : 2688547
yJava give : 1390707872687
System.currentTimeMillis()
devuelve la hora UTC en ms desde 1970, mientras queEnvironment.TickCount
devuelve ms desde que se inició la aplicación.System.currentTimeMillis()
es bueno para verificar el tiempo transcurrido, pero si desea que dos duraciones sean comparables, debe usarSystem.nanoTime()
.Si está interesado en TIMING, agregue una referencia a System.Diagnostics y use un cronómetro.
Por ejemplo:
var sw = Stopwatch.StartNew(); ... var elapsedStage1 = sw.ElapsedMilliseconds; ... var elapsedStage2 = sw.ElapsedMilliseconds; ... sw.Stop();
fuente
DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
fuente
DateTimeOffset
método se introdujo a partir de .Net 4.6.el
System.currentTimeMillis()
en java devuelve la hora actual en milisegundos desde 1/1/1970c # eso sería
public static double GetCurrentMilli() { DateTime Jan1970 = new DateTime(1970, 1, 1, 0, 0,0,DateTimeKind.Utc); TimeSpan javaSpan = DateTime.UtcNow - Jan1970; return javaSpan.TotalMilliseconds; }
editar: lo hizo utc como se sugiere :)
fuente
También podríamos ponernos un poco elegantes y hacerlo como un método de extensión, para que cuelgue de la clase DateTime:
public static class DateTimeExtensions { private static DateTime Jan1st1970 = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); public static long currentTimeMillis(this DateTime d) { return (long) ((DateTime.UtcNow - Jan1st1970).TotalMilliseconds); } }
fuente
d
no se utiliza el valor del parámetro . Para usar este código, podría escribirvar date = new DateTime(); var millis = date.currentTimeMillis();
Pero ladate
variable sería redundante y su estado nunca se usaría. Cuando no se usa el estado del objeto, la creación de un método de extensión solo oscurece el código. La respuesta proporcionada por @Hath es más sencilla y, por lo tanto, mejor (para mí). ¿Quizás @Joel Coehoorn tenía la intención de usar el valor end
lugar delDateTime.UtcNow
cuerpo del método? Utilizo mucho métodos de extensión, pero no para esto.A continuación, se muestra una forma sencilla de aproximar la marca de tiempo de Unix. El uso de UTC está más cerca del concepto de Unix, y necesita cambiar de
double
along
.TimeSpan ts = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)); long millis = (long)ts.TotalMilliseconds; Console.WriteLine("millis={0}", millis);
huellas dactilares:
millis=1226674125796
fuente
El marco no incluye los viejos segundos (o milisegundos) desde 1970. Lo más cercano que obtiene es DateTime.Ticks, que es el número de 100 nanosegundos desde el 1 de enero de 0001.
fuente
Solo considero la forma más sencilla de lograr lo que ha estado luchando de la siguiente manera:
DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond
fuente
DateTime.UtcNow
es una mejor opciónSi desea comparar una marca de tiempo entre diferentes procesos, diferentes lenguajes (Java, C, C #), bajo GNU / Linux y Windows (siete al menos):
C#:
private static long nanoTime() { long nano = 10000L * Stopwatch.GetTimestamp(); nano /= TimeSpan.TicksPerMillisecond; nano *= 100L; return nano; }
Java:
java.lang.System.nanoTime();
C GNU / Linux:
static int64_t hpms_nano() { struct timespec t; clock_gettime( CLOCK_MONOTONIC, &t ); int64_t nano = t.tv_sec; nano *= 1000; nano *= 1000; nano *= 1000; nano += t.tv_nsec; return nano; }
C Windows:
static int64_t hpms_nano() { static LARGE_INTEGER ticksPerSecond; if( ticksPerSecond.QuadPart == 0 ) { QueryPerformanceFrequency( &ticksPerSecond ); } LARGE_INTEGER ticks; QueryPerformanceCounter( &ticks ); uint64_t nano = ( 1000*1000*10UL * ticks.QuadPart ) / ticksPerSecond.QuadPart; nano *= 100UL; return nano; }
fuente
Sé que la pregunta solicita el equivalente, pero como uso esos 2 para las mismas tareas, lanzo GetTickCount . Puede que sea nostálgico, pero System.currentTimeMillis () y GetTickCount () son los únicos que uso para obtener tics.
[DllImport("kernel32.dll")] static extern uint GetTickCount(); // call uint ticks = GetTickCount();
fuente