Frage

Ich habe mich gefragt, was genau sind die Prinzipien, die die beiden Eigenschaften der Arbeit.Ich weiß, die zweite ist die Universale und im Grunde ist es nicht der Umgang mit Zeit Zonen, aber kann jemand im detail erklären, wie Sie arbeiten und was sollte verwendet werden, in welchem Szenario?

War es hilfreich?

Lösung

DateTime.UtcNow sagt Ihnen das Datum und die Zeit als wäre es in der Koordinierten Weltzeit, die auch als die Greenwich Mean Time Zeitzone - im Grunde wie wäre es, wenn Sie wurden in London, England, aber nicht im Sommer. DateTime.Jetzt gibt das Datum und die Zeit, wie es scheint jemand in Ihrem aktuellen Gebietsschema.

Ich würde empfehlen, mit DateTime.Now wenn Sie die Anzeige von einem Datum zu einem Menschen - der Art, wie Sie sind komfortabel mit dem Wert, den Sie sehen - es ist etwas, dass Sie leicht vergleichen zu was Sie sehen auf Ihre Uhr.Verwenden DateTime.UtcNow wenn Sie wollen zu speichern-Daten oder verwenden Sie Sie für spätere Berechnungen, die Art und Weise (in einem client-server-Modell) Ihre Berechnungen nicht verwechselt werden, von Kunden in verschiedenen Zeitzonen auf Ihrem server oder von jedem anderen.

Andere Tipps

Es ist wirklich einfach, also ich denke, es hängt davon ab, was Ihre Zielgruppe ist und wo Sie Leben.

Wenn Sie nicht die Utc-Zeit, die Sie muss kennen Sie die Zeitzone der person, die Sie anzeigen Termine -- sonst werden Sie Ihnen sagen, etwas, das passiert um 3 Uhr in der system-oder server-Zeit, wenn es wirklich passiert ist, um 5 Uhr, wo Sie gerade Leben.

Wir verwenden DateTime.UtcNow da wir eine Globale web-Publikum, und da würde ich es vorziehen, nicht zu nörgeln, jeder Benutzer ein Formular ausfüllen, die anzeigt, welche Zeitzone Sie Leben.

Wir zeigen auch relative Zeitangaben (vor 2 Stunden, 1 Tag, etc), bis die post Alter genug, dass die Zeit ist "das gleiche" egal wo auf der Welt Sie Leben.

Beachten Sie auch den Unterschied in der Leistung;DateTime.UtcNow ist irgendwo rund 30-mal schneller als DateTime.Jetzt, da intern DateTime.Jetzt ist dabei eine Menge Zeit zone Einstellungen (Sie können leicht überprüfen, dies mit Reflektor).

So verwenden Sie nicht DateTime.Jetzt für relative Messungen der Zeit.

One main concept zu verstehen .NET ist, dass jetzt ist jetzt alle über der Erde, egal, in welcher Zeitzone Sie sich befinden.Also, wenn Sie laden Sie eine variable mit DateTime.Now oder DateTime.UtcNow -- die Zuordnung ist identisch.* Ihre DateTime Objekt weiß, welche Zeitzone Sie sind, und berücksichtigt, unabhängig von der Zuordnung.

Die Nützlichkeit der DateTime.UtcNow die in handliches kommt bei der Berechnung der Termine über die Sommerzeit hinweg.Das heißt, an Orten, die an die Sommerzeit, manchmal sind es 25 Stunden, von Mittag bis Mittag des folgenden Tages, und manchmal gibt es 23 Stunden zwischen Mittag und Mittag des folgenden Tages.Wenn Sie wollen, richtig zu bestimmen die Anzahl der Stunden, die von Zeit A Zeit und B, müssen Sie zuerst übersetzen jeder UTC-äquivalente bevor die Berechnung der TimeSpan.

Dieser ist abgedeckt durch ein blog-post schrieb ich das erklärt weiter, TimeSpan, und enthält eine Verknüpfung, um eine noch umfangreichere MS-Artikel zum Thema.

*Aufklärung:Entweder Zuordnung speichern wird die aktuelle Uhrzeit.Wenn Sie zum laden von zwei Variablen über DateTime.Now() und der andere über DateTime.UtcNow() die TimeSpan Unterschied zwischen den beiden wäre Millisekunden, nicht Stunden angenommen, Sie sind in einer Zeitzone, Stunden entfernt von GMT.Wie unten angegeben, drucken Sie Ihre String Werte anzeigen würde unterschiedliche Zeichenfolgen.

Das ist eine gute Frage.Ich bin belebt Sie zu geben Sie ein wenig genauer, wie .Net verhält sich mit verschiedenen Kind Werte.Wie @Jan Zich Punkte heraus, Es ist eigentlich eine kritisch wichtige Eigenschaft und ist unterschiedlich je nachdem, ob Sie Sie verwenden Now oder UtcNow.

Intern wird das Datum gespeichert ist, als Ticks die (im Gegensatz zu @Carl Kamera Antwort) unterscheidet sich je nachdem, ob Sie verwenden Now oder UtcNow.

DateTime.UtcNow verhält sich wie bei anderen Sprachen.Es setzt Ticks um eine GMT-basierten Wert.Es setzt auch Kind zu Utc.

DateTime.Now ändert die Ticks Wert was wäre es, wenn es war Ihre Zeit des Tages in der GMT-Zeitzone.Es setzt auch Kind zu Local.

Wenn Sie 6 Stunden hinter (GMT-6), erhalten Sie die GMT-Zeit von 6 Stunden..Netto tatsächlich ignoriert Kind und behandelt diese Zeit als wenn es war 6 Stunden, obwohl es sein sollte "jetzt".Diese Pausen noch mehr, wenn Sie eine DateTime Beispiel ändern Sie dann Ihre Zeitzone aus, und versuchen Sie, es zu benutzen.

DateTime-Instanzen mit verschiedenen " Art " - Werte sind NICHT kompatibel.

Schauen wir uns einige code...

    DateTime utc = DateTime.UtcNow;
    DateTime now = DateTime.Now;
    Debug.Log (utc + " " + utc.Kind);  // 05/20/2015 17:19:27 Utc
    Debug.Log (now + " " + now.Kind);  // 05/20/2015 10:19:27 Local

    Debug.Log (utc.Ticks);  // 635677391678617830
    Debug.Log (now.Ticks);  // 635677139678617840

    now = now.AddHours(1);
    TimeSpan diff = utc - now;
    Debug.Log (diff);  // 05:59:59.9999990

    Debug.Log (utc <  now);  // false
    Debug.Log (utc == now);  // false
    Debug.Log (utc >  now);  // true

    Debug.Log (utc.ToUniversalTime() <  now.ToUniversalTime());  // true
    Debug.Log (utc.ToUniversalTime() == now.ToUniversalTime());  // false
    Debug.Log (utc.ToUniversalTime() >  now.ToUniversalTime());  // false
    Debug.Log (utc.ToUniversalTime() -  now.ToUniversalTime());  // -01:00:00.0000010

Wie Sie hier sehen können, Vergleiche und mathematische Funktionen nicht automatisch konvertieren zu kompatibel Zeiten.Die Timespan hätte fast eine Stunde, aber stattdessen war fast 6.utc < nun" sollte wahr gewesen sein, (habe ich sogar noch eine Stunde, um sicher zu sein), war aber immer noch falsch.

Sie können auch sehen, die "umgehen", die ist einfach zu konvertieren universal time überall dort, wo Kind ist nicht das gleiche.

Meine direkte Antwort auf die Frage stimmt mit der akzeptierten Antwort Empfehlung über die Verwendung.Sie sollten immer versuchen Sie es arbeiten mit DateTime Objekte Kind=Utc, mit Ausnahme während der i/o (Anzeige und Analyse).Das heißt, Sie sollten fast immer mit DateTime.UtcNow, außer für die Fälle, in denen Sie das Objekt erstellt haben, nur um es anzuzeigen, und entsorgen Sie es sofort.

DateTime hat keine Ahnung, was Zeitzonen sind.Es geht immer sind Sie in Ihrer lokalen Zeit. UtcNow nur bedeutet "Abziehen, meine Zeitzone aus der Zeit".

Wenn Sie verwenden möchten timezone-aware-Termine, verwenden Sie DateTimeOffset, repräsentiert ein Datum und Uhrzeit mit Zeitzone.Ich musste lernen, dass die hard way.

Nur ein wenig neben der obigen Punkte:der DateTime-Struktur enthält auch eine wenig bekannte Gebiet genannt Art (zumindest ich nicht wissen, über es für eine lange Zeit).Es ist im Grunde nur ein flag, der angibt, ob die Zeit, die lokal oder UTC;es tut nicht geben Sie die real-offset von UTC zur lokalen Zeiten.Neben der Tatsache, dass es zeigt, mit welchen Absichten die stuct gebaut wurde, es beeinflusst auch die Art und Weise, wie die Methoden ToUniversalTime() und ToLocalTime() Arbeit.

Die "einfache" Antwort auf die Frage ist:

DateTime.Jetzt gibt eine DateTime Wert für die aktuelle system-Zeit (in welcher Zeitzone das system ausgeführt wird).Die DateTime.Art Eigenschaft DateTimeKind.Lokale

DateTime.UtcNow gibt eine DateTime Wert für das aktuelle Universal Co-ordinated Time (aka UTC), wird die gleiche, unabhängig von der Zeitzone des Systems.Die DateTime.Art Eigenschaft DateTimeKind.Utc

DateTime.UtcNow ist eine kontinuierliche, single-valued time scale, wohingegen DateTime.Jetzt ist nicht kontinuierliche oder diskrete Werte auf.Der primäre Grund ist die Sommerzeit, die nicht für UTC.So nie UTC springt vorwärts oder zurück, eine Stunde, in der Erwägung, dass die lokale Uhrzeit(DateTime.Jetzt) ist.Und wenn es springt rückwärts, die gleichzeitig Wert zweimal vorkommt.

DateTime.UtcNow ist eine Universelle Zeitskala weglassen Sommerzeit.So nie UTC änderungen aufgrund DST.

Aber, DateTime.Jetzt ist nicht kontinuierliche oder einwertige, weil Sie Veränderungen nach DST.Was bedeutet DateTime.Nun, die gleichzeitig Wert kann auftreten, zweimal verlassen Kunden in einem verwirrten Zustand.

Wenn Sie müssen lokale Zeit der Maschine Ihre Anwendung läuft (wie MESZ für Europa), der Nun nutzen.Wenn Sie möchten, ein universal time - UtcNow.Es ist nur eine Frage Ihrer Vorlieben - wahrscheinlich um eine lokale website / standalone-Anwendung, die Sie benutzen wollen würde die Zeit Nutzer hat - so beeinflusst, indem Sie seine/Ihre Zeitzone einstellen - DateTime -.Jetzt.

Denken Sie nur daran, für eine website es ist der Zeitzoneneinstellung des Servers.Also, wenn Sie die Anzeige der Zeit für den Benutzer, entweder seine bevorzugte Zeitzone und Verschiebung der Zeit (nur speichern Utc-Zeit in der Datenbank dann, und ändern Sie ihn), oder geben Sie es UTC.Wenn Sie vergessen, dies zu tun, der Benutzer sehen kann, so etwas wie: posted 3 Nachteile vor und dann eine Zeit in der Zukunft, in die Nähe :)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top