2008-12-16 18 views
89

Dudo que soy el único que ha presentado esta solución, pero si tiene una mejor, publíquela aquí. Simplemente quiero dejar esta pregunta aquí para que yo y otros podamos buscarla más tarde.Valide un DateTime en C#

Necesitaba decir si se había ingresado una fecha válida en un cuadro de texto y este es el código que se me ocurrió. Disparo esto cuando el foco deja el cuadro de texto.

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

a juzgar por las respuestas, creo que debería usar TryParse Gracias por los chicos grandes respuestas. Ni siquiera había pensado en TryParse – Matt

+1

Un ejemplo de una pregunta fácil de buscar en Google que si alguien preguntara hoy sería injustamente cerrado por tener "investigación insuficiente". –

+1

aquí es una manera fácil de hacer esto sin utilizar ninguna función especial: xameeramir

Respuesta

198
DateTime.TryParse 

Esto creo que es más rápido y esto significa que usted no tiene que utilizar feas try/capturas :)

por ejemplo

DateTime temp; 
if(DateTime.TryParse(startDateTextBox.Text, out temp)) 
//yay 
else 
// :(
+1

Corrígeme si me equivoco, pero en C# (en lugar de, por ejemplo, JavaScript) ¿una rama if/else requiere llaves? No me malinterpreten, no estoy tratando de escudriñar, es una respuesta fantástica y la estoy duplicando porque me ayudó, pero pensé que ya que nunca se sabe cómo serán los futuros usuarios al ver las respuestas ya publicadas, este podría confundirlos. Por supuesto, si tiene problemas con las llaves en C#, esta sería la menor de sus preocupaciones ... – VoidKing

+1

@VoidKing Tiene razón sobre las llaves, pero si solo tiene 1 enunciado en ese bloque no lo hace tengo que usarlos Esto se aplica también en algunos otros idiomas, pero puedo ver cómo esto puede ser engañoso para los nuevos codificadores. –

+1

@ D.Galvez Perdón por mi llegada tardía a la fiesta, pero ¿es una buena práctica incluir los corchetes aunque solo haya 1 enunciado? Esta podría ser una situación en la que las preferencias personales son las más importantes, y en ese caso, considero que * incluso * son bastante agradables simplemente por su legibilidad y coherencia. –

53

No utilice excepciones para el control de flujo. Use DateTime.TryParse y DateTime.TryParseExact. Personalmente prefiero TryParseExact con un formato específico, pero creo que hay momentos en que TryParse es mejor. Ejemplo de aplicación basado en el código original:

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

Razones para preferir este enfoque:

  • código más claro (dice lo que quiere hacer)
  • mejor rendimiento que captura y tragar excepciones
  • Esto no detecta excepciones de manera inapropiada, por ejemplo OutOfMemoryException, ThreadInterruptedException. (Su código actual podría fijarse para evitar esto con sólo agarrar la excepción relevante, pero utilizando TryParse todavía sería mejor.)
3

Un problema con el uso de DateTime.TryParse es que no es compatible con el caso de uso de entrada de datos muy común de las fechas ingresadas sin separadores, p. 011508.

Aquí hay un ejemplo de cómo admitir esto. (Esto es de un marco que estoy construyendo, por lo que su firma es un poco raro, pero la lógica de la base debe ser utilizable):

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

    } 
+0

No me preocupan los separadores en mi caso porque estoy usando un cuadro de texto enmascarado, pero puedo ver cómo sería útil en otras situaciones que pueda encontrar con esta aplicación. – Matt

+0

Me ayudó mucho. Agradezco profundamente tu aporte. –

12

Aquí es otra variante de la solución que devuelve verdadero si la cadena se puede convertir a un tipo DateTime, y falso de lo contrario.

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

¡Bienvenido a StackOverflow! Mire las respuestas que ya se han proporcionado, especialmente al responder a una pregunta que tiene más de tres años y que se ha respondido con éxito. Su respuesta ya ha sido cubierta por los encuestados anteriores. –

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

// suponer que la cadena de entrada es el formato de fecha corta.
p. Ej. "2013/7/5" devuelve verdadero o
"2013/2/31" devuelve falso.
http://forums.asp.net/t/1250332.aspx/1
// bool booleanValue = ValidateBirthday ("12:55"); devuelve false

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); 
} 
-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 tiene que marcar válido por try catch. Así que U puede usar try catch para verificar todas las variables de tipos y hacer funciones globales válidas y controlar todo en su proyecto. mis mejores deseos ..... Ashraf Khalifah –

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