2015-11-25 8 views
7

Oltre a un problema con il formato del passaggio.DateTime.TryParseExact Formato valido in C# e analisi

if (!DateTime.TryParseExact(dateString, "MM/dd/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out dateOn)) 
{ 
    return false; 
} 
else if (!DateTime.TryParseExact(timeString, "hh:mm tt", CultureInfo.InvariantCulture, DateTimeStyles.None, out timeOn)) 
{ 
    return false; 
} 

return SaveWorkshop(id, name, dateOn, timeOn, capacity, description, duration, isCancelled); 

Utilizzando Bootstrap DateTimePicker, lo fa prende uno stringhe textboxes in formato

dateString = 2015/11/28 e TimeString = 06:46

Ma nel risultato Ho false e sta analizzando la data di default. Quale potrebbe essere il problema?

risposta

9

Per il codice timeString, è necessario utilizzare h anziché l'identificatore hh.

hh specifier è necessario un leading zero per cifre singole come 06. È necessario utilizzare h specifier invece.

Ecco perché il tuo secondo DateTime.TryParseExact restituisce false e timeOn sarà il valore predefinito.

+0

"hh" non è per il tempo di 24 ore. Il link che hai fornito lo dice in realtà. È per il tempo di 12 ore zero-imbottito. "h" è per 12 ore non azzerate, "H" è per 24 ore non azzerate e "HH" per ore 24 ore senza riempimento. – jmcilhinney

+0

@jmcilhinney Sembra che tu sia la prima persona a notare il mio errore :) Grazie mille. Ho modificato –

2

Se non sbaglio, "hh" richiede un'ora a due cifre, che non hai. Usa "h" per valori non-zero-padded.

0

Inoltre, l'analisi del tempo restituisce la data di oggi a mezzanotte aggiunto TimeSpan dall'analisi timeString.

Così, per tagliare fuori la data odierna, fare qualcosa di simile:

// snip .. 
DateTime datetimeOn = dateOn.Add(timeOn.TimeOfDay); 
return SaveWorkshop(id, name, datetimeOn, capacity, description, duration, isCancelled); 

o, naturalmente, modificare SaveWorkshop per creare datetimeOn internamente.

Modifica

Inoltre, è in grado di analizzare in un colpo solo:

DateTime datetimeOn; 
DateTime.TryParseExact(dateString + timeString, "MM/dd/yyyyh:mm tt", System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out datetimeOn); 
+0

Prima mi stavo usando in questo modo, ma sulla griglia voglio separare le colonne di data e ora. – Antoshjke

+0

OK, ma non potresti semplicemente concatenarli prima di analizzare? Vedi modifica. – Gustav

+0

Ho giocato con esso. Funziona. Grazie! – Antoshjke