Calcolare quanti minuti ci sono tra due volte


86

Ho un datagridview nella mia applicazione che contiene gli orari di inizio e fine. Voglio calcolare il numero di minuti tra questi due tempi. Finora ho:

var varFinish = tsTable.Rows[intCellRow]["Finish Time"];
TimeSpan varTime = (DateTime)varFinish - (DateTime)varValue;
int intMinutes = TimeSpan.FromMinutes(varTime);

Ma l'ultima riga non verrà compilata perché dice che sto usando argomenti non validi per il costruttore Timespan. Ho studiato un bel po 'come calcolare il numero di minuti tra due volte, ma sto colpendo un po' un muro di mattoni. Qualcuno può consigliarmi sul modo migliore per raggiungere il mio obiettivo.

MODIFICARE/

Ora il mio codice è il seguente:

var varFinish = tsTable.Rows[intCellRow]["Finish Time"];
TimeSpan varTime = (DateTime)varFinish - (DateTime)varValue;
int intMinutes = (int)varTime.TotalMinutes;

Ma ricevo un cast non valido sulla seconda riga. Sia varFinish che varValue sono orari, ad esempio, 10:00 e 8:00. Quindi non sei sicuro del motivo per cui non trasmetteranno per digitare DateTime?


Se varFinish è una stringa, non è possibile eseguire il cast di una stringa in un DateTime. È necessario utilizzare DateTime.Parse (...). Anche allora, implicherà la data odierna se non c'è una data in varFinish.
Jim,

Risposte:


160

Prova questo

DateTime startTime = varValue
DateTime endTime = varTime

TimeSpan span = endTime.Subtract ( startTime );
Console.WriteLine( "Time Difference (minutes): " + span.TotalMinutes );

Modifica: se stai provando 'span.Minutes', questo restituirà solo i minuti di timepan [0 ~ 59], per restituire la somma di tutti i minuti di questo intervallo, usa semplicemente 'span.TotalMinutes'.


2
Questa è una buona risposta, ma dà 0 su span. Minuta quando la differenza tra due tempi è maggiore di 1 ora (cioè 60 minuti o più)
Asif Mehmood

6
@MalikAsif. Ho appena provato con un arco di 61 minuti e ottengo 1 ora e 1 minuto, come previsto. Se l'intervallo fosse esattamente di 60 minuti, allora sì, i minuti sarebbero zero. Ci stavi pensando TotalMinutes()?
Jim

17
NON VERO. span.Minutesrestituisce un numero [0..59]. Usa span.TotalMinutesinvece
Sten Petrov

2
Questa non dovrebbe essere la risposta accettata. Come per gli altri commenti, non risolve correttamente la domanda.
tjmoore

2
@tjmoore grazie per il feedback, sono d'accordo con te. Ho risposto alla domanda originale nel gennaio 2012, dopodiché la domanda è stata modificata. Di tanto in tanto ricevo voti negativi per questa risposta, probabilmente perché la maggior parte delle persone legge la risposta 5 anni dopo che è stata posta la domanda originale non modificata.
Kane

35
double minutes = varTime.TotalMinutes;
int minutesRounded = (int)Math.Round(varTime.TotalMinutes);

TimeSpan.TotalMinutes : il numero totale di minuti rappresentati da questa istanza.


2
Sì, TotalMinutes è quello che stavo cercando. Grazie mille ^ _ ^
Wahid Bitar

int minutesRounded = (int) Math.Round (minutes);
Sagi

9

Nel tuo codice domanda stai usando in TimeSpan.FromMinutesmodo errato. Vedere la documentazione MSDN per TimeSpan.FromMinutes, che fornisce la seguente firma del metodo:

public static TimeSpan FromMinutes(double value)

quindi, il codice seguente non verrà compilato

var intMinutes = TimeSpan.FromMinutes(varTime); // won't compile

È invece possibile utilizzare la proprietà TimeSpan.TotalMinutes per eseguire questa operazione aritmetica. Per esempio:

TimeSpan varTime = (DateTime)varFinish - (DateTime)varValue; 
double fractionalMinutes = varTime.TotalMinutes;
int wholeMinutes = (int)fractionalMinutes;

3

Hai solo bisogno di interrogare la TotalMinutesproprietà in questo modovarTime.TotalMinutes


1

Se la differenza tra endTime e startTime è maggiore o uguale a 60 minuti , l'istruzione: endTime.Subtract(startTime).Minutes;restituirà sempre (minutesDifference % 60). Ovviamente cosa non desiderata quando si parla solo di minuti (non di ore qui).
Ecco alcuni dei modi se vuoi ottenere total number of minutes(in diversi typecast):

// Default value that is returned is of type *double* 
double double_minutes = endTime.Subtract(startTime).TotalMinutes; 
int integer_minutes = (int)endTime.Subtract(startTime).TotalMinutes; 
long long_minutes = (long)endTime.Subtract(startTime).TotalMinutes; 
string string_minutes = (string)endTime.Subtract(startTime).TotalMinutes; 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.