Calculando quantos minutos existem entre duas vezes


86

Eu tenho um datagridview em meu aplicativo que contém os horários de início e término. Quero calcular o número de minutos entre essas duas vezes. Até agora eu tenho:

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

Mas a última linha não compila porque diz que estou usando argumentos inválidos para o construtor Timespan. Eu pesquisei um pouco sobre como calcular o número de minutos entre duas vezes, mas estou batendo em uma parede de tijolos. Alguém pode me aconselhar sobre a melhor forma de atingir meu objetivo.

EDITAR/

Agora meu código é o seguinte:

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

Mas estou recebendo um elenco inválido na segunda linha. Tanto varFinish quanto varValue são tempos, por exemplo, 10:00 e 8:00 dizem. Então, não tenho certeza por que eles não convertem para o tipo DateTime?


Se varFinish for uma string, você não pode converter uma string para um DateTime. Você precisa usar DateTime.Parse (...). Mesmo assim, isso implicará na data de hoje se não houver data em varFinish.
Jim

Respostas:


160

Tente isto

DateTime startTime = varValue
DateTime endTime = varTime

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

Edit: Se você está tentando 'span.Minutes', isso retornará apenas os minutos do intervalo de tempo [0 ~ 59], para retornar a soma de todos os minutos deste intervalo, basta usar 'span.TotalMinutes'.


2
Esta é uma boa resposta, mas dá 0 no intervalo. Minutos quando a diferença entre dois tempos é maior que 1 hora (ou seja, 60 minutos ou mais)
Asif Mehmood

6
@MalikAsif. Eu tentei fazer isso com um intervalo de 61 minutos e tenho 1 hora e 1 minuto, conforme o esperado. Se o intervalo fosse de exatamente 60 minutos, então sim, os minutos seriam zero. Você estava pensando TotalMinutes()?
Jim

17
NÃO É VERDADE. span.Minutesretorna um número [0..59]. Use em seu span.TotalMinuteslugar
Sten Petrov

2
Esta não deve ser a resposta aceita. De acordo com os outros comentários, isso não resolve a questão corretamente.
tjmoore

2
@tjmoore obrigado pelo feedback, concordo com você. Eu respondi à pergunta original em janeiro de 2012, após o qual a pergunta foi editada. Ocasionalmente recebo votos negativos para esta resposta, provavelmente porque a maioria das pessoas está lendo a resposta 5 anos depois que a pergunta original não editada foi feita.
Kane

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

TimeSpan.TotalMinutes : o número total de minutos representado por esta instância.


2
Sim TotalMinutes é o que eu estava procurando. Muito obrigado ^ _ ^
Wahid Bitar

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

9

Em seu código de pergunta, você está usando TimeSpan.FromMinutesincorretamente. Consulte a documentação do MSDN para TimeSpan.FromMinutes, que fornece a seguinte assinatura de método:

public static TimeSpan FromMinutes(double value)

portanto, o código a seguir não compilará

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

Em vez disso, você pode usar a propriedade TimeSpan.TotalMinutes para realizar essa aritmética. Por exemplo:

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

3

Você só precisa consultar a TotalMinutespropriedade assimvarTime.TotalMinutes


1

Se a diferença entre endTime e startTime for maior ou igual a 60 Minutos , a instrução: endTime.Subtract(startTime).Minutes;sempre retornará (minutesDifference % 60). Obviamente, o que não é desejado quando falamos apenas de minutos (não de horas aqui).
Aqui estão algumas das maneiras se você deseja obter total number of minutes(em diferentes typecasts):

// 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; 
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.