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 ;


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.


197

você também pode querer olhar

var hours = (datevalue1 - datevalue2).TotalHours;

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

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.


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 ) 
{ 
... 
} 

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


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)

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.

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.