2010-04-26 6 views
5

Io prendere la differenza tra due campi DateTime, e memorizzarlo in una variabile TimeSpan, Ora devo arrotondare-off il TimeSpan dalle seguenti norme:Come gestire l'arrotondamento TimeSpan?

se i minuti in TimeSpan è inferiore a 30 poi Minuti e Secondi deve essere impostato su zero,
se i minuti in TimeSpan sono uguali o maggiori di 30, quindi le ore devono essere incrementate di 1 e Minuti e Secondi devono essere impostati su zero.

TimeSpan può anche essere un valore negativo, quindi in questo caso ho bisogno di conservare il segno ..

potrei essere in grado di raggiungere il requisito se il TimeSpan non era un valore negativo, anche se ho scritto un codice non mi soddisfa con la sua inefficienza in quanto è più ingombrante ..

Si prega di suggerire un metodo più semplice ed efficiente.

Grazie saluti,

Questo è il mio codice che funziona bene, quando non è TimeSpan valore negativo ..

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 conterrà il risultato ..

+1

Mostraci il codice che avete, si prega di –

+0

Perché non condividere il codice come base per iniziare? –

+0

@josh, @Frank, ya sicuro .. –

risposta

9

ne dite:

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, Non è supportato con .NET V2.0, si apre errore quando provo a innescare la trasformazione, come correggere l'errore ?? –

+0

@infant programmer: "appare l'errore" non mi dà molte indicazioni su cosa c'è che non va. Che errore stai ottenendo? –

+0

@jon, sì, mi dispiace per quello .. in realtà non ho potuto spiegare l'errore nelle mie parole, insieme agli errori generali ci sono anche alcune cose legate al business, ho copiato l'errore in un file di testo, per favore qui :: http://sites.google.com/site/aravindspattar/NewTextDocument.txt –

4

È possibile utilizzare

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

Dipende se ho capito correttamente le regole per i valori negativi.

+0

Sospetto che tu voglia specificare un arrotondamento del punto medio su quello ... –

+0

@Jon, sì, stavo solo osservandolo. –

+0

+1 Questo è il modo più semplice per farlo, IMO, e può persino essere ridotto a un solo rivestimento. –

3

TimeSpan è immutabile, quindi è necessario crearne uno nuovo. Questo è anche un caso perfetto per l'utilizzo di metodi di estensione in 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

Vuoi TotalHours, altrimenti 26 ore finiranno per diventare 2 ore. –

+0

@Jon Skeet: Sì, grazie. – LBushkin

+0

grazie per la risposta .. anche il tuo codice funziona bene :) Mi piacerebbe apprezzare la logica che hai usato :) –