2011-01-11 5 views
14

Wenn ein Benutzer ein Formular ausfüllt, verwendet er ein Dropdown-Feld, um anzugeben, für welche Uhrzeit der Test geplant werden soll. Diese Dropdown-Liste enthält alle Zeiten des Tages in 15-Minuten-Schritten in der 12-Stunden-AM/PM-Form. Wenn der Benutzer beispielsweise 16:15 Uhr auswählt, sendet der Server die Zeichenfolge "4:15 PM" mit der Formularübermittlung an den Webserver.Wie konvertiere ich eine 12 Stunden Zeit Zeichenfolge in eine C# TimeSpan?

Ich brauche einige, wie diese Zeichenfolge in eine Zeitspanne konvertieren, so dass ich es im Zeitfeld meiner Datenbank (mit LINQ zu SQL) speichern kann.

Wer kennt eine gute Möglichkeit, eine AM/PM-Zeitzeichenfolge in eine Zeitspanne zu konvertieren?

Antwort

38

Sie möchten wahrscheinlich einen DateTime anstelle von TimeSpan verwenden. Sie können DateTime.ParseExact verwenden, um die Zeichenfolge in ein DateTime-Objekt zu analysieren.

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

Dieses Beispiel funktioniert nicht für Strings wie "11:00 PM". Das Großbuchstabe "H" zeigt eine 24-Stunden-Uhr an. Die Verwendung eines Kleinbuchstabens "h" behebt dieses Problem. –

+1

Das ist ein wirklich wichtiges Detail. Bestätigt und bearbeitet –

+1

Dies funktioniert, wenn die Zeit im "h: mm tt" -Format ist, d.h. 4,15 PM, aber nicht funktioniert, wenn die Zeit im "hh: mm tt" -Format ist, d. H. 12.45 PM. Gibt es ein Format, das für beide funktioniert? – gurrawar

1

Versuchen:

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

dass Sie die Zeit bekommt, wenn Sie die Endzeit auch schaffen können Sie Zeitspannen erhalten, indem Arithmetik zu tun w/Datetime-Objekte.

3

Versuchen Sie folgendes:

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

Der einfachste Weg ist wie folgt:

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

.

Das dauert Phils Code und steckt es in eine Hilfsmethode. Es ist trivial, aber es macht es einen einzeiligen Aufruf:

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

zu unterstützen Die Formatzeichenfolge sollte "h: mm tt" sein oder wenn kein Leerzeichen zwischen "AM/PM" dann "h: mmtt". –

+0

@DanRandolph danke für den Vorschlag, ich habe die Lösung wie erwähnt bearbeitet. – Lee

2

I Lee Antwort mag die beste, aber acermate wäre richtig, wenn Sie verwenden TryParse wollen. Um das zu kombinieren und die Zeitspanne zu erhalten, gehen Sie wie folgt vor:

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