如何在C#中验证日期时间?

时间:2008-12-16 17:16:15

标签: c# datetime validation

我怀疑我是唯一一个提出这个解决方案的人,但是如果你有更好的解决方案,请在这里发布。我只想在这里留下这个问题,以便我和其他人可以在以后搜索。

我需要判断是否在文本框中输入了有效日期,这是我提出的代码。当焦点离开文本框时,我会触发它。

try
{
    DateTime.Parse(startDateTextBox.Text);
}
catch
{
    startDateTextBox.Text = DateTime.Today.ToShortDateString();
}

14 个答案:

答案 0 :(得分:234)

DateTime.TryParse

我相信这更快,这意味着你不必使用丑陋的尝试/捕获:)

e.g

DateTime temp;
if(DateTime.TryParse(startDateTextBox.Text, out temp))
{
  // Yay :)
}
else
{
  // Aww.. :(
}

答案 1 :(得分:55)

不要使用异常进行流量控制。使用DateTime.TryParseDateTime.TryParseExact。我个人更喜欢具有特定格式的TryParseExact,但我猜有时TryParse更好。基于原始代码使用的示例:

DateTime value;
if (!DateTime.TryParse(startDateTextBox.Text, out value))
{
    startDateTextox.Text = DateTime.Today.ToShortDateString();
}

选择此方法的原因:

  • 更清晰的代码(它说它想做什么)
  • 比捕捉和吞咽异常更好的表现
  • 这不会不恰当地捕获例外 - 例如OutOfMemoryException,ThreadInterruptedException。 (您当前的代码可以通过捕获相关的异常来修复以避免这种情况,但使用TryParse仍然会更好。)

答案 2 :(得分:18)

这是解决方案的另一种变体,如果字符串可以转换为DateTime类型,则返回true,否则返回false。

public static bool IsDateTime(string txtDate)
{
    DateTime tempDate;
    return DateTime.TryParse(txtDate, out tempDate);
}

答案 3 :(得分:4)

我会使用DateTime.TryParse()方法:http://msdn.microsoft.com/en-us/library/system.datetime.tryparse.aspx

答案 4 :(得分:3)

如何使用TryParse

答案 5 :(得分:3)

使用DateTime.TryParse的一个问题是它不支持在没有分隔符的情况下输入的日期的常见数据输入用例,例如011508

以下是如何支持此功能的示例。 (这是我正在构建的框架,因此它的签名有点奇怪,但核心逻辑应该可用):

    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;
            }
        }

    }

答案 6 :(得分:2)

一个班轮:

if (DateTime.TryParse(value, out _)) {//dostuff}

答案 7 :(得分:1)

    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;
    }

//假设输入字符串是短日期格式。
例如“2013/7/5”返回true或
“2013/2/31”返​​回false。
http://forums.asp.net/t/1250332.aspx/1     
// bool booleanValue = ValidateBirthday(“12:55”);返回false

答案 8 :(得分:1)

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);
}

答案 9 :(得分:0)

所有答案都很好,但是如果您要使用单个功能,则可能会起作用。

private bool validateTime(string dateInString)
{
    DateTime temp;
    if (DateTime.TryParse(dateInString, out temp))
    {
       return true;
    }
    return false;
}

答案 10 :(得分:0)

您还可以为特定的DateTime定义CultureInfo格式

public static bool IsDateTime(string tempDate)
{
    DateTime fromDateValue;
    var formats = new[] { "MM/dd/yyyy", "dd/MM/yyyy h:mm:ss", "MM/dd/yyyy hh:mm tt", "yyyy'-'MM'-'dd'T'HH':'mm':'ss" };
    return DateTime.TryParseExact(tempDate, formats, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out fromDateValue);
}

答案 11 :(得分:-1)

protected static bool CheckDate(DateTime date)
{
    if(new DateTime() == date)      
        return false;       
    else        
        return true;        
} 

答案 12 :(得分:-3)

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;
}

答案 13 :(得分:-3)

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;
}