2010-09-18 15 views
5

uruchomiony program ASP.NET MVC 2 na Win 7 z .net 4.0TimeZoneInfo.ConvertTime nie konwertuje coś

Mam metody działania kontrolera, która odbiera 2 obiekty DateTime z formularza. Interfejs użytkownika w formularzu korzysta z datepika jQueryUi (nie wiem, czy to dotyczy).

Użytkownik, który wypełni ten formularz, ZAWSZE wprowadza datę/czas w hawajskiej strefie czasowej.

Chcę przekonwertować to na czas UTC i zapisać go w bazie danych.

Kiedy dzwonię do TimeZoneInfo.ConverTime (DateTime, TimeZoneInfo, TimeZoneInfo), zwraca dokładnie tę samą datę i godzinę, co do niej przekazywano, nie wykonując żadnej konwersji. Sprawdziłem debuggera i jedyną rzeczą, która się zmieniła, była zmiana właściwości DateTime.Kind na DateTimeKind.Utc.

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

Wypróbowałem również wersję alternatywną z tymi samymi wynikami.

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 to prosta klasa ViewModel z dwoma datami Właściwości o nazwie StartDate i EndDate.

Chcę podkreślić, nie obchodzi mnie, gdzie znajduje się serwer, nie obchodzi mnie, gdzie znajduje się użytkownik. Użytkownik zawsze wprowadza czas w hawajskiej strefie czasowej, a serwer powinien zawsze konwertować tę datę na UTC.

Zasadniczo chcę, aby dodać 10 godzin do czasu, kiedy użytkownik wchodzi (hawajski do utc) i mógłbym to osiągnąć przez zwykłe wywołanie .AddHours (10) i byłoby dobrze. Ale później w drodze będę potrzebować tej aplikacji, aby być bardziej elastycznym.

+0

Czy rozwiązałeś problem? – Rory

+0

Jaki był rodzaj danych.StartDate? – Rory

Odpowiedz

4

Jeśli chcesz bardziej elastyczne podejście, spróbuj coś takiego:

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

To powinno działać poprawnie bez względu na strefę czasową, której używasz. Przy okazji: gdybym był tobą, tworzyłbym daty rozpoczęcia i zakończenia jako DateTimeKind.Utc (i przechowywał wszystkie dane z harmonogramu także jako UTC). Nie jestem pewien, jak GetUtcOffset() będzie współpracować z nieokreślonego rodzaju czasu ...

Aktualizacja GetUtcOffset()

Wydaje się, że GetUtcOffset() działa dokładnie tak samo dla DateTimes utworzonych z różnymi wartościami DateTimeKind. Jednak nie przetestowałem go z nieprawidłowymi danymi wejściowymi (tzn. Z datami, które nie istnieją z powodu przełączania czasu letniego). Wierzę, że DateTimeKind.Utc jest dość oszczędny tutaj, ale może dla Local lub Unspecified.

3

Nie mogę znaleźć żadnych problemów z tobą kodu ... Wygląda na to, że powinien działać. Czy próbowałeś zastępcy z:

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

wypróbować ten kod

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

To działało ode mnie, może być możesz spróbować.

0

Wygląda na to, że w kodzie nic nie robisz z wynikiem konwersji.

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

W start i end wartości są ustawione, ale nigdy nie są zwracane. W rzeczywistości żadna wartość nie jest tutaj zwracana, więc nie powinno się tego kompilować. Być może jest coś więcej, czego nie pokazałeś.

W każdym razie sama konwersja jest w porządku. Dopóki data.StartDate i data.EndDate mają rodzaj Unspecified, to powinno działać zgodnie z oczekiwaniami. Możesz zrobić to nieco czystsze, używając zamiast tego TimeZoneInfo.ConvertTimeToUtc.

Powiązane problemy