Tjena! Du kan titta på denna vilket jag tror är det närmaste du vill ha. Använd DateTime.TryParseExact. Tack för svaret Hans!Datumvalidering på servern
Har en webbapplikation där jag behöver validera datum som slås in av användaren via en textbox. Användarna kan ha olika Culture. Jag gör alla valideringar på servern.
Idag validerar jag genom att göra en try catch runt Convert.ToDateTime(txtBox).
Problemet med detta är att den tvingar användaren att skriva in datum med separatorer mellan år och månad samt mellan månad och dag (T.ex 2008-12-01 eller 08-12-01 för en svenk). Jag skulle vilja att användaren kan skriva datumen i formatet 081201, 08-12-01, 20081201 eller 2008-12-01.
Någon som löst detta på ett bra sätt?Sv: Datumvalidering på servern
http://www.codeguru.com/csharp/.net/net_general/netframeworkclasses/article.php/c7547/Sv: Datumvalidering på servern
Då kan du skicka med en array som beskriver vilka format som stöds.
Ungefär så här för svensk culture.
string [] formats = new string [] {
"yy-MM-dd",
"yyyy-MM-dd",
"yyMMdd",
"yyyyMMdd"
};
DateTime d;
valid = DateTime.TryParseExact(str, formats, out d);
(skall vara några fler paramtrar men de kan du hitta i hjälpen)Sv:Datumvalidering på servern
Får fel på denna ....
<code>
valid = DateTime.TryParseExact(str, formats, out d);
</code>
"out d" ?Sv:Datumvalidering på servern
Du fick mig in på rätt spår.
Skrev om den kod som du föreslog enligt nedan.
IsDate kontrollerar om en sträng är ett gilltigt datum. Först kör jag Convert.ToDateTime(s). Den går fint om man skrivit datumet i formatet med separatorer, t.ex yyyy-MM-dd eller yy-MM-dd.
Om strängen inte klarar detta test så testar jag om man skrivit i formatet yyyyMMdd eller yyMMdd, dvs. utan separatorer. Det görs med hjälp av DateTime.ParseExact och olika date patterns. Jag tar trådens culture´s DateTimeFormatInfo object o tar bort separatorerna från ShortDatePattern o försöker matcha med ParseExact.
Min kod ser ut så här nu:
Protected Function IsDate(ByVal s As String) As Boolean
Try
Convert.ToDateTime(s)
Return True
Catch
End Try
Try
ControlDateWithCulturePattern(s)
Return True
Catch
Return False
End Try
End Function
Private Function ControlDateWithCulturePattern(ByVal datum As String) As Date
Dim dtfi As System.Globalization.DateTimeFormatInfo
Dim currentDTFI As System.Globalization.DateTimeFormatInfo
Dim dt As DateTime
currentDTFI = System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat
If datum.Length = 8 Then
' yyyyMMdd-format
dtfi = New System.Globalization.DateTimeFormatInfo()
dtfi.ShortDatePattern = currentDTFI.ShortDatePattern.Replace(currentDTFI.DateSeparator, "")
dt = DateTime.ParseExact(datum, "d", dtfi)
ElseIf datum.Length = 6 Then
' yyMMdd-format
dtfi = New System.Globalization.DateTimeFormatInfo()
dtfi.ShortDatePattern = currentDTFI.ShortDatePattern.Replace(currentDTFI.DateSeparator, "").Replace("yyyy", "yy") '
dt = DateTime.ParseExact(datum, "d", dtfi)
End If
Return dt
End Function