Necesito una forma de whatsUrBirthDay = Console.ReadLine();

Fácilmente podría string whatsUrBirthDay; pero quiero poder almacenar su cumpleaños para poder recordarlo 'relativamente' fácilmente más tarde y posiblemente hacer cálculos con él.

¿Existe un tipo de datos que permita un formato específico de MM / DD / AAAA? Supongo que puedo pedir Month como una cadena, luego buscar la ortografía o los números coincidentes con = alguna variable después, pero seguramente hay una manera más fácil.

¡Gracias de antemano!

Editar Me gustaría agregar que 'no', esa no es la variable que estoy eligiendo, simplemente lo hice de esta manera para que entienda lo que estoy pidiendo.

2
Newbie 3 ene. 2017 a las 09:17
El tipo de datos correcto para esto es DateTime
 – 
sujith karivelil
3 ene. 2017 a las 09:18
Estoy familiarizado con esto, pero es muy específico en el formato que acepta la fecha, ¿verdad? Entonces, ¿catch alguna entrada que no coincida con el formato obvio o cómo funciona?
 – 
Newbie
3 ene. 2017 a las 09:21

2 respuestas

Es mejor que le pida al usuario que ingrese la fecha en algún formato específico, que sea dd-MM-yyyy y muestre un ejemplo también Para que pueda validar la entrada y almacenarla en una variable DateTime; Vea el código a continuación:

string myDateFormat = "dd-MM-yyyy";
Console.WriteLine("Enter your Birth Date in the format {0} \n (example : {1}) : ",myDateFormat,DateTime.Today.ToString(myDateFormat));
DateTime userBirthday;
if (DateTime.TryParseExact(Console.ReadLine(), myDateFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out userBirthday))
{
    Console.WriteLine("You lived {0} days from {1} ", (DateTime.Today - userBirthday).TotalDays, userBirthday.ToString(myDateFormat));
}
else
{
    Console.WriteLine("Wrongly formated input");
}

Nota: si la entrada no está en el formato deseado, entonces TryParseExact devolverá falso en base a que podemos mostrar un mensaje de advertencia

1
sujith karivelil 3 ene. 2017 a las 09:38
¡Eso es genial! CultureInfo.InvariantCulture ha despertado mi interés ahora. :) Tengo que preguntar, sin embargo, ¿por qué creó una variable solo para almacenar "dd-MM-aaaa" cuando podría haberla escrito en la propia WriteLine? Realmente curioso: ¿es este un buen hábito o es en caso de que lo necesite nuevamente en el futuro para otras cosas, etc.?
 – 
Newbie
3 ene. 2017 a las 09:32
A veces puedo usar esos formatos varias veces en el código, para evitar la escritura repetida y los errores tipográficos. Acabo de usar una variable para almacenar esos formatos. Puede leer más desde aquí acerca de DateTime.TryParseExact
 – 
sujith karivelil
3 ene. 2017 a las 09:36
¿Reutilizarlo así? Console.WriteLine("Enter your Birth Date in the format {0} \n (example : {1:" + myDateFormat + "}) : ",myDateFormat, new DateTime(1989, 02, 01));
 – 
Eric
3 ene. 2017 a las 09:36
@ infortunado Es bueno pero supongo que el recién nacido aún no sabe leer :)
 – 
Eric
3 ene. 2017 a las 09:47

Como se indica en los comentarios, el tipo correcto de fechas es DateTime. Puede lograr lo que desee con Parse -método como ese:

DateTime birthday = DateTime.Parse(Console.ReadLine(), out birthday);

DateTime también proporciona un TryParse -Método que se puede utilizar para manejar entradas no válidas:

DateTime birthday;

// error handling similar to the following (if-clause work fine to)
while(!DateTime.TryParse(Console.ReadLine())) 
{
    Console.WriteLine("Invalid input, try again.");
}

Si es nuevo en C # y desea saber más sobre el análisis de fechas / horas, considere leer https: // www. .dotnetperls.com / datetime-parse que explica los aspectos más importantes con ejemplos simples (incluido el manejo de errores y demás)

0
nozzleman 3 ene. 2017 a las 09:31
Gracias por responder. Entonces, la única forma en que se leería / almacenaría correctamente es si la persona lo escribió en el formato exacto correcto, ¿no? ¿Y si no lo hicieran, lanzaría una excepción?
 – 
Newbie
3 ene. 2017 a las 09:23
Eso o lo manejas usando TryParse como se muestra en mi edición
 – 
nozzleman
3 ene. 2017 a las 09:24
De acuerdo, tu edición es exactamente la razón por la que estaba reacio a seguir adelante con esto. Entonces, ¿la diferencia entre TryParse y Parse es que uno lo fuerza mientras que el otro intenta y lanza una excepción capturable si no es válida?
 – 
Newbie
3 ene. 2017 a las 09:24
Parse arroja una excepción si la entrada no era válida, TryParse no arroja una excepción pero devuelve false si la entrada no es válida. Para la entrada del usuario, TryParse might be what you want to use
 – 
nozzleman
3 ene. 2017 a las 09:26
Además, considere leer dotnetperls.com/datetime-parse, que explica la descripción de la fecha de manera bastante sucinta.
 – 
nozzleman
3 ene. 2017 a las 09:27