Angeben von datetime-timezone ohne änderung Wert
Frage ich mich, wie man über das ändern der Zeitzone für ein DateTime-Objekt, ohne tatsächlich den Wert ändern. Hier ist der hintergrund...
Habe ich eine ASP.NET MVC-Website gehostet auf AppHarbor und der server hat seine Zeit auf UTC eingestellt ist. Wenn ich ein Formular Absenden von meiner Seite aus mit einem datetime-Wert, sagen 9/17/2013 4:00 Uhr, kommt es auf den server mit diesem Wert. Aber dann, wenn ich tun:
public ActionResult Save(Entity entity)
{
entity.Date = entity.Date.ToUniversalTime();
EntityService.Save(entity);
}
...es falsch hält Sie es, wie die gleiche Zeit (4 Uhr morgens), da der server bereits auf UTC-Zeit. So nach der Umstellung auf UTC und speichern der Datenbank, den Datenbank-Wert ist 2013-09-17 04:00:00.000, wenn es wirklich sein sollte, 2013-09-17 08:00:00.000, wie der browser auf EST. Ich hatte gehofft, dass nach dem senden des Formulars und die übergabe der Werte an die controller-Aktion, es würde den DateTime-timezone des Browsers (EST), sondern das server-host (UTC), aber das ist nicht geschehen.
In jedem Fall, jetzt bin ich stecken mit einem DateTime-Objekt, das enthält die korrekte Datum/Zeit-Wert, aber zur falschen Zeit-zone, so kann ich nicht richtig konvertieren auf UTC. Ich Speichere die Zeitzone von jedem Benutzer, so dass, wenn es eine Möglichkeit zum festlegen der Zeitzone für das DateTime-Objekt, ohne tatsächlich den Wert ändern (ich kann das nicht TimeZoneInfo.ConvertTime, weil Sie ' ll ändern Sie den Wert), dann hätte ich das richtige Datum/Uhrzeit-Wert UND die richtige Zeit-zone, dann könnte ich sicher tun date.ToUniversalTime. , Die being said, ich habe nur gesehen, wie ändern Sie die ART von DateTime, nicht von der Zeitzone, ohne Ihren tatsächlichen Wert.
Irgendwelche Ideen?
- Überprüfen Sie heraus diese Antwort: stackoverflow.com/questions/6682290/...
- Sie können versuchen, zu konvertieren client Datum Wert wie Date('yourdatehere').toISOString()
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eigentlich ist es genau das tun, was Sie gebeten, es zu tun. Aus der Sicht der server, die Sie übergeben es ein "unbekannter"
DateTime
. In anderen Worten, nur Jahr, Monat, Tag, etc., withoutout alle Kontext. Wenn man sich die.Kind
- Eigenschaft, Sie werden sehen, dass es in der TatDateTimeKind.Unspecified
.Beim Aufruf
.ToUniversalTime()
auf eine unbestimmte ArtDateTime
, .NET davon aus, dass der Kontext der lokalen Zeitzone des Computers, dass der code ausgeführt wird. Lesen Sie mehr über dieses in der Dokumentation hier. Seit Ihrem server auf UTC eingestellt ist dann unabhängig von der Eingangs-Art alle drei Arten, erzielen Sie dasselbe Ergebnis. Im Grunde ist es ein no-op.Nun, Sie sagten, Sie wollten die Zeit, um zu reflektieren, die Benutzers Zeitzone. Leider ist die information, dass der server nicht haben. Es gibt keine Magie, HTTP-header, führt Zeitzone details.
Gibt es Möglichkeiten, um diesen Effekt zu erreichen, aber, und haben Sie einige Optionen.
JavaScript-Methode
Dies ist wahrscheinlich die einfachste option, aber es erfordert JavaScript.
Date
Klasse.moment
statt, von der moment.js Bibliothek.Date
odermoment
, und übergeben Sie es auf Ihren server.2013-09-17T08:00:00.000Z
Z
am Ende. Das besagt, dass das die Zeit ist in UTC.Date
oder einemoment
mit JavaScript, und dann Strahlen Sie das lokale Datum und die lokale Zeit..NETTO-Methode mithilfe der Windows-Zeitzonen
Wenn Sie nicht gehen, um JavaScript aufrufen, dann werden Sie brauchen, um den Benutzer zu Fragen, für Ihre Zeitzone. Das kann gut funktionieren, in einer größeren Anwendung, wie auf der Benutzer-Profil-Seite.
TimeZoneInfo.GetSystemTimeZones
bauen eine drop-down-Liste.TimeZoneInfo
Element in der Liste, verwenden Sie die.Id
für den Wert und die.DisplayName
für den text.Dann können Sie diesen Wert verwenden, wenn Sie möchten, konvertieren Sie die Zeit.
Diese arbeiten mit der Windows-Zeit-Zonen, die ein Microsoft-Schöpfung, und haben einige Nachteile. Lesen Sie über einige Ihrer Mängel in die Zeitzone tag wiki.
.NET-Methode mit IANA Zeitzonen
Wenn Sie möchten, verwenden Sie den standard IANA Zeitzonen, wie
America/New_York
oderEurope/London
, dann können Sie eine Bibliothek wie Noda Zeit. Es bietet eine viel bessere API für die Arbeit mit Datum und Uhrzeit, als der built-in-framework. Es ist ein bisschen eine Lernkurve, aber wenn Sie etwas kompliziert ist, lohnt sich die Mühe. Als Beispiel:Über Die Sommerzeit
Unabhängig davon, welche dieser drei Ansätze, die Sie nehmen, Sie wird zu tun haben mit den Problemen erstellt von Daylight Saving Time. Jedes dieser Beispiele zeigt eine "milde" - Ansatz, wo wenn die lokale Zeit, die Sie angeben, ist missverständlich oder ungültig, dass einige Regel befolgt, so erhalten Sie noch einige gültige moment in der Zeit. Sie können sehen, dass dies direkt mit der Noda-Zeit-Ansatz, wenn ich rief
AtLeniently
. Aber es tritt mit dem anderen auch - es ist nur implizit. In JavaScript, die Regeln können variieren per browser, also erwarten Sie nicht zu konsistenten Ergebnissen.Je nachdem, welche Art von Daten, die Sie sammeln, können Sie sich entscheiden, es ist durchaus akzeptabel, um diese Art der Annahme. Aber in vielen Fällen ist es nicht angemessen, davon auszugehen. In diesem Fall können Sie entweder Benachrichtigen Sie Ihren Benutzer, dass die input-Zeit ist ungültig, oder Sie bitten, die zwei mal zweideutig gemeint ist.
In .Net, können Sie prüfen, ob diese mit
TimeZoneInfo.IsInvalidTime
undTimeZoneInfo.IsAmbiguousTime
.Ein Beispiel dafür, wie die Sommerzeit funktioniert, siehe hier. In der "spring-forward" - übergang, eine Zeit, während der übergang ist ungültig. In der "fall-back" - übergang, eine Zeit, während der übergang ist mehrdeutig - das heißt, es könnte passiert sein, entweder vor oder nach dem übergang.