Mostrando diferença entre dois valores de data e hora em horas

186

Estou recuperando dois valores de data e hora do banco de dados. Depois que o valor é recuperado, preciso da diferença entre os dois valores. Para isso, crio uma variável de período para armazenar a diferença dos 2 valores de data.

TimeSpan? variable = datevalue1 - datevalue2;

Agora eu preciso mostrar a diferença que é armazenada na variável Timespan em termos de número de horas. I referido TimeSpan.TotalHours mas não poderia aplicar o mesmo por algum motivo. Como faço isso? Estou usando c # em um projeto MVC. Eu simplesmente preciso mostrar o valor da diferença em horas?

EDIT: Como o período de tempo era anulável, não era possível usar a propriedade total de horas. Agora eu posso usá-lo fazendo TimeSpanVal.Value.TotalHours ;

reggie
fonte
3
Por que você não pode usar TimeSpan.TotalHours?
Fredrik Mörk
isso não me permite. eu tentei. :(
reggie
é porque meu período de tempo é anulável que não posso usar a propriedade totalhours?
9119 Reggie
4
Veja exemplo de diferença de data e hora, diferença de horas e minutos em codegateway.com/2012/01/c-datetime-difference.html
o objeto TimeSpan tem o total de horas em.Value.TotalHours
smurtagh

Respostas:

119

Acho que você está confuso porque não declarou um TimeSpanque declarou um TimeSpan?que é anulável TimeSpan . Remova o ponto de interrogação se você não precisar que seja nulo ou use variable.Value.TotalHours.

Hans Olsson
fonte
197

você também pode querer olhar

var hours = (datevalue1 - datevalue2).TotalHours;
MarkKGreenway
fonte
mas, nesse caso, o sistema mostra "'System.Nullable <System.TimeSpan>' não contém uma definição para 'TotalHours' e nenhum método de extensão 'TotalHours' que aceita um primeiro argumento do tipo 'System.Nullable <System.TimeSpan>' poderia ser encontrado ". Você pode me dizer o motivo disso?
Neha
8
Nullable precisaria de um .Value.TotalHours em vez de apenas .TotalHours. É um fator do empacotamento anulável. Você pode alternativamente lançá-lo como um período de tempo -> ((TimeSpan) (nullabledatevalue1 - nullabledatevalue2)) totalhours.
MarkKGreenway
90

No exemplo, estamos criando dois objetos de data e hora, um com horário atual e outro com 75 segundos adicionados ao horário atual. Em seguida, chamaremos o método .Subtract () no segundo objeto DateTime. Isso retornará um objeto TimeSpan. Depois de obter o objeto TimeSpan, podemos usar as propriedades do TimeSpan para obter as horas, minutos e segundos reais.

DateTime startTime = DateTime.Now;

 DateTime endTime = DateTime.Now.AddSeconds( 75 );

 TimeSpan span = endTime.Subtract ( startTime );
 Console.WriteLine( "Time Difference (seconds): " + span.Seconds );
 Console.WriteLine( "Time Difference (minutes): " + span.Minutes );
 Console.WriteLine( "Time Difference (hours): " + span.Hours );
 Console.WriteLine( "Time Difference (days): " + span.Days );

Resultado:

Time Difference (seconds): 15
Time Difference (minutes): 1
Time Difference (hours): 0
Time Difference (days): 0
safi
fonte
30
Você quer usar "Total", como TotalSeconds, TotalMinutesetc
Filip Ekberg
38

Existe algum motivo para você estar usando Nullable?

Se você quiser usar Nullable, pode escrever variable.Value.TotalHours.

Ou você pode simplesmente escrever: (datevalue1 - datevalue2).TotalHours.

Ilya Kogan
fonte
Provavelmente porque datevalue1 ou datevalue2 sãoDateTime?
Filip Ekberg
@ Filip, está tudo bem, eles deveriam estar DateTime. No .NET DateTime - DateTime = TimeSpan,.
Ilya Kogan
1
@Illya, quero dizer que eles são provavelmente Nullable<DateTime>e, portanto, você recebe um Nullable<TimeSpan>.
Filip Ekberg
Sua resposta é realmente eficaz. Eu estava procurando por isso.
Gdmanandamohon
7

Aqui está outro exemplo de subtração de duas datas em C # ...

if ( DateTime.Now.Subtract(Convert.ToDateTime(objDateValueFromDatabase.CreatedOn)).TotalHours > 24 ) 
{ 
... 
} 
Mario Levesque
fonte
3

uma maneira mais precisa de horas pagas por funcionário ou outro requisito de precisão :

decimal DeterminePreciseHours(DateTime startTimestamp, DateTime stopTimestamp)
{
    var span = (stopTimestamp - startTimestamp).Value;
    decimal total = (decimal)span.TotalMilliseconds / 60 / 60 / 1000;
    return Math.Round(total, PRECISION_CONSTANT);
}

https://dotnetfiddle.net/tVIoVJ

smurtagh
fonte
1
var startTime = new TimeSpan(6, 0, 0); // 6:00 AM
var endTime = new TimeSpan(5, 30, 0); // 5:30 AM 
var hours24 = new TimeSpan(24, 0, 0);
var difference = endTime.Subtract(startTime); // (-00:30:00)
difference = (difference.Duration() != difference) ? hours24.Subtract(difference.Duration()) : difference; // (23:30:00)

também podemos adicionar diferença entre as datas se compararmos duas datas diferentes

new TimeSpan(24 * days, 0, 0)
Balachandar Palanisamy
fonte
0

WOW, eu tenho que dizer: seja simples:

MessageBox.Show("Result: " + (DateTime.Now.AddDays(10) > DateTime.Now));

Result: True

e:

MessageBox.Show("Result: " + DateTime.Now.AddDays(10).Subtract(DateTime.Now));

Result: 10.00:00:00

O objeto DateTime possui toda a lógica interna para manipular o resultado booleano.

Rusty Nail
fonte