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.
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();
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:
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.
Framework nie zawiera starych sekund (lub milisekund) od 1970 roku. Najbliższe otrzymane to DateTime.Ticks, czyli liczba 100 nanosekund od 1 stycznia 0001.
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):
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.
Odpowiedzi:
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; }
źródło
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 zcurrentTimeMillis()
tą wartością.Jeśli tego właśnie szukasz, odpowiednik C # to
Environment.TickCount
.źródło
C# give : 2688547
iJava give : 1390707872687
System.currentTimeMillis()
zwraca czas UTC w ms od 1970 r., natomiastEnvironment.TickCount
zwraca 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()
.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();
źródło
DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
źródło
DateTimeOffset
metoda została wprowadzona w .Net 4.6.System.currentTimeMillis()
w java zwraca aktualny czas w milisekundach od 1/1/1970c # 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ą :)
źródło
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); } }
źródło
d
nie jest używana. Aby użyć tego kodu, możesz napisać,var date = new DateTime(); var millis = date.currentTimeMillis();
aledate
zmienna 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ścid
zamiastDateTime.UtcNow
w treści metody? Często używam metod rozszerzających, ale nie do tego.Oto prosty sposób na przybliżenie znacznika czasu systemu Unix. Używanie UTC jest bliższe koncepcji unixowej i musisz ukryć od
double
dolong
.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
źródło
Framework nie zawiera starych sekund (lub milisekund) od 1970 roku. Najbliższe otrzymane to DateTime.Ticks, czyli liczba 100 nanosekund od 1 stycznia 0001.
źródło
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
źródło
DateTime.UtcNow
jest lepszą opcją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; }
źródło
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();
źródło