Odpowiednik Java System.currentTimeMillis () w C #


85

Jaki jest odpowiednik Java System.currentTimeMillis()w C #?


Ciekawe, dlaczego potrzebujesz Millisa od 1970 roku?
Alex B

5
DateTimeOffset.UtcNow.ToUnixTimeMilliseconds ()
Ramunas

Odpowiedzi:


90

Alternatywa:

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
Ten sam wynik z „DateTimeOffset.UtcNow.ToUnixTimeMilliseconds ()”
Ramunas

74

Popularnym idiomem w Javie jest używanie do currentTimeMillis()celów synchronizacji lub planowania, gdzie nie interesują Cię rzeczywiste milisekundy od 1970 roku, ale zamiast tego obliczasz względną wartość i porównujesz późniejsze wywołania z currentTimeMillis()tą wartością.

Jeśli tego właśnie szukasz, odpowiednik C # to Environment.TickCount.


1
Ale oba podają wartości różnicowe. Jak prawidłowo porównują? C# give : 2688547iJava give : 1390707872687
Elshan

1
@Elshan Nie możesz ich porównać. To różne kleszcze. Ta technika służy do synchronizowania i planowania w aplikacji, a nie między aplikacjami.
Barend

System.currentTimeMillis()zwraca czas UTC w ms od 1970 r., natomiast Environment.TickCountzwraca ms od momentu uruchomienia aplikacji. System.currentTimeMillis()jest dobry do sprawdzania upływającego czasu, ale jeśli chcesz, aby dwa czasy trwania były porównywalne, musisz użyć System.nanoTime().
michelpm

12

Jeśli interesuje Cię TIMING, dodaj odwołanie do System.Diagnostics i użyj Stopwatch.

Na przykład:

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


7

System.currentTimeMillis()w java zwraca aktualny czas w milisekundach od 1/1/1970

c # to byłoby

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

edit: zrobiłem to utc zgodnie z sugestią :)


4
DateTime.Now używa czasu lokalnego, a nie UTC. Nie wiem dokładnie, co się stanie, gdy odejmiesz nieznany rodzaj DateTime od lokalnego, ale najlepiej ustawić oba na UTC :)
Jon Skeet

7

Moglibyśmy też trochę wymyślić i zrobić to jako metodę rozszerzającą, tak aby wisiała poza klasą 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
Czy to nie jest trochę złe? Ta metoda rozszerzenia będzie przekazywać dowolne wystąpienie DateTime, ale nie używa tego wystąpienia. Po prostu wydaje się zagmatwane ... Nie sądzę, abyś wymagał parametru, którego nie używasz
mortb

1
@mortb To jest metoda rozszerzenia. W ten sposób zostało zdefiniowane w C #, aby „dodać metodę” do klasy bez modyfikowania klasy. Kompilator interpretuje metodę i może zastosować ją do wystąpienia parametru „this” tak, jakby była to metoda instancji w samej klasie. Działa tak samo jak metoda w klasie statycznej, ale kompilator umożliwia napisanie łatwiejszej, alternatywnej składni.
Suncat2000

1
Problem w tym, że wartość parametru dnie jest używana. Aby użyć tego kodu, możesz napisać, var date = new DateTime(); var millis = date.currentTimeMillis();ale datezmienna byłaby po prostu zbędna, a jej stan nigdy nie byłby używany. Gdy nie używa się stanu obiektu, tworzenie metody rozszerzającej jedynie przesłania kod. Odpowiedź udzielona przez @Hath jest prostsza, a zatem lepsza (dla mnie). Może @Joel Coehoorn zamierzał użyć wartości dzamiast DateTime.UtcNoww treści metody? Często używam metod rozszerzających, ale nie do tego.
mortb

Dlaczego miałbyś tworzyć rozszerzenie, które nie używa daty? Użyłem tego kodu i złapał mnie. Prawidłowa wersja to: return (long) ((d.ToUniversalTime () - Jan1st1970) .TotalMilliseconds);
Mark G

4

Oto prosty sposób na przybliżenie znacznika czasu systemu Unix. Używanie UTC jest bliższe koncepcji unixowej i musisz ukryć od doubledo 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);

wydruki:

millis=1226674125796

dokładnie to, czego potrzebowałem.
Ajibola

3

Framework nie zawiera starych sekund (lub milisekund) od 1970 roku. Najbliższe otrzymane to DateTime.Ticks, czyli liczba 100 nanosekund od 1 stycznia 0001.


1
Czy (DateTime.Ticks / 10000000) - (liczba sekund między 0001 a 1970) poda dokładną odpowiedź?
Liam

3

Po prostu rozważam najprostszy sposób osiągnięcia tego, do czego dążyłeś, w następujący sposób:

DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond

1
DateTime.UtcNowjest lepszą opcją
Mehdi Khademloo

2

Jeśli chcesz, aby znacznik czasu był porównywany między różnymi procesami, różnymi językami (Java, C, C #), w systemie GNU / Linux i Windows (przynajmniej siedem):

DO#:

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

Jawa:

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

Wiem, że pytanie wymaga odpowiednika, ale ponieważ używam tych 2 do tych samych zadań, wrzucam GetTickCount . Mogę być nostalgiczny, ale System.currentTimeMillis () i GetTickCount () są jedynymi, których używam do uzyskiwania tików.

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

// call
uint ticks = GetTickCount();
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.