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 : 2688547iJava give : 1390707872687
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().
DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
DateTimeOffsetmetoda 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);
}
}
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.
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
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.UtcNowjest 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();