2010-07-27 6 views
1

J'ai trouvé que Date.TryParse est assez indulgent en entrée - ainsi, ignorer le jour ou le mois retournera toujours une valeur, bien que toujours sol arrondi. Par exemple:Arrondir un champ de date de texte libre, pour utiliser un champ de critère "Date à"

DateTime.TryParse("2010", out testDate) 
-> 01 Jan 2010 

ou

DateTime.TryParse("may 2010", out testDate) 
-> 01 May 2010 

Je voudrais permettre à l'utilisateur d'entrer une date à utiliser comme la date limite supérieure pour une recherche - Yat-il un moyen simple d'obtenir à arrondir vers le haut - par exemple: retour 31/12/2010 quand juste '2010' est entré ...

Merci d'avance.

Répondre

1

Vous pourriez avoir quelque chose comme ceci:

string inputDate = "May 2010"; 
int year = 0; 
DateTime date = new DateTime(); 

// Try to parse just by year. 
// Otherwise parse by the input string. 
if (int.TryParse(inputDate, out year)) 
{ 
    date = new DateTime(year, 12, 31); 
} 
else 
{ 
    // Parse the date and set to the last day of the month. 
    if (DateTime.TryParse(inputDate, out date)) 
    { 
     date = date.AddMonths(1).AddMilliseconds(-1); 
    } 
    else 
    { 
     // Throw exception for invalid date? 
    } 
} 
+0

Excellent travail. Note - Tous les autres tours jusqu'à la fin de la période, mais le «3 juin 2007» se termine à la fin du 2 juin. – Overflew

1

En supposant que vous voulez être en mesure d'analyser tous les formats DateTime.TryParse peuvent, vous pourriez faire quelque chose comme ceci:

public static bool DateTimeTryParseMax(string dtText, out DateTime testDate) 
    { 
     testDate = DateTime.MinValue; 

     string nFmt = null; 
     foreach (string fmt in System.Globalization.DateTimeFormatInfo.CurrentInfo.GetAllDateTimePatterns().Concat(new string[] {"yyyy", "yy"})) 
     { 
      if (DateTime.TryParseExact(dtText, fmt, System.Globalization.CultureInfo.CurrentCulture, System.Globalization.DateTimeStyles.None, out testDate)) 
      { 
       nFmt = fmt; 
       break; 
      } 
     } 

     if (nFmt == null) 
      return false; 

     nFmt = nFmt.Replace("dddd", "xxxx"); // Remove Day of the week as not helpful 
     if (!nFmt.Contains("M")) testDate = testDate.AddMonths(12).AddMonths(-1); 
     if (!nFmt.Contains("d")) testDate = testDate.AddMonths(1).AddDays(-1); 
     if (!nFmt.Contains("h") & !nFmt.Contains("H")) testDate = testDate.AddDays(1).AddHours(-1); 
     if (!nFmt.Contains("m")) testDate = testDate.AddHours(1).AddMinutes(-1); 
     if (!nFmt.Contains("s")) testDate = testDate.AddMinutes(1).AddSeconds(-1); 

     return true; 
    } 

Cela ne définir les parties que l'utilisateur n'a pas à la valeur maximale.

Questions connexes