如何在C#中验证DateTime?


118

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

我需要告诉您是否在文本框中输入了有效日期,这就是我想出的代码。当焦点离开文本框时,我将触发此事件。

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

1
<sarcasm>从答案来看,我想我应该使用TryParse </ sarcasm>谢谢大家的出色回答。我什至没有想到过TryParse
Matt

2
一个简单的谷歌问题的例子,如果有人今天问,将因“研究不足”而被不公平地关闭。
live-love

1
这是一种不使用任何特殊功能的简单方法:< stackoverflow.com/questions/14917203/… >
Zameer 2013年


2
使用DateTimes一直是低音的难题。谢谢
Gonzo345

Answers:


269
DateTime.TryParse

我相信这会更快,这意味着您不必使用难看的try / catches :)

例如

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

2
如果我错了,请纠正我,但是在C#中(相对于JavaScript),if / else分支不需要大括号吗?不要误会我的意思,我并不想进行仔细的检查,这是一个很棒的答案,我正在对其进行+1,因为它对我有帮助,但只是因为您在查看已发布的答案时永远都不知道未来的新用户如何,这可能会使他们感到困惑。当然,如果您在C#中使用花括号时遇到麻烦,那么这个问题将是您最少的担心……
VoidKing 2013年

2
@VoidKing您对花括号是正确的,但是如果在该块中只有1条语句,则不必使用它们。这也适用于其他一些语言,但我可以看到这可能会误导新的编码人员。
D.Galvez 2014年

2
@ D.Galvez对不起,我来晚了,但是即使只有1条陈述,把方括号括起来也是一种最佳实践吗?在个人喜好最重要的情况下,这可能是一种情况;在这种情况下,我发现仅出于可读性和一致性的考虑,将它们包括在内是非常好的。
尼克

2
我在6年前几乎不知道会发生关于方括号的辩论。
2014年

可以使用if(DateTime.TryParse(startDateTextBox.Text, out var temp)):) 缩短变量的初始化时间
Alexandre Daubricourt

61

不要将异常用于流控制。使用DateTime.TryParseDateTime.TryParseExact。就个人而言,我更喜欢使用特定格式的TryParseExact,但我想有时候TryParse会更好。根据您的原始代码使用示例:

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

选择此方法的原因:

  • 清晰的代码(它说了想做什么)
  • 比捕获和吞下异常更好的性能
  • 这不会不适当地捕获异常-例如,OutOfMemoryException,ThreadInterruptedException。(可以通过捕获相关异常来解决当前问题,从而避免这种情况,但是使用TryParse还是更好。)

24

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

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

3
欢迎来到StackOverflow!请查看已经提供的答案,尤其是在回答已存在三年以上且已成功回答的问题时。您的答案已经被以前的受访者所接受。
Bob Kaufman



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

    }

我不担心分隔符,因为我使用的是“蒙版文本框”,但是我可以看到在此应用程序可能遇到的其他情况下如何使用分隔符。
马特

使用不带分隔符的DateTime字符串的原因是什么?
谢尔盖·科瓦连科

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”); 返回假


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

1

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

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

1
如何返回DateTime.TryParse()的结果而不是“ if”块?同样,您的IDE也会抱怨从未使用过的温度,您可以在函数调用中直接将其声明为“ out DateTime temp”。
谢尔盖·科瓦连科

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

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

2
尽管这段代码可以解决问题,但包括解释如何以及为什么解决该问题的说明,确实可以帮助提高您的帖子质量,并可能导致更多的投票。请记住,您将来会为读者回答问题,而不仅仅是现在问的人。请编辑您的答案以添加说明,并指出适用的限制和假设。
布赖恩

问题是询问如何验证string可能包含或不包含 DateTIme值的。您正在检查给定的DateTime值是否具有默认值(对应于0001-01-01T00:00:00.0000000)。这如何回答这个问题?
dbc

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

1
U必须通过catch来检查是否有效。因此,您可以使用try catch来检查所有类型的变量,并在您的项目中进行有效的全局函数控制和全部控制。最好的问候.....阿什拉夫·哈利法
阿什拉夫·哈利法

-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;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.