Equivalente de Java System.currentTimeMillis () en C #

85

¿Cuál es el equivalente de Java System.currentTimeMillis()en C #?

mate b
fuente
Solo por curiosidad, ¿por qué necesitas los milis desde 1970?
Alex B
5
DateTimeOffset.UtcNow.ToUnixTimeMilliseconds ()
Ramunas

Respuestas:

90

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;
}
Jon Skeet
fuente
2
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.

Extremo de la barra
fuente
1
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();
bstabile
fuente
8
DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
Ramunas
fuente
Ese DateTimeOffsetmétodo se introdujo a partir de .Net 4.6.
Suncat2000
7

el System.currentTimeMillis()en java devuelve la hora actual en milisegundos desde 1/1/1970

c # 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 :)

Tiene
fuente
4
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:

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);
    }
}
Joel Coehoorn
fuente
3
¿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.

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
gimel
fuente
exactamente lo que necesitaba.
Ajibola
3

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.

Cristian Libardo
fuente
1
¿(DateTime.Ticks / 10000000) - (el número de segundos entre 0001 y 1970) daría una respuesta precisa?
Liam
3

Solo considero la forma más sencilla de lograr lo que ha estado luchando de la siguiente manera:

DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond
TechCrap
fuente
1
DateTime.UtcNowes una mejor opción
Mehdi Khademloo
2

Si 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;
}
Aubin
fuente
1

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();
Azul amargo
fuente