Equivalente Java System.currentTimeMillis () in C #


86

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


Solo curioso, perché hai bisogno dei millisecondi dal 1970?
Alex B

5
DateTimeOffset.UtcNow.ToUnixTimeMilliseconds ()
Ramunas

Risposte:


90

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

2
Stesso risultato con "DateTimeOffset.UtcNow.ToUnixTimeMilliseconds ()"
Ramunas

75

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.


1
Ma entrambi danno numeri di differenza. Come si confrontano correttamente ?? C# give : 2688547eJava give : 1390707872687
Elshan

1
@Elshan Non puoi confrontarli. Sono zecche diverse. Questa tecnica è per la temporizzazione e la pianificazione all'interno di un'applicazione, non tra le applicazioni.
Barend

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().
michelpm

12

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();

8
DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()

Questo DateTimeOffsetmetodo è stato introdotto a partire da .Net 4.6.
Suncat2000,

7

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


4
DateTime.Now utilizza l'ora locale, non UTC. Non so esattamente cosa succede quando sottrai un tipo sconosciuto di DateTime da uno locale, ma è meglio impostarli entrambi su UTC :)
Jon Skeet

7

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

3
Non è un po 'sbagliato? Questo metodo di estensione passerà a qualsiasi istanza di DateTime, ma non utilizza l'istanza. Sembra solo confuso ... Non penso che dovresti richiedere un parametro che non usi
mortb

1
@mortb Questo è un metodo di estensione. È così che viene definito in C # "aggiungere un metodo" a una classe senza modificare la classe. Il compilatore interpreta il metodo e può applicarlo a un'istanza del parametro "this" come se fosse un metodo di istanza sulla classe stessa. Funziona esattamente come un metodo sulla classe statica, ma il compilatore consente di scrivere una sintassi alternativa più semplice.
Suncat2000,

1
Il problema è che il valore del parametro 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.
mortb

Perché dovresti creare un'estensione che non usi la data? Ho usato questo codice e mi ha colto di sorpresa. La versione corretta è: return (long) ((d.ToUniversalTime () - Jan1st1970) .TotalMilliseconds);
Mark G

4

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

esattamente quello di cui avevo bisogno.
Ajibola

3

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.


1
(DateTime.Ticks / 10000000) - (il numero di secondi tra 0001 e 1970) fornirebbe una risposta accurata?
Liam

3

Considero solo il modo più semplice per ottenere ciò per cui ti sei sforzato come segue:

DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond

1
DateTime.UtcNowè un'opzione migliore
Mehdi Khademloo

2

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

1

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();
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.