2010-09-18 11 views
5

Laufen asp.net Mvc 2 auf win 7 mit .net 4.0TimeZoneInfo.ConvertTime konvertiert nicht alles

ich eine Controller-Aktion Methode, die zwei Datetime-Objekte aus einer Form erhält. Die Benutzeroberfläche im Formular verwendet den jQueryUi-Datapicker (nicht sicher, ob dies der Fall ist).

Der Benutzer, der dieses Formular ausfüllt, wird IMMER das Datum/die Uhrzeit in der hawaiianischen Zeitzone eingeben.

Ich möchte das in UTC Zeit konvertieren und in einer Datenbank speichern.

Wenn ich TimeZoneInfo.ConverTime (DateTime, TimeZoneInfo, TimeZoneInfo) aufrufe, gibt es exakt das gleiche Datum zurück, an dem ich es eingegeben habe, ohne eine Konvertierung durchzuführen. Ich überprüfte den Debugger und das einzige, was sich änderte, war, dass die Eigenschaft DateTime.Kind in DateTimeKind.Utc geändert wurde.

public ActionResult New(ScheduleNew data){   
    TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById("Hawaiian Standard Time"); 

    DateTime start = TimeZoneInfo.ConvertTime(data.StartDate, tz, TimeZoneInfo.Utc); 
    DateTime end = TimeZoneInfo.ConvertTime(data.EndDate, tz, TimeZoneInfo.Utc); 
} 

Ich habe eine alternative Version mit den gleichen Ergebnissen versucht.

public ActionResult New(ScheduleNew data){ 
    DateTime start = new DateTime(data.StartDate.Year, data.StartDate.Month, data.StartDate.Day, data.StartDate.Hour, data.StartDate.Minute, data.StartDate.Second, DateTimeKind.Unspecified); 
    DateTime end = new DateTime(data.EndDate.Year, data.EndDate.Month, data.EndDate.Day, data.EndDate.Hour, data.EndDate.Minute, data.EndDate.Second, DateTimeKind.Unspecified); 

    TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById("Hawaiian Standard Time"); 

    StartDate = TimeZoneInfo.ConvertTime(start, tz, TimeZoneInfo.Utc); 
    EndDate = TimeZoneInfo.ConvertTime(end, tz, TimeZoneInfo.Utc), 
} 

ScheduleData ist nur eine einfache Ansichtsmodell-Klasse mit zwei Datum Zeit Eigenschaften genannt Startdate und EndDate.

Ich möchte betonen, ist mir egal, wo der Server befindet, ist mir egal, wo der Benutzer befindet. Der Benutzer gibt immer die Zeit in der hawaiianischen Zeitzone ein, und der Server sollte diese Datumzeit immer auf UTC umrechnen.

Grundsätzlich, was ich will, ist 10 Stunden zu der Zeit hinzufügen, die der Benutzer eintritt (Hawaiian zu Utc) und ich könnte erreichen, indem Sie einfach .AddHours (10) und es wäre in Ordnung. Aber später brauche ich diese App, um flexibler zu sein.

+0

haben Sie das Problem gelöst? – Rory

+0

Was war die Art von Daten.StartDate? – Rory

Antwort

4

Wenn Sie flexibleren Ansatz wollen, so etwas wie dies versuchen:

DateTime now = DateTime.UtcNow; 

TimeZoneInfo timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("Hawaiian Standard Time"); 
TimeSpan utcOffset = timeZoneInfo.GetUtcOffset(now); 
DateTime hawaiianTime = new DateTime(now.Ticks + utcOffset.Ticks, DateTimeKind.Local); 

Dies sollte korrekt nicht funktionieren unabhängig davon, welche Zeitzone Sie verwenden. Übrigens: Wenn ich Sie wäre, würde ich Anfangs- und Enddaten als DateTimeKind.Utc erstellen (und alle Zeitplandaten auch als UTC speichern). Ich bin nicht sicher, wie GetUtcOffset() wird mit unbestimmter Zeit Art arbeiten ...

-Update auf GetUtcOffset()

Es scheint, dass GetUtcOffset() funktioniert genau gleich für Datetime mit unterschiedlichen Werten erstellt Datetimekind. Ich habe es jedoch nicht mit ungültiger Eingabe getestet (d. H. Mit Daten, die aufgrund der Umstellung auf Sommerzeit nicht existieren). Ich glaube DateTimeKind.Utc ist hier ziemlich sicher, aber es könnte für Lokal oder Nicht spezifiziert sein.

3

Ich kann keine Probleme mit Ihnen Code finden ... Es sieht aus wie sollte arbeiten. Haben Sie versucht, die alternative von:

DateTime start = TimeZoneInfo.ConvertTimeToUtc(data.StartDat, tz); 
2

versuchen diesen Code

var dt = new DateTime(YourOldDate.Ticks, DateTimeKind.Utc); 
DateTime NewDate = TimeZoneInfo.ConvertTime(dt, TimeZoneInfo.Local); 

Das von mir arbeitete, kann man einen Versuch geben können.

0

Es scheint so zu sein, dass Sie im Code nichts mit dem Ergebnis der Konvertierung machen.

public ActionResult New(ScheduleNew data){   
    TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById("Hawaiian Standard Time"); 

    DateTime start = TimeZoneInfo.ConvertTime(data.StartDate, tz, TimeZoneInfo.Utc); 
    DateTime end = TimeZoneInfo.ConvertTime(data.EndDate, tz, TimeZoneInfo.Utc); 
} 

Die start und end Werte gesetzt sind, werden aber nie zurückgegeben. Eigentlich wird überhaupt kein Wert zurückgegeben, daher sollte dieser nicht kompiliert werden. Vielleicht gibt es mehr, was du nicht gezeigt hast.

Auf jeden Fall ist die Umwandlung selbst in Ordnung. Solange data.StartDate und data.EndDate haben Unspecified Art, dann sollte es wie erwartet funktionieren. Sie können es jedoch etwas sauberer machen, indem Sie stattdessen TimeZoneInfo.ConvertTimeToUtc verwenden.