在C#中validationdate时间
我怀疑我是唯一一个提出这个解决scheme的人,但如果你有更好的解决scheme,请在这里发布。 我只是想在这里留下这个问题,所以我和其他人可以稍后search。
我需要告诉一个有效的date是否已经input到一个文本框中,这是我提出的代码。 当焦点离开文本框时我开始播放。
try { DateTime.Parse(startDateTextBox.Text); } catch { startDateTextBox.Text = DateTime.Today.ToShortDateString(); }
DateTime.TryParse
这我相信是更快,这意味着你不必使用丑陋的尝试/捕获:)
例如
DateTime temp; if(DateTime.TryParse(startDateTextBox.Text, out temp)) //yay else // :(
不要使用exception进行stream量控制。 使用DateTime.TryParse和DateTime.TryParseExact 。 就个人而言,我更喜欢TryParseExact与特定的格式,但我想有些时候TryParse更好。 基于您的原始代码的示例使用:
DateTime value; if (!DateTime.TryParse(startDateTextBox.Text, out value)) { startDateTextox.Text = DateTime.Today.ToShortDateString(); }
喜欢这种方法的原因是:
- 更清晰的代码(它说明它想做什么)
- 比捕捉和吞咽exception更好的性能
- 这不会不恰当地捕获exception – 例如OutOfMemoryException,ThreadInterruptedException。 (您可以通过捕获相关的exception来修复您当前的代码以避免这种情况,但使用TryParse仍然会更好。)
这是解决scheme的另一个变体,如果string可以转换为DateTime
types,则返回true,否则返回false。
public static bool IsDateTime(string txtDate) { DateTime tempDate; return DateTime.TryParse(txtDate, out tempDate); }
我会使用DateTime.TryParse()方法: http : //msdn.microsoft.com/en-us/library/system.datetime.tryparse.aspx
怎么样使用TryParse ?
使用DateTime.TryParse
的问题是,它不支持非分隔符inputdate的非常常见的数据input用例,例如011508
。
这里有一个如何支持这个的例子。 (这是来自我正在构build的框架,所以它的签名有点奇怪,但核心逻辑应该是可用的):
private static readonly Regex ShortDate = new Regex(@"^\d{6}$"); private static readonly Regex LongDate = new Regex(@"^\d{8}$"); public object Parse(object value, out string message) { msg = null; string s = value.ToString().Trim(); if (s.Trim() == "") { return null; } else { if (ShortDate.Match(s).Success) { s = s.Substring(0, 2) + "/" + s.Substring(2, 2) + "/" + s.Substring(4, 2); } if (LongDate.Match(s).Success) { s = s.Substring(0, 2) + "/" + s.Substring(2, 2) + "/" + s.Substring(4, 4); } DateTime d = DateTime.MinValue; if (DateTime.TryParse(s, out d)) { return d; } else { message = String.Format("\"{0}\" is not a valid date.", s); return null; } } }
protected bool ValidateBirthday(String date) { DateTime Temp; if (DateTime.TryParse(date, out Temp) == true && Temp.Hour == 0 && Temp.Minute == 0 && Temp.Second == 0 && Temp.Millisecond == 0 && Temp > DateTime.MinValue) return true; else return false; }
//假设inputstring是短date格式。
例如“2013/7/5”返回true或
“2013/2/31”返回false。
http://forums.asp.net/t/1250332.aspx/1
//布尔booleanValue = ValidateBirthday(“12:55”); 返回false
private void btnEnter_Click(object sender, EventArgs e) { maskedTextBox1.Mask = "00/00/0000"; maskedTextBox1.ValidatingType = typeof(System.DateTime); //if (!IsValidDOB(maskedTextBox1.Text)) if (!ValidateBirthday(maskedTextBox1.Text)) MessageBox.Show(" Not Valid"); else MessageBox.Show("Valid"); } // check date format dd/mm/yyyy. but not if year < 1 or > 2013. public static bool IsValidDOB(string dob) { DateTime temp; if (DateTime.TryParse(dob, out temp)) return (true); else return (false); } // checks date format dd/mm/yyyy and year > 1900!. protected bool ValidateBirthday(String date) { DateTime Temp; if (DateTime.TryParse(date, out Temp) == true && Temp.Year > 1900 && // Temp.Hour == 0 && Temp.Minute == 0 && //Temp.Second == 0 && Temp.Millisecond == 0 && Temp > DateTime.MinValue) return (true); else return (false); }
DateTime temp; try { temp = Convert.ToDateTime(grd.Rows[e.RowIndex].Cells["dateg"].Value); grd.Rows[e.RowIndex].Cells["dateg"].Value = temp.ToString("yyyy/MM/dd"); } catch { MessageBox.Show("Sorry The date not valid", "Error", MessageBoxButtons.OK, MessageBoxIcon.Stop,MessageBoxDefaultButton.Button1,MessageBoxOptions .RightAlign); grd.Rows[e.RowIndex].Cells["dateg"].Value = null; }
DateTime temp; try { temp = Convert.ToDateTime(date); date = temp.ToString("yyyy/MM/dd"); } catch { MessageBox.Show("Sorry The date not valid", "Error", MessageBoxButtons.OK, MessageBoxIcon.Stop,MessageBoxDefaultButton.Button1,MessageBoxOptions .RightAlign); date = null; }