validar todatetime texto saber parse fecha example ejemplo convertir convert c# datetime tryparse

todatetime - saber si un texto es fecha c#



DateTime.TryParse siglo control C# (5)

El resultado del siguiente fragmento de código es "12/06/1930 12:00:00". ¿Cómo controlo el siglo implícito para que "12 de junio 30" se convierta en 2030?

string dateString = "12 Jun 30"; //from user input DateTime result; DateTime.TryParse(dateString, new System.Globalization.CultureInfo("en-GB"),System.Globalization.DateTimeStyles.None,out result); Console.WriteLine(result.ToString());

Deje de lado, por el momento, el hecho de que una solución correcta es especificar la fecha correctamente en primer lugar.

Nota: El resultado es independiente de la fecha y hora del sistema para la PC que ejecuta el código.

Respuesta: gracias Deeksy

for (int i = 0; i <= 9; i++) { string dateString = "12 Jun " + ((int)i * 10).ToString(); Console.WriteLine("Parsing " + dateString); DateTime result; System.Globalization.CultureInfo cultureInfo = new System.Globalization.CultureInfo("en-GB"); cultureInfo.Calendar.TwoDigitYearMax = 2099; DateTime.TryParse(dateString, cultureInfo , System.Globalization.DateTimeStyles.None, out result); Console.WriteLine(result.ToString()); }


Es complicado, porque la forma en que funcionan los años de dos dígitos con TryParse se basa en la propiedad TwoDigitYearMax de la propiedad Calendar del objeto CultureInfo que está utilizando. (CultureInfo-> Calendar-> TwoDigitYearMax)

Para que los años de dos dígitos tengan 20 prefijados, deberá crear manualmente un objeto CultureInfo que tenga un objeto Calendario con 2099 configurado como la propiedad TwoDigitYearMax. Desafortunadamente, esto significa que cualquier fecha analizada de dos dígitos tendrá 20 prefijados (incluidos 98, 99, etc.) que probablemente no sea lo que usted desea.

Sospecho que su mejor opción es usar una biblioteca de análisis de fechas de terceros en lugar del estándar de tryparse que usará la regla de + 50 / -50 años para años de 2 dígitos. (que un año de 2 dígitos debe traducirse en un rango entre 50 años antes de este año y 50 años mayor que este año).

Alternativamente, podría anular el método ToFourDigitYear en el objeto de calendario (es virtual) y usarlo para implementar la regla -50 / + 50.


Escribiría una función reutilizable:

public static object ConvertCustomDate(string input) { //Create a new culture based on our current one but override the two //digit year max. CultureInfo ci = new CultureInfo(CultureInfo.CurrentCulture.LCID); ci.Calendar.TwoDigitYearMax = 2099; //Parse the date using our custom culture. DateTime dt = DateTime.ParseExact(input, "MMM-yy", ci); return new { Month=dt.ToString("MMMM"), Year=dt.ToString("yyyy") }; }

Aquí está mi lista de cadenas de cuasi fecha

List<string> dates = new List<string>(new []{ "May-10", "Jun-30", "Jul-10", "Apr-08", "Mar-07" });

Escanee sobre esto de esta manera:

foreach(object obj in dates.Select(d => ConvertCustomDate(d))) { Console.WriteLine(obj); }

Note que maneja 30 como 2030 ahora en lugar de 1930 ...



Tuve un problema similar y lo resolví con un Regex. En tu caso se vería así:

private static readonly Regex DateRegex = new Regex( @"^[0-9][0-9] (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) [0-9][0-9]$", RegexOptions.Compiled | RegexOptions.ExplicitCapture); private static string Beautify(string date) { var match = DateRegex.Match(date); if (match.Success) { // Maybe further checks for correct day return date.Insert("dd-MMM-".Length, "20"); } return date; }


result = year.ToString().Length == 1 || year.ToString().Length == 2 ? "1" : (Convert.ToInt32(year.ToString() .Substring(0, (year.ToString().Length - 2))) + 1).ToString();