Was entspricht Java System.currentTimeMillis()
in C #?
Antworten:
Eine Alternative:
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;
}
Eine gängige Redewendung in Java ist die Verwendung von currentTimeMillis()
für Timing- oder Planungszwecke, bei denen Sie nicht an den tatsächlichen Millisekunden seit 1970 interessiert sind, sondern stattdessen einen relativen Wert berechnen und spätere Aufrufe von vergleichencurrentTimeMillis()
mit diesem Wert vergleichen.
Wenn Sie danach suchen, ist das C # -Äquivalent Environment.TickCount
.
C# give : 2688547
undJava give : 1390707872687
System.currentTimeMillis()
Gibt die UTC-Zeit in ms seit 1970 zurück, während Environment.TickCount
ms seit dem Start der App zurückgegeben wird. System.currentTimeMillis()
ist gut für die Überprüfung der verstrichenen Zeit, aber wenn Sie möchten, dass zwei Dauern vergleichbar sind, müssen Sie verwenden System.nanoTime()
.
DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
DateTimeOffset
Methode wurde ab .Net 4.6 eingeführt.
das System.currentTimeMillis()
in Java gibt die aktuelle Zeit in Millisekunden vom 1.1.1970
c # das wäre
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: machte es utc wie vorgeschlagen :)
Wir könnten auch ein wenig Lust bekommen und es als Erweiterungsmethode tun, so dass es von der DateTime-Klasse abhängt:
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
nicht verwendet wird. Um diesen Code zu verwenden, könnten Sie schreiben. var date = new DateTime(); var millis = date.currentTimeMillis();
Die date
Variable wäre jedoch nur redundant und ihr Status würde nie verwendet. Wenn Sie den Status des Objekts nicht verwenden, wird beim Erstellen einer Erweiterungsmethode nur der Code verdeckt. Die Antwort von @Hath ist direkter und daher besser (für mich). Vielleicht wollte @Joel Coehoorn den Wert d
anstelle des DateTime.UtcNow
Methodenkörpers verwenden? Ich benutze ziemlich oft Erweiterungsmethoden, aber nicht dafür.
Hier ist eine einfache Möglichkeit, den Unix-Zeitstempel zu approximieren. Mit UTC näher an das Unix - Konzept, und Sie müssen von verdeckte double
zu 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);
Drucke:
millis=1226674125796
Das Framework enthält nicht die alten Sekunden (oder Millisekunden) seit 1970. Der nächste Wert ist DateTime.Ticks. Dies ist die Anzahl von 100 Nanosekunden seit dem 1. Januar 0001.
Ich betrachte nur den einfachsten Weg, um das zu erreichen, was Sie angestrebt haben:
DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond
DateTime.UtcNow
ist eine bessere Option
Wenn Sie möchten, dass ein Zeitstempel zwischen verschiedenen Prozessen, verschiedenen Sprachen (Java, C, C #) unter GNU / Linux und Windows (mindestens sieben) verglichen wird:
C #:
private static long nanoTime() {
long nano = 10000L * Stopwatch.GetTimestamp();
nano /= TimeSpan.TicksPerMillisecond;
nano *= 100L;
return nano;
}
Java:
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;
}
Ich weiß, dass die Frage nach einem Äquivalent fragt, aber da ich diese 2 für die gleichen Aufgaben verwende, die ich in GetTickCount ausführe . Ich mag nostalgisch sein, aber System.currentTimeMillis () und GetTickCount () sind die einzigen, die ich zum Abrufen von Zecken verwende.
[DllImport("kernel32.dll")]
static extern uint GetTickCount();
// call
uint ticks = GetTickCount();