DateTime.TryParse siècle de contrôle de C#

le résultat de l'extrait suivant est"12/06/1930 12:00:00". Comment contrôler le siècle implicite pour que" 12 Jun 30 " devienne 2030 à la place?

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

veuillez mettre de côté, pour le moment, le fait qu'une solution correcte est de spécifier correctement la date en premier lieu.

Note: le résultat est indépendant du système datetime pour le pc qui exécute le code.

Réponse: Merci 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());
    }
20
demandé sur Nat 2009-11-19 05:35:41

5 réponses

c'est délicat, parce que la façon dont les années à deux chiffres fonctionnent avec TryParse est basée sur la propriété TwoDigitYearMax de la propriété Calendar de L'objet CultureInfo que vous utilisez. (CultureInfo->Calendrier->TwoDigitYearMax)

pour faire deux chiffres années ont 20 prépayé, vous aurez besoin de créer manuellement un objet CultureInfo qui a un objet calendrier avec 2099 défini comme la propriété TwoDigitYearMax. Malheureusement, cela signifie que n'importe quelle date à deux chiffres 20 préfixé (y compris 98, 99, etc.) qui n'est probablement pas ce que vous voulez.

je soupçonne que votre meilleure option est d'utiliser une bibliothèque d'analyse de date de tiers au lieu de la norme tryparse qui utilisera la règle +50/-50 année pour les années à deux chiffres. (qu'une année à deux chiffres se traduise par une fourchette comprise entre 50 ans avant cette année et 50 ans de plus que cette année).

alternativement, vous pouvez outrepasser le ToFourDigitYear méthode sur l'objet calendar (c'est virtuel) et utilisez cela pour implémenter la règle -50/+50.

18
répondu Deeksy 2009-11-19 04:24:44

j'écrirais une fonction réutilisable:

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

voici ma liste de quasi-chaînes de date

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

Scan-dessus d'elle de la sorte:

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

notez qu'il traite 30 comme 2030 maintenant au lieu de 1930...

9
répondu BenAlabaster 2010-08-18 17:50:16

vous cherchez le calendrier .TwoDigitYearMax Propriété .

Jon Skeet a posté quelque chose que vous trouverez probablement utile.

2
répondu Chris Van Opstal 2017-05-23 12:00:32

j'ai eu un problème similaire et je l'ai résolu avec une Regex. Dans votre cas, il ressemblerait à cela:

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;
}
1
répondu BlackMatrix 2018-02-11 18:45:43
result = year.ToString().Length == 1 
      || year.ToString().Length == 2 ? "1" 
       : (Convert.ToInt32(year.ToString()
          .Substring(0, (year.ToString().Length - 2))) + 1).ToString();
-1
répondu user4554304 2015-02-11 11:12:14