如何在 C# 中验证日期时间?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/371987/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to Validate a DateTime in C#?
提问by Matt
I doubt I am the only one who has come up with this solution, but if you have a better one please post it here. I simply want to leave this question here so I and others can search it later.
我怀疑我是唯一提出此解决方案的人,但如果您有更好的解决方案,请在此处发布。我只是想把这个问题留在这里,以便我和其他人以后可以搜索它。
I needed to tell whether a valid date had been entered into a text box and this is the code that I came up with. I fire this when focus leaves the text box.
我需要判断是否在文本框中输入了有效日期,这是我想出的代码。当焦点离开文本框时,我会触发它。
try
{
DateTime.Parse(startDateTextBox.Text);
}
catch
{
startDateTextBox.Text = DateTime.Today.ToShortDateString();
}
采纳答案by qui
DateTime.TryParse
This I believe is faster and it means you dont have to use ugly try/catches :)
我相信这更快,这意味着您不必使用丑陋的尝试/捕获:)
e.g
例如
DateTime temp;
if(DateTime.TryParse(startDateTextBox.Text, out temp))
{
// Yay :)
}
else
{
// Aww.. :(
}
回答by Alex Fort
I would use the DateTime.TryParse() method: http://msdn.microsoft.com/en-us/library/system.datetime.tryparse.aspx
我会使用 DateTime.TryParse() 方法:http: //msdn.microsoft.com/en-us/library/system.datetime.tryparse.aspx
回答by Jon Skeet
Don't use exceptions for flow control. Use DateTime.TryParseand DateTime.TryParseExact. Personally I prefer TryParseExact with a specific format, but I guess there are times when TryParse is better. Example use based on your original code:
不要使用异常进行流量控制。使用DateTime.TryParse和DateTime.TryParseExact。我个人更喜欢具有特定格式的 TryParseExact,但我想有时 TryParse 更好。基于您的原始代码的示例使用:
DateTime value;
if (!DateTime.TryParse(startDateTextBox.Text, out value))
{
startDateTextox.Text = DateTime.Today.ToShortDateString();
}
Reasons for preferring this approach:
首选这种方法的原因:
- Clearer code (it says what it wants to do)
- Better performance than catching and swallowing exceptions
- This doesn't catch exceptions inappropriately - e.g. OutOfMemoryException, ThreadInterruptedException. (Your current code could be fixed to avoid this by just catching the relevant exception, but using TryParse would still be better.)
- 更清晰的代码(它说明了它想要做什么)
- 比捕获和吞下异常更好的性能
- 这不会不恰当地捕获异常 - 例如 OutOfMemoryException、ThreadInterruptedException。(您当前的代码可以通过仅捕获相关异常来修复以避免这种情况,但使用 TryParse 仍然会更好。)
回答by Robert Rossney
A problem with using DateTime.TryParse
is that it doesn't support the very common data-entry use case of dates entered without separators, e.g. 011508
.
使用的一个问题DateTime.TryParse
是它不支持非常常见的数据输入用例,即不使用分隔符输入的日期,例如011508
.
Here's an example of how to support this. (This is from a framework I'm building, so its signature is a little weird, but the core logic should be usable):
这是一个如何支持这一点的示例。(这是我正在构建的框架,所以它的签名有点奇怪,但核心逻辑应该是可用的):
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;
}
}
}
回答by Brendan Conrad
Here's another variation of the solution that returns true if the string can be converted to a DateTime
type, and false otherwise.
这是解决方案的另一个变体,如果字符串可以转换为DateTime
类型,则返回 true,否则返回false。
public static bool IsDateTime(string txtDate)
{
DateTime tempDate;
return DateTime.TryParse(txtDate, out tempDate);
}
回答by Chung_TheWebDeveloper
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;
}
//suppose that input string is short date format.
e.g. "2013/7/5" returns true or
"2013/2/31" returns false.
http://forums.asp.net/t/1250332.aspx/1
//bool booleanValue = ValidateBirthday("12:55"); returns false
//假设输入字符串是短日期格式。
例如“2013/7/5”返回真或
“2013/2/31”返回假。
http://forums.asp.net/t/1250332.aspx/1
//bool booleanValue = ValidateBirthday("12:55"); 返回假
回答by Julius
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);
}
回答by Ashraf Khalifah
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;
}
回答by Ashraf Khalifah
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;
}