Mostrando la diferencia entre dos valores de fecha y hora en horas


186

Estoy recuperando dos valores de fecha y hora de la base de datos. Una vez que se recupera el valor, necesito la diferencia entre los dos valores. Para eso, creo una variable de intervalo de tiempo para almacenar la diferencia de los 2 valores de fecha.

TimeSpan? variable = datevalue1 - datevalue2;

Ahora necesito mostrar la diferencia que se almacena en la variable Timespan en términos de número de horas. Me referí a TimeSpan.TotalHours pero no pude aplicar lo mismo por alguna razón. ¿Cómo puedo hacer eso? Estoy usando C # en un proyecto MVC. ¿Simplemente necesito mostrar el valor de diferencia en horas?

EDITAR: Dado que el intervalo de tiempo era anulable, no pude usar la propiedad de horas totales. Ahora puedo usarlo haciendo TimeSpanVal.Value.TotalHours ;


3
¿Por qué no podrías usar TimeSpan.TotalHours?
Fredrik Mörk

No me lo permite. Lo intenté. :(
reggie

¿Es porque mi intervalo de tiempo es anulable que no puedo usar la propiedad totalhours?
Reggie

44
Ver ejemplo de diferencia de fecha y hora, diferencia de horas, diferencia de minutos en codegateway.com/2012/01/c-datetime-difference.html

el objeto TimeSpan tiene un total de horas en.Value.TotalHours
smurtagh

Respuestas:


119

Creo que estás confundido porque no has declarado un TimeSpanhas declarado un TimeSpan?que es anulable TimeSpan . Elimine el signo de interrogación si no necesita que sea anulable o use variable.Value.TotalHours.


197

es posible que también desee mirar

var hours = (datevalue1 - datevalue2).TotalHours;

pero en este caso, el sistema muestra "'System.Nullable <System.TimeSpan>' no contiene una definición para 'TotalHours' y ningún método de extensión 'TotalHours' que acepte un primer argumento del tipo 'System.Nullable <System.TimeSpan>' podría ser encontrado ". ¿Me puede decir el motivo?
Neha

8
Nullable necesitaría un .Value.TotalHours en lugar de solo .TotalHours. Es un factor de la envoltura anulable. Alternativamente, puede emitirlo como un intervalo de tiempo -> ((TimeSpan) (nullabledatevalue1
nullabledatevalue2

90

En la muestra, estamos creando dos objetos de fecha y hora, uno con la hora actual y otro con 75 segundos agregados a la hora actual. Luego llamaremos al método .Subtract () en el segundo objeto DateTime. Esto devolverá un objeto TimeSpan. Una vez que obtenemos el objeto TimeSpan, podemos usar las propiedades de TimeSpan para obtener las horas, minutos y segundos reales.

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
Desea utilizar "Total" como TotalSeconds, TotalMinutesetc.
Filip Ekberg

38

¿Hay alguna razón que estás usando Nullable?

Si quieres usar Nullable, puedes escribir variable.Value.TotalHours.

O simplemente puede escribir: (datevalue1 - datevalue2).TotalHours.


Probablemente porque datevalue1 o datevalue2 sonDateTime?
Filip Ekberg

@Filip, está bien, deberían estarlo DateTime. En .NET, DateTime - DateTime = TimeSpan.
Ilya Kogan

1
@Illya, quiero decir que probablemente lo sean Nullable<DateTime>y, por lo tanto, obtienes un Nullable<TimeSpan>.
Filip Ekberg

Tu respuesta es realmente efectiva. Lo estaba buscando
gdmanandamohon

7

Aquí hay otro ejemplo de restar dos fechas en C # ...

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

3

Una forma más precisa para las horas pagadas de los empleados u otro requisito de precisión :

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)

También puede agregar diferencia entre las fechas si comparamos dos fechas diferentes

new TimeSpan(24 * days, 0, 0)

0

WOW, tengo que decir: que sea simple:

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

Result: True

y:

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

Result: 10.00:00:00

El objeto DateTime tiene toda la lógica integrada para manejar el resultado booleano.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.