Obliczanie, ile minut jest między dwoma czasami


86

W mojej aplikacji mam datagridview, który zawiera czasy rozpoczęcia i zakończenia. Chcę obliczyć liczbę minut między tymi dwoma czasami. Do tej pory mam:

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

Ale ostatnia linia nie zostanie skompilowana, ponieważ mówi, że używam nieprawidłowych argumentów dla konstruktora Timespan. Sporo badałem, jak obliczyć liczbę minut między dwoma czasami, ale uderzam w kawałek ceglanej ściany. Czy ktoś może mi doradzić, jak najlepiej osiągnąć mój cel.

EDYTOWAĆ/

Teraz mój kod wygląda następująco:

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

Ale dostaję nieprawidłową obsadę na drugiej linii. Zarówno varFinish, jak i varValue to czasy, np. 10:00 i 8:00 say. Więc nie wiesz, dlaczego nie będą rzutować na typ DateTime?


Jeśli varFinish jest ciągiem, nie można rzutować ciągu na DateTime. Musisz użyć DateTime.Parse (...). Nawet wtedy będzie to oznaczać dzisiejszą datę, jeśli nie ma daty w varFinish.
Jim

Odpowiedzi:


160

Spróbuj tego

DateTime startTime = varValue
DateTime endTime = varTime

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

Edycja: Jeśli próbujesz „span.Minutes”, zwróci to tylko minuty z przedziału czasu [0 ~ 59], aby zwrócić sumę wszystkich minut z tego przedziału, po prostu użyj „span.TotalMinutes”.


2
To dobra odpowiedź, ale daje 0 na rozpiętości. Minuty, gdy różnica między dwoma czasami jest większa niż 1 godzina (tj. 60 minut lub więcej)
Asif Mehmood

6
@MalikAsif. Właśnie spróbowałem tego z okresem 61 minut i otrzymałem 1 godzinę i 1 minutę, zgodnie z oczekiwaniami. Gdyby rozpiętość wynosiła dokładnie 60 minut, to tak, minuty byłyby zerowe. Czy myślałeś o tym TotalMinutes()?
Jim

17
NIE PRAWDA. span.Minuteszwraca liczbę [0..59]. Użyj span.TotalMinuteszamiast tego
Sten Petrov

2
To nie powinna być akceptowana odpowiedź. Zgodnie z innymi komentarzami nie rozwiązuje to poprawnie pytania.
tjmoore

2
@tjmoore dzięki za informację zwrotną, zgadzam się z tobą. Odpowiedziałem na oryginalne pytanie w styczniu 2012 r., Po czym pytanie zostało zredagowane. Czasami otrzymuję głosy przeciw tej odpowiedzi, prawdopodobnie dlatego, że większość ludzi czyta odpowiedź 5 lat po zadaniu pierwotnego, nieedytowanego pytania.
Kane

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

TimeSpan.TotalMinutes : łączna liczba minut reprezentowana przez to wystąpienie.


2
Tak, TotalMinutes jest tym, czego szukałem. Bardzo dziękuję ^ _ ^
Wahid Bitar

int minutesRounded = (int) Math.Round (minuty);
Sagi,

9

W swoim kodzie zapytania używasz TimeSpan.FromMinutesnieprawidłowo. Zobacz dokumentację MSDN dotyczącą TimeSpan.FromMinutes, która zawiera następującą sygnaturę metody:

public static TimeSpan FromMinutes(double value)

w związku z tym następujący kod nie zostanie skompilowany

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

Zamiast tego do wykonania tej arytmetyki można użyć właściwości TimeSpan.TotalMinutes . Na przykład:

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


1

Jeśli różnica między endTime i startTime jest większa lub równa 60 minut , instrukcja: endTime.Subtract(startTime).Minutes;zawsze zwróci (minutesDifference % 60). Oczywiście nie jest to pożądane, gdy mówimy tylko o minutach (a nie o godzinach).
Oto kilka sposobów, jeśli chcesz uzyskać total number of minutes(w różnych typach):

// 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; 
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.