2011-01-11 8 views
14

Kiedy użytkownik wypełnia formularz, używa listy rozwijanej, aby określić, o której godzinie chciałby zaplanować test. To menu zawiera wszystkie pory dnia w 15-minutowych przyrostach w 12-godzinnym formularzu AM/PM. Na przykład, jeśli użytkownik wybierze 16:15, serwer wyśle ​​ciąg "4:15 PM" do serwera WWW z przesłaniem formularza.Jak przekonwertować ciąg 12 godzin na C# TimeSpan?

muszę trochę jak przekształcić ten ciąg do zakresu czasu, więc mogę przechowywać go w polu czasu mojej bazy danych użytkownika (z LINQ to SQL).

Ktoś wie o dobrym sposobem przekonwertować/PM czasu ciąg AM w przedziale czasu?

Odpowiedz

38

Prawdopodobnie chcesz użyć DateTime zamiast TimeSpan. Możesz użyć DateTime.ParseExact, aby przeanalizować ciąg znaków w obiekcie DateTime.

string s = "4:15 PM"; 
DateTime t = DateTime.ParseExact(s, "h:mm tt", CultureInfo.InvariantCulture); 
//if you really need a TimeSpan this will get the time elapsed since midnight: 
TimeSpan ts = t.TimeOfDay; 
+7

Ten przykład nie będzie działał na łańcuch, na przykład "11:00 PM". Wielkie litery "H" oznaczają zegar 24-godzinny. Używanie małej litery "h" rozwiązuje ten problem. –

+1

To naprawdę ważny szczegół. Potwierdzono i edytowano. –

+1

Działa to, gdy czas jest w formacie "h: mm tt", tj. 16:15, ale nie działa, gdy czas jest w formacie "hh: mm tt", tj. 12,45 PM. Czy istnieje format, który działa dla obu? – gurrawar

1

Spróbuj:

string fromServer = <GETFROMSERVER>(); 
var time = DateTime.Parse(fromServer); 

Że dostaje czas, jeśli tworzysz czas zakończenia, a także można uzyskać Timespans wykonując arytmetyki w/obiektów DateTime.

3

Spróbuj tego:

DateTime time; 
if(DateTime.TryParse("4:15PM", out time)) { 
    // time.TimeOfDay will get the time 
} else { 
    // invalid time 
} 
7

Najłatwiej jest tak:

var time = "4:15 PM".ToTimeSpan(); 

.

Dzieje kod Phila i umieszcza go w metodzie pomocnika. To banalne, ale to sprawia, że ​​połączenie w jednej linijce:

public static class TimeSpanHelper 
{   
    public static TimeSpan ToTimeSpan(this string timeString) 
    { 
     var dt = DateTime.ParseExact(timeString, "h:mm tt", System.Globalization.CultureInfo.InvariantCulture);    
     return dt.TimeOfDay; 
    } 
} 
+0

ciąg format powinien być „h: mm TT” lub, jeśli nie ma miejsca pomiędzy „AM/PM”, następnie „H: mmtt”. –

+0

@DanRandolph dzięki za sugestię, poddałem edycji rozwiązanie zgodnie z opisem. – Lee

2

Lubię odpowiedź Lee jest najlepszy, ale acermate byłoby poprawne, jeśli chcesz używać tryparse. Aby połączyć to i uzyskać czas, wykonaj następujące czynności:

public TimeSpan GetTimeFromString(string timeString) 
    { 
     DateTime dateWithTime = DateTime.MinValue; 
     DateTime.TryParse(timeString, out dateWithTime); 
     return dateWithTime.TimeOfDay; 
    }