2010-04-26 8 views
5

je prends la différence entre deux champs DateHeure, et le stocker dans une variable TimeSpan, Maintenant, je dois arrondi le TimeSpan par les règles suivantes:Comment faire pour arrondir TimeSpan?

si les minutes TimeSpan est inférieure à 30 puis minutes et secondes doit être mis à zéro, si les
minutes à TimeSpan est égale ou supérieure à 30 heures, puis doit être incrémenté de 1 et de minutes et secondes doivent être mis à zéro.

TimeSpan peut aussi être une valeur négative, donc dans ce cas, je dois préserver le signe ..

je pourrais être en mesure d'atteindre l'exigence si le TimeSpan était pas une valeur négative, bien que je l'ai écrit un code Je ne suis pas satisfait de son inefficacité car il est plus volumineux ..

S'il vous plaît me suggérer une méthode plus simple et efficace.

Merci Cordialement,

C'est mon code qui fonctionne très bien, quand TimeSpan est pas de valeur négative ..

TimeSpan time_span = endTime.Subtract(startTime); 
      TimeSpan time_span1; 
      if (time_span.Minutes >= 30) 
      { 
       time_span1 = new TimeSpan(time_span.Hours + 1, 0, 0); 
      } 
      else 
      { 
       time_span1 = new TimeSpan(time_span.Hours, 0, 0); 
      } 

time_span1 contiendra le résultat ..

+1

Montrez-nous le code que vous avez, s'il vous plaît –

+0

Pourquoi partager ne vous votre code comme base pour partir? –

+0

@josh, @Frank, ya sûr .. –

Répondre

9

Que diriez-vous:

public static TimeSpan Round(TimeSpan input) 
{ 
    if (input < TimeSpan.Zero) 
    { 
     return -Round(-input); 
    } 
    int hours = (int) input.TotalHours; 
    if (input.Minutes >= 30) 
    { 
     hours++; 
    } 
    return TimeSpan.FromHours(hours); 
} 
+0

@ Jon, Il n'est pas pris en charge avec V2.0 .NET, il erreur pop ups lorsque je tente de déclencher la transformation, comment corriger l'erreur ?? –

+0

Programmeur @infant: "l'erreur apparait" ne me donne pas beaucoup d'indications sur ce qui ne va pas. Quelle erreur obtenez vous? –

+0

@ Jon, ya, je suis désolé .. en fait je ne pouvais pas expliquer l'erreur dans mes paroles, ainsi que les erreurs générales il y a des choses trop liées aux affaires, j'ai copié l'erreur dans un fichier texte, s'il vous plaît trouver ici: http://sites.google.com/site/aravindspattar/NewTextDocument.txt –

4

Vous pouvez utiliser

double v = span.TotalHours;  
v = Math.Round(v, MidpointRounding.AwayFromZero); 
span = TimeSpan.FromHours(v); 

Cela dépend si je compris vos règles pour les valeurs négatives correctement.

+0

Je suppose que vous voudriez spécifier un arrondi à mi-chemin sur cela ... –

+0

@Jon, oui, je regardais juste cela. –

+0

+1 C'est le moyen le plus simple de le faire, et même de le réduire à un simple doublure. –

3

TimeSpan est immuable, vous devez créer un nouveau. Ceci est également un cas parfait pour l'utilisation des méthodes d'extension en C#:

public static class TimeSpanUtility 
{ 
    public static TimeSpan Round(this TimeSpan ts) 
    { 
     var sign = ts < TimeSpan.Zero ? -1 : 1; 
     var roundBy = Math.Abs(ts.Minutes) >= 30 ? 1 : 0; 
     return TimeSpan.FromHours(ts.TotalHours + (sign * roundBy)); 
    } 
} 

// usage would be: 
var someTimeSpan = new TimeSpan(2, 45, 15); 
var roundedTime = someTimeSpan.Round(); 
+0

Vous voulez TotalHours, sinon 26 heures finiront par devenir 2 heures. –

+0

@Jon Skeet: Oui, merci. – LBushkin

+0

merci pour la réponse .. votre code fonctionne bien aussi :) Je voudrais apprécier la logique que vous avez utilisé :) –