Para calcular correctamente la diferencia completa entre dos intervalos de tiempo/fecha siempre se deben usar las propiedades que empiezan con el prefijo Total****, por que las propiedades que NO empiezan por Total**** lo que hacen es devolver el valor relativo al día (TimeSpan.Days), y esto causaría la obtención de valores incorrectos si intentasemos evaluar lapsos de más de 24 horas.
Esto es un ejemplo, fíjate en la diferencia:
...Esto lo comento por tener en cuenta el supuesto caso en el que el cliente estacionase su vehículo durante más de un día.
Teniendo esta Class para idear y personalizar la lógica de tu algoritmo:
Puedes utilizarlo de las siguientes maneras (esto son solo unos ejemplos para demostrar los resultados obtenidos)
Resultado de ejecución:
Saludos
Esto es un ejemplo, fíjate en la diferencia:
Código
Dim timeDiff As TimeSpan = (TimeSpan.FromDays(2) - TimeSpan.FromDays(1)) ' 1 día de diferencia inicial. MsgBox(timeDiff.Hours) ' Valor: "0", puesto que es la hora Cero del dia Uno. MsgBox(timeDiff.Add(TimeSpan.FromHours(1)).Hours) ' Valor: "1", puesto que es la hora Uno del dia Uno. MsgBox(timeDiff.TotalHours) ' Valor: "24", puesto que hay 24 horas de diferencia entre día Uno y día Dos. MsgBox(timeDiff.Add(TimeSpan.FromHours(1)).TotalHours) ' Valor: "25", puesto que le añadí 1 hora a las 24 horas de diferencia.
...Esto lo comento por tener en cuenta el supuesto caso en el que el cliente estacionase su vehículo durante más de un día.
Teniendo esta Class para idear y personalizar la lógica de tu algoritmo:
Código
Public NotInheritable Class DateUtils ''' <summary> ''' Prevents a default instance of the <see cref="DateUtils"/> class from being created. ''' </summary> <DebuggerNonUserCode> Private Sub New() End Sub <DebuggerStepThrough> Public Shared Function CalculateMoney(ByVal timeIn As TimeSpan, ByVal timeOut As TimeSpan, Optional ByVal x1HourMoney As Double = 500.0F, Optional ByVal x15MinMoneyAfter1Hour As Double = 150.0F) As Double Dim timeDiff As TimeSpan = (timeOut - timeIn) Select Case (timeDiff.TotalMinutes) Case Is <= 0.0R Return 0.0R Case Is <= 60.0R Return (x1HourMoney) Case Else Dim fractions As Double = Math.Ceiling((timeDiff.TotalMinutes - 60.0R) / 15.0R) Dim supplement As Double = (fractions * x15MinMoneyAfter1Hour) Return (x1HourMoney + supplement) End Select End Function <DebuggerStepThrough> Public Shared Function CalculateMoney(ByVal dateIn As Date, ByVal dateOut As Date, Optional ByVal x1HourMoney As Double = 500.0F, Optional ByVal x15MinMoneyAfter1Hour As Double = 150.0F) As Double Return DateUtils.CalculateMoney(TimeSpan.FromTicks(dateIn.Ticks), TimeSpan.FromTicks(dateOut.Ticks), x1HourMoney, x15MinMoneyAfter1Hour) End Function End Class
Puedes utilizarlo de las siguientes maneras (esto son solo unos ejemplos para demostrar los resultados obtenidos)
Código
Public NotInheritable Class Form1 : Inherits Form Private Sub Form1_Shown(ByVal sender As Object, ByVal e As EventArgs) _ Handles MyBase.Shown Dim datePairs As New List(Of KeyValuePair(Of Date, Date)) From { New KeyValuePair(Of Date, Date)(Date.Parse("12:00"), Date.Parse("12:01")), New KeyValuePair(Of Date, Date)(Date.Parse("12:00"), Date.Parse("12:15")), New KeyValuePair(Of Date, Date)(Date.Parse("12:00"), Date.Parse("13:00")), New KeyValuePair(Of Date, Date)(Date.Parse("12:00"), Date.Parse("13:01")), New KeyValuePair(Of Date, Date)(Date.Parse("12:00"), Date.Parse("13:15")), New KeyValuePair(Of Date, Date)(Date.Parse("12:00"), Date.Parse("13:30")), New KeyValuePair(Of Date, Date)(Date.Parse("12:00"), Date.Parse("13:31")), New KeyValuePair(Of Date, Date)(Date.Parse("12:00"), Date.Parse("14:00")) } For Each datePair As KeyValuePair(Of Date, Date) In datePairs Dim sb As New StringBuilder With sb .AppendLine(String.Format("Time In : {0}", datePair.Key.ToString("hh\:mm"))) .AppendLine(String.Format("Time Out : {0}", datePair.Value.ToString("hh\:mm"))) .AppendLine(String.Format("Time Diff: {0}", (datePair.Value - datePair.Key).ToString("%h\h\:%m\m"))) .AppendLine(String.Format(CultureInfo.GetCultureInfo("en-US").NumberFormat, "Payment : ${0:n0}", DateUtils.CalculateMoney(datePair.Key, datePair.Value))) End With Console.WriteLine(sb.ToString) Next End Sub End Class
Código
Private Sub Form1_Shown(ByVal sender As Object, ByVal e As EventArgs) _ Handles MyBase.Shown Dim timePairs As New List(Of KeyValuePair(Of TimeSpan, TimeSpan)) From { New KeyValuePair(Of TimeSpan, TimeSpan)(TimeSpan.FromHours(12.0), TimeSpan.FromHours(12.02)), New KeyValuePair(Of TimeSpan, TimeSpan)(TimeSpan.FromHours(12.0), TimeSpan.FromHours(12.25)), New KeyValuePair(Of TimeSpan, TimeSpan)(TimeSpan.FromHours(12.0), TimeSpan.FromHours(13.0)), New KeyValuePair(Of TimeSpan, TimeSpan)(TimeSpan.FromHours(12.0), TimeSpan.FromHours(13.02)), New KeyValuePair(Of TimeSpan, TimeSpan)(TimeSpan.FromHours(12.0), TimeSpan.FromHours(13.25)), New KeyValuePair(Of TimeSpan, TimeSpan)(TimeSpan.FromHours(12.0), TimeSpan.FromHours(13.5)), New KeyValuePair(Of TimeSpan, TimeSpan)(TimeSpan.FromHours(12.0), TimeSpan.FromHours(13.52)), New KeyValuePair(Of TimeSpan, TimeSpan)(TimeSpan.FromHours(12.0), TimeSpan.FromHours(14.0)) } For Each timePair As KeyValuePair(Of TimeSpan, TimeSpan) In timePairs Dim sb As New StringBuilder With sb .AppendLine(String.Format("Time In : {0}", timePair.Key.ToString("hh\:mm"))) .AppendLine(String.Format("Time Out : {0}", timePair.Value.ToString("hh\:mm"))) .AppendLine(String.Format("Time Diff: {0}", (timePair.Value - timePair.Key).ToString("%h\h\:%m\m"))) .AppendLine(String.Format(CultureInfo.GetCultureInfo("en-US").NumberFormat, "Payment : ${0:n0}", DateUtils.CalculateMoney(timePair.Key, timePair.Value))) End With Console.WriteLine(sb.ToString) Next End Sub End Class
Resultado de ejecución:
Saludos
Muchas gracias por responder Eleкtro se nota que te manejas en el tema pero no entiendo tu codigo para hacerlo correr vb net podrias explicarme por favor soy novato
me gusto eso de las 24horas como dices tu si el auto esta estacionado mas tiempo genial la idea
esta viendo las salida de tu ejemplo
por ejemplo 12:00 salio 13:01 eso es una hora y un minutos tu resultado sale $650
debiria ser $500
pero son 12:00 salio 13:15 eso es una hora y quince minutos deberia cobra $650