2013-03-26 7 views
5

Esiste un metodo efficiente per calcolare la percentuale di X da Y, quando entrambi i tipi di dati sono TimeSpan?Metodo efficiente per trovare una percentuale di tempo

Ad esempio, una domanda di base è che 1:00:00 è il 50% di 2:00:00. Quale sarebbe un metodo efficace per calcolare quale percentuale è 00:34:23 di 4:12:31?

+3

Ciò che è '34: 23'? Non è un tempo valido? – mattytommo

+2

Sei sicuro che X e Y sono entrambi un 'DateTime'? Avrebbe più senso se entrambi fossero un 'TimeSpan'. –

+1

@mattytommo Suppongo che siano 34 minuti e 23 secondi ... –

risposta

9

MODIFICA: come da commento, i tipi in realtà sono destinati a essere TimeSpan anziché a DateTime, a quel punto tutto è semplice.

Quando si chiede che cosa X proporzione è di Y, che è fondamentalmente la divisione, che è facilmente implementata su TimeSpan: codice

public static double Divide(TimeSpan dividend, TimeSpan divisor) 
{ 
    return (double) dividend.Ticks/(double) divisor.Ticks; 
} 

Esempio:

using System; 
using System.IO; 
using System.Globalization; 
using System.Linq; 

class Test 
{ 
    static void Main() 
    { 
     TimeSpan x = new TimeSpan(0, 34, 23); 
     TimeSpan y = new TimeSpan(4, 12, 31); 
     Console.WriteLine(Divide(x, y)); // 0.13616 etc, i.e. 13% 
    } 

    public static double Divide(TimeSpan dividend, TimeSpan divisor) 
    { 
     return (double) dividend.Ticks/(double) divisor.Ticks; 
    } 
} 
+0

Typo. Intendevo un 'TimeSpan', mi sono un po 'confuso :) –

+0

@Teifi: Giusto. In tal caso, vedi il resto della mia risposta - e per favore risolvi la tua domanda. (Vale la pena esaminare attentamente la tua domanda prima di postarla ...) –

+0

Per che cosa è il metodo 'Scale'? –

7

Utilizzare la proprietà DateTime.Ticks. È possibile trovare una percentuale sottraendo e dividendo le zecche DateTime l'una dall'altra. Questo è il modo più accurato.

Se si utilizza solo un orario, utilizzare l'oggetto TimeSpan anziché l'oggetto DateTime.

+1

Cosa? Come fai a fare questo? 'DateTime.Ticks' contiene un numero gigantesco di diverse grandezze rispetto alla differenza tra 1 ora. – Andrey

+1

L'uso di 'DateTime.Ticks' non ha senso qui. Un "DateTime" non è una proporzione di un altro, né ha senso ridimensionare su "DateTime" da qualsiasi cosa. Fondamentalmente, questa domanda dovrebbe riguardare 'TimeSpan', non' DateTime'. –

+0

Ha senso, è la variabile di misurazione del tempo più precisa nel framework .NET. È misurato fino a un decimilionesimo di secondo. Questo rende la percentuale più accurata e più pulita. La risposta di cui sopra sta usando anche Ticks e tu l'hai pubblicata. Ho anche etichettato entrambi gli scenari quando si utilizza DateTime e TimeSpan. Dovresti sapere quando usare entrambi. –

2

Il tempo viene misurato in unità e in qualsiasi momento può essere convertito in numero di tali unità e quindi elaborato come qualsiasi altro numero. Creare un TimeSpan e prendere TotalSeconds e quindi fare i conti.

Problemi correlati