2008-11-14 28 views

Respuesta

3

El marco no incluye los viejos segundos (o milisegundos) desde 1970. Lo más cerca que se obtiene es DateTime.Ticks que es el número de 100 nanosegundos desde enero de 0001. 1 ª

+1

¿Daría (DateTime.Ticks/10000000) - (el número de segundos entre 0001 y 1970) una respuesta precisa? – Liam

85

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; 
} 
6

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

C# que 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; 
    } 

edición: hizo UTC como se sugiere :)

+3

DateTime.Now usa la hora local, no UTC. No sé exactamente qué sucede cuando restas un tipo desconocido de DateTime de uno local, pero es mejor configurar ambos para UTC :) –

4

Aquí es una forma sencilla de aproximarse a la marca de tiempo Unix. El uso de UTC está más cerca del concepto de Unix, y necesita encubrir desde double hasta 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); 

impresiones:

millis=1226674125796 
+0

exactamente lo que necesitaba. – Ajibola

8

También podríamos conseguir un poco de fantasía y hacerlo como un método de extensión, por lo que cuelga 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); 
    } 
} 
+0

Interesante mezcla de idiomas que tienes allí;) –

+0

¡Lol! A veces lo hago: tengo que cambiar mucho entre los dos, pero normalmente está en el IDE, así que tengo un feedback instantáneo sobre él. –

+2

¿No está esto un poco mal? Este método de extensión se transferirá a cualquier * instancia * de DateTime, pero no utiliza la instancia. Simplemente parece confuso ... No creo que deba requerir un parámetro que no use – mortb

61

Un idioma común en Java es utilizar el currentTimeMillis() para el tiempo o los propósitos de programación, donde no está interesado en los milisegundos reales desde 1970, sino que calcula algún valor relativo y compare invocat más tarde iones de currentTimeMillis() a ese valor.

Si eso es lo que está buscando, el equivalente de C# es Environment.TickCount.

+1

Pero ambos dan números diferentes. ¿Cómo se comparan correctamente? 'C# give: 2688547' y' Java give: 1390707872687' – Elshan

+0

@Elshan No se pueden comparar. Son diferentes tics. Esta técnica es para el tiempo y la programación dentro de una aplicación, no a través de las aplicaciones. – Barend

+0

'System.currentTimeMillis()' devuelve la hora UTC en ms desde 1970, mientras que 'Environment.TickCount' devuelve ms desde que se inició la aplicación. 'System.currentTimeMillis()' es bueno para verificar el tiempo transcurrido, pero si quiere que dos duraciones sean comparables, debe usar 'System.nanoTime()'. – michelpm

8

Si está interesado en TIEMPO, 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(); 
1

sé pregunta pide equivalente pero desde que uso los 2 para las mismas tareas que lanzo en GetTickCount. Puede que tenga nostalgia, pero System.currentTimeMillis() y GetTickCount() son los únicos que uso para obtener tics.

[DllImport("kernel32.dll")] 
static extern uint GetTickCount(); 

// call 
uint ticks = GetTickCount(); 
3

acabo considera más sencillo manera de cómo lograr lo que usted ha estado luchando por la siguiente manera:

DateTime.Now.Ticks/TimeSpan.TicksPerMillisecond 
+1

'DateTime.UtcNow' es una mejor opción –

1

Si desea una marca de tiempo a comparar entre los diferentes procesos, diferentes idiomas (Java, C, C#), bajo GNU/Linux y Windows (al menos siete):

C#:

private static long nanoTime() { 
    long nano = 10000L * Stopwatch.GetTimestamp(); 
    nano /= TimeSpan.TicksPerMillisecond; 
    nano *= 100L; 
    return nano; 
} 

Java:

java.lang.System.nanoTime(); 

C de 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; 
} 

Windows C:

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; 
}