2010-04-29 7 views
0

Quelle bibliothèque puis-je utiliser pour calculer les dates en fonction des expressions de date?Bibliothèque pour travailler avec des expressions de date en C#?

Une expression de date serait quelque chose comme:

  • "+ 3D" (plus trois jours)
  • "-1W" (moins d'une semaine)
  • "+ 2y 2D + 1M" (moins de 2 ans, plus un jour, plus un mois)

Exemple:

DateTime EstimatedArrivalDate = CalcDate("+3D", DateTime.Now); 

Lorsque la date d'arrivée estimée serait égale à la date du jour plus 3 jours.

J'ai entendu parler de JodaTime et de NodaTime mais je n'ai encore rien vu de pareil. Que devrais-je utiliser pour obtenir cette fonctionnalité en C#?

+0

juste pour votre référence bien qu'il ne se rapporte pas à C# mais une bibliothèque similaire est disponible pour javascript. www.datejs.com –

+0

Y at-il une raison pour laquelle cela a été voté? –

Répondre

4

Il n'y a pas de bibliothèque (à ma connaissance, y compris le port de JodaTime vers .NET) qui fonctionnera avec des expressions comme celle-ci. Tant que les expressions sont simplement enchaînées (comme dans votre exemple), il devrait être assez facile d'écrire un RegEx pour analyser cette expression et faire le traitement vous:

public static DateTime CalcDate(string expression, DateTime epoch) 
{ 
    var match = System.Text.RegularExpressions.Regex.Match(expression, 
        @"(([+-])(\d+)([YDM]))+"); 

    if (match.Success && match.Groups.Count >= 5) 
    { 
     var signs = match.Groups[2]; 
     var counts = match.Groups[3]; 
     var units = match.Groups[4]; 

     for (int i = 0; i < signs.Captures.Count; i++) 
     { 
      string sign = signs.Captures[i].Value; 
      int count = int.Parse(counts.Captures[i].Value); 
      string unit = units.Captures[i].Value; 

      if (sign == "-") count *= -1; 

      switch (unit) 
      { 
       case "Y": epoch = epoch.AddYears(count); break; 
       case "M": epoch = epoch.AddMonths(count); break; 
       case "D": epoch = epoch.AddDays(count); break; 
      } 
     } 
    } 
    else 
    { 
     throw new FormatException(
      "The specified expression was not a valid date expression."); 
    } 

    return epoch; 
} 
+0

Downvoter soin de commenter ...? –

+0

Wow, c'est génial. Pouvez-vous expliquer à quoi correspond le match.Groups.Count> = 5? –

+0

Le premier groupe est l'expression externe principale (-2Y + 2D + 1M), que nous ne voulons pas. Le second sera les éléments individuels (-2Y, + 2D, et + 1M), que nous ne voulons pas non plus. Les troisième, quatrième et cinquième groupes représentent les captures individuelles pour le signe, le compte et l'unité. Le '> = 5' est juste là pour s'assurer que nous n'accédons pas à un index hors limites. –

2

Vous pouvez utiliser des combinaisons de DateTime et TimeSpan pour faire tout ça. Vous pouvez trouver un bon exemple à http://dotnetperls.com/timespan

De votre exemple: DateTime EstimatedArrivalDate = DateTime.Now.AddDays (3);

+0

Juste pour info, la structure 'TimeSpan' ne peut pas être utilisée ici; ni l'année ni le mois ne sont des unités de mesure fixes. (En d'autres termes, la durée réelle peut varier d'un mois ou d'une année à l'autre). –

Questions connexes