Qual è l'equivalente di Java System.currentTimeMillis()in C #?
Risposte:
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 è quello di utilizzare currentTimeMillis()per scopi di temporizzazione o pianificazione, in cui non sei interessato ai millisecondi effettivi dal 1970, ma calcola invece un valore relativo e confronta le chiamate successive currentTimeMillis()a quel valore.
Se è quello che stai cercando, l'equivalente in C # è Environment.TickCount.
C# give : 2688547eJava give : 1390707872687
System.currentTimeMillis()restituisce l'ora UTC in ms dal 1970, mentre Environment.TickCountrestituisce ms dall'avvio dell'app. System.currentTimeMillis()è utile per controllare il tempo trascorso, ma se vuoi che due durate siano confrontabili devi usare System.nanoTime().
DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
DateTimeOffsetmetodo è stato introdotto a partire da .Net 4.6.
l' System.currentTimeMillis()in java restituisce l'ora corrente in millisecondi dal 1/1/1970
c # 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 :)
Potremmo anche avere un po 'di fantasia e farlo come un metodo di estensione, in modo che si blocchi dalla classe 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);
}
}
dnon viene utilizzato. Per usare questo codice potresti scrivere var date = new DateTime(); var millis = date.currentTimeMillis();Ma la datevariabile sarebbe solo ridondante e il suo stato non sarebbe mai stato usato. Quando non si utilizza lo stato dell'oggetto, la creazione di un metodo di estensione oscura semplicemente il codice. La risposta fornita da @Hath è più semplice e quindi migliore (per me). Forse @Joel Coehoorn intendeva usare il valore dinvece che DateTime.UtcNownel corpo del metodo? Uso molto i metodi di estensione, ma non per questo.
Ecco un modo semplice per approssimare il timestamp di Unix. L'uso di UTC è più vicino al concetto di unix e devi passare da 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);
stampe:
millis=1226674125796
Il framework non include i vecchi secondi (o millisecondi) dal 1970. Il più vicino che ottieni è DateTime.Ticks che è il numero di 100 nanosecondi dal 1 gennaio 0001.
Considero solo il modo più semplice per ottenere ciò per cui ti sei sforzato come segue:
DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond
DateTime.UtcNowè un'opzione migliore
Se vuoi confrontare un timestamp tra processi diversi, 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;
}
So che la domanda richiede l' equivalente, ma dal momento che uso quei 2 per le stesse attività, lancio GetTickCount . Potrei essere nostalgico ma System.currentTimeMillis () e GetTickCount () sono gli unici che uso per ottenere le zecche.
[DllImport("kernel32.dll")]
static extern uint GetTickCount();
// call
uint ticks = GetTickCount();