Java System.currentTimeMillis () entspricht C #


85

Was entspricht Java System.currentTimeMillis()in C #?


Nur neugierig, warum brauchst du die Millis seit 1970?
Alex B

5
DateTimeOffset.UtcNow.ToUnixTimeMilliseconds ()
Ramunas

Antworten:


89

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;
}

2
Gleiches Ergebnis mit "DateTimeOffset.UtcNow.ToUnixTimeMilliseconds ()"
Ramunas

73

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.


1
Aber beide geben Differenzzahlen an. Wie vergleichen sie richtig? C# give : 2688547undJava give : 1390707872687
Elshan

1
@ Elshan Sie können sie nicht vergleichen. Das sind verschiedene Zecken. Diese Technik dient zum Timing und zur Planung innerhalb einer Anwendung, nicht anwendungsübergreifend.
Barend

System.currentTimeMillis()Gibt die UTC-Zeit in ms seit 1970 zurück, während Environment.TickCountms 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().
Michelpm

12

Wenn Sie an TIMING interessiert sind, fügen Sie einen Verweis auf System.Diagnostics hinzu und verwenden Sie eine Stoppuhr.

Beispielsweise:

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

8
DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()

Diese DateTimeOffsetMethode wurde ab .Net 4.6 eingeführt.
Suncat2000

7

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 :)


4
DateTime.Now verwendet die Ortszeit, nicht UTC. Ich weiß nicht genau, was passiert, wenn Sie eine unbekannte Art von DateTime von einer lokalen subtrahieren, aber es ist am besten, beide auf UTC zu setzen :)
Jon Skeet

7

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);
    }
}

3
Ist das nicht ein bisschen falsch? Diese Erweiterungsmethode wird an jede Instanz von DateTime weitergegeben, verwendet jedoch nicht die Instanz.
Scheint

1
@mortb Das ist eine Erweiterungsmethode. Auf diese Weise wird in C # definiert, einer Klasse "eine Methode hinzuzufügen", ohne die Klasse zu ändern. Der Compiler interpretiert die Methode und kann sie auf eine Instanz des Parameters "this" anwenden, als wäre es eine Instanzmethode für die Klasse selbst. Es funktioniert genauso wie eine Methode für die statische Klasse, aber der Compiler ermöglicht das Schreiben einer einfacheren, alternativen Syntax.
Suncat2000

1
Das Problem ist, dass der Wert des Parameters dnicht verwendet wird. Um diesen Code zu verwenden, könnten Sie schreiben. var date = new DateTime(); var millis = date.currentTimeMillis();Die dateVariable 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 danstelle des DateTime.UtcNowMethodenkörpers verwenden? Ich benutze ziemlich oft Erweiterungsmethoden, aber nicht dafür.
Mortb

Warum sollten Sie eine Erweiterung erstellen, die das Datum nicht verwendet? Ich habe diesen Code verwendet und er hat mich erwischt. Die richtige Version lautet: return (long) ((d.ToUniversalTime () - Jan1st1970) .TotalMilliseconds);
Mark G

4

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 doublezu 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

genau das, was ich brauchte.
Ajibola

3

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.


1
Würde (DateTime.Ticks / 10000000) - (die Anzahl der Sekunden zwischen 0001 und 1970) eine genaue Antwort geben?
Liam

3

Ich betrachte nur den einfachsten Weg, um das zu erreichen, was Sie angestrebt haben:

DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond

1
DateTime.UtcNowist eine bessere Option
Mehdi Khademloo

2

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;
}

1

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();
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.