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.