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 ;

reggie
fuente
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.

Hans Olsson
fuente
197

es posible que también desee mirar

var hours = (datevalue1 - datevalue2).TotalHours;
MarkKGreenway
fuente
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
safi
fuente
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.

Ilya Kogan
fuente
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 ) 
{ 
... 
} 
Mario Levesque
fuente
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

smurtagh
fuente
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)
Balachandar Palanisamy
fuente
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.

Clavo oxidado
fuente