Jaki jest odpowiednik Java System.currentTimeMillis()
w C #?
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;
}
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
.
C# give : 2688547
iJava give : 1390707872687
System.currentTimeMillis()
zwraca czas UTC w ms od 1970 r., natomiast Environment.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()
.
DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
DateTimeOffset
metoda została wprowadzona w .Net 4.6.
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ą :)
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);
}
}
d
nie jest używana. Aby użyć tego kodu, możesz napisać, var date = new DateTime(); var millis = date.currentTimeMillis();
ale date
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ści d
zamiast DateTime.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
do 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
Framework nie zawiera starych sekund (lub milisekund) od 1970 roku. Najbliższe otrzymane to DateTime.Ticks, czyli liczba 100 nanosekund od 1 stycznia 0001.
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
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;
}
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();