Equivalente Java System.currentTimeMillis () in C #

Qual è l’equivalente di System.currentTimeMillis() di Java in C #?

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

Un idioma comune in Java consiste nell’utilizzare il currentTimeMillis() per scopi di pianificazione o temporizzazione, in cui non vi interessa i millisecondi effettivi dal 1970, ma invece di calcolare un valore relativo e confrontare le chiamate successive di currentTimeMillis() con quel valore.

Se questo è quello che stai cercando, l’equivalente C # è Environment.TickCount .

Potremmo anche avere un po ‘di fantasia e farlo come un metodo di estensione, in modo che si blocchi la class 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); } } 

Se sei interessato a TIMING, aggiungi un riferimento a System.Diagnostics e usa un cronometro.

Per esempio:

 var sw = Stopwatch.StartNew(); ... var elapsedStage1 = sw.ElapsedMilliseconds; ... var elapsedStage2 = sw.ElapsedMilliseconds; ... sw.Stop(); 

il System.currentTimeMillis() in java restituisce l’ora corrente in millisecondi dal 1/1/1970

c # che sarebbe

 public static double GetCurrentMilli() { DateTime Jan1970 = new DateTime(1970, 1, 1, 0, 0,0,DateTimeKind.Utc); TimeSpan javaSpan = DateTime.UtcNow - Jan1970; return javaSpan.TotalMilliseconds; } 

modifica: reso utc come suggerito 🙂

Ecco un modo semplice per approssimare il timestamp Unix. L’uso di UTC è più vicino al concetto di unix e devi essere nascosto dal double al 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); 

stampe:

 millis=1226674125796 

Il framework non include i vecchi secondi (o millisecondi) dal 1970. Il più vicino si ottiene DateTime.Ticks che è il numero di 100-nanosecondi dal 1 ° gennaio 0001.

Considero solo il modo più diretto per ottenere ciò che cercavi nel modo seguente:

 DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond 

So che la domanda richiede equivalenti, ma dal momento che li uso questi 2 per gli stessi compiti, lancio GetTickCount . Potrei essere nostalgico ma System.currentTimeMillis () e GetTickCount () sono gli unici che uso per ottenere i tick.

 [DllImport("kernel32.dll")] static extern uint GetTickCount(); // call uint ticks = GetTickCount(); 

Se si desidera confrontare un timestamp tra diversi processi, linguaggi diversi (Java, C, C #), sotto GNU / Linux e Windows (almeno sette):

C #:

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

Giava:

 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; } 
 DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()