Clculos con tiempo

Hola, soy bastante nuevo en esto y gracias a ir leyendo voy haciendo algo, pero ahora tengo un problema y no consigo resolverlo, he de realizar clculos con tiempos, y no me aclaro, os explico lo que que tengo que hacer.

He de calcular el tiempo invertido por un grupo de personas, ejemplo una actividad que dura 1:30h y participan 4 personas el total debera ser de 6h.
Tambin necesito calcular el tiempo de la siguiente manera, una actividad si inicia a las 22:45 y termina a las 02:15 como calculo el tiempo que ha pasado.

Lo siento pero no me aclaro, los datos los tengo en un textbox con la siguiente mask ##:##, luego iran a una BD en SQLite.

Gracias por su ayuda.

para calculos de tiempo use Date y DateInterval.

Use Timer para chequear si ha pasado X tiempo. Busque en ejemplos cmo usar.

sera bueno un pantallazo con las entradas y otro con las salidas o cmo debera ser, para que le puedan ayudar.

Subo el pantallazo para que se hagan una idea. y un cdigo bsico para que vean la idea.

Esta en DropBox, espero que puedan acceder.

https://www.dropbox.com/sh/7co4q1k7fk1hk89/AABU_Y_VzJYUHw8ITqU_q1Rla?dl=0

Normalmente en aplicaciones de este tipo tambin se considera la fecha, as se tiene un mejor registro de los eventos.

En tu ejemplo slo se pone la hora. Como he visto en programacin existen varias formas de hacer las cosas. Puedes convertir los valores a minutos, hacer la comparacin, en caso de que los minutos al terminar sean menores le sumas un da para el clculo y regresas el valor a horas:minutos.

O pudes usar el xojo.core.date para asignar las horas/minutos a un da de referencia y hacer el clculo de igual forma. Si es menor, entonces hacer la referencia a un da siguiente. Con el DateInterval puedes obtener los minutos de diferencia o algunos otros valores que necesitas.

Estoy aprendiendo Xojo tambin. Voy a usar tu ejemplo para practicar y ver de aplicar estas 2 ideas. Algunas cosas interesantes, con el mask que tienes en las horas de inicio/fin, no se pueden poner horas de 1 dgito, es decir 1:15 por ejemplo, tiene que ser 01:15, sin embargo si se pueden dejar los minutos con 1 dgitos, es decir, 01:1, entonces hay que poner alguna validacin para que revise que los nmeros estn completos y dentro de rango (0 a 24 y 0 a 59, tambin revisar que no se ponga 24:35 por ejemplo).

Saludos

pruebe este cdigo en pbCalculo.Action:

[code]Sub Action() Handles Action
// ValidateFields
Dim h1 As Integer= Integer.Parse(NthField(txtHinicio.Text, “:”, 1).ToText)
Dim m1 As Integer= Integer.Parse(NthField(txtHinicio.Text, “:”, 2).ToText)
Dim h2 As Integer= Integer.Parse(NthField(txtHFinal.Text, “:”, 1).ToText)
Dim m2 As Integer= Integer.Parse(NthField(txtHFinal.Text, “:”, 2).ToText)

Dim d1 As New Xojo.Core.Date(Xojo.Core.Date.Now.Year, Xojo.Core.Date.Now.Month, Xojo.Core.Date.Now.Day, _
h1, m1, 0, 0, Xojo.Core.TimeZone.Current)
Dim d2 As New Xojo.Core.Date(Xojo.Core.Date.Now.Year, Xojo.Core.Date.Now.Month, Xojo.Core.Date.Now.Day, _
h2, m2, 0, 0, Xojo.Core.TimeZone.Current)

If d1.SecondsFrom1970> d2.SecondsFrom1970 Then
MsgBox “Error, hora final es menor que hora inicial”
Self.Focus= txtHFinal
Return
End If

// calc total tiempo
Dim interval As Xojo.Core.DateInterval= d2- d1

txtTotalTiempo.Text= “”
If interval.Days> 0 Then txtTotalTiempo.AppendText Format(interval.Days, “00”)
If txtTotalTiempo.Text<> “” Then txtTotalTiempo.AppendText “:”
If interval.Hours> 0 Then
txtTotalTiempo.AppendText Format(interval.Hours, “00”)
Else
txtTotalTiempo.AppendText “00”
End If
txtTotalTiempo.AppendText “:”
If interval.Minutes> 0 Then
txtTotalTiempo.AppendText Format(interval.Minutes, “00”)
Else
txtTotalTiempo.AppendText “00”
End If

// calc total grupo
Dim tSecs As Double= (d2.SecondsFrom1970- d1.SecondsFrom1970)* Integer.Parse(txtVoluntarios.Text.ToText)
Dim d3 As New Xojo.Core.Date(d1.SecondsFrom1970+ tSecs, Xojo.Core.TimeZone.Current)

interval= d3- d1

txtTotalGrupo.Text= “”
If interval.Days> 0 Then txtTotalGrupo.AppendText Format(interval.Days, “00”)
If txtTotalGrupo.Text<> “” Then txtTotalGrupo.AppendText “:”
If interval.Hours> 0 Then
txtTotalGrupo.AppendText Format(interval.Hours, “00”)
Else
txtTotalGrupo.AppendText “00”
End If
txtTotalGrupo.AppendText “:”
If interval.Minutes> 0 Then
txtTotalGrupo.AppendText Format(interval.Minutes, “00”)
Else
txtTotalGrupo.AppendText “00”
End If
End Sub
[/code]

Juan Ramn, este es el cdigo que obtuve para convertir de hh:mm en el campo inicial y final. Este considera que las entradas son correctas (no tiene validacin), slo le puse una pequea validacin en el nmero de voluntarios pero tu ejemplo no tiene mask, por lo que se puede poner letras y no slo nmeros, yo le pondra mask 9 o 99 para que slo se puedan poner nmeros del 0 al 9 o del 0 al 99.

[code]Sub Action() Handles Action
Dim mit As Integer // minutos iniciales totales
Dim mft As integer // minutos finales totales
Dim mtt As Integer // minutos tiempo total
Dim hrt As Integer // horas resultado total
Dim mrt As integer // minutos resultado total

// suponiendo que el capturista pone los valores correctos

mit = val(left(txtHinicio.Text,2))*60+val(right(txtHinicio.Text,2))
mft = val(left(txtHFinal.Text,2))*60+val(right(txtHFinal.Text,2))

// si el tiempo final es menor a tiempo inicial, significa que el horario pas la media noche
If mft < mit Then mft = 1440+mft

// calculando los minutos totales entre inicio y fin
mtt = mft - mit

mrt = mtt mod 60 // calculando los minutos para txtTotalTiempo
hrt = mtt / 60 // calculando las horas para txtTotalTiempo

txtTotalTiempo.Text = hrt.ToText + “:” + format(mrt,“00”).ToText

// calculando el nmero de voluntarios para txtTotalGrupo
if val(txtVoluntarios.Text) > 0 Then
Dim nv As Integer = val(txtVoluntarios.Text)
Dim gtt As integer = nv*mtt
Dim hgt As Integer = gtt/60
Dim mgt As Integer = gtt mod 60
txtTotalGrupo.Text = hgt.ToText + “:” + format(mgt,“00”).ToText
Else
txtTotalGrupo.Text = “NoVoluntarios”
End if
End Sub
[/code]

Recuerda que yo soy novato. De hecho no saba del Integer.Parse que us Bernardo as como el self.focus, .AppendText y yo he usado el Date clsico y apenas voy a practicar con el Xojo.Core.Date.

Tal vez no deb usar val() y es mejor usar Integer.Parse. Veo que se puede usar txtHInicio.Text.ToText.Left(2) en lugar de left(txtHInicio.Text,2) pero no se cual sea mejor.

En fin, es una idea para que veas que hay diferentes formas de llegar al mismo resultado. Mi cdigo no divide horas en das, slo horas y minutos, tanto para el tiempo de la actividad como el clculo con voluntarios. Lo que si contempla es iniciar un da y terminar al siguiente siempre y cuando la hora final sea menor a la hora inicial (jornadas de menos de 24 horas). Si necesitas calcular ms de 24 horas necesitas contemplar la fecha tambin en tus capturas.

Gracias Bernardo por tu cdigo. Estaba pensando cmo trabajar con el ejemplo de Juan Ramn usando Xojo.Core.Date.

Para poder usar tiempos de inicio tarde en el da y que el tiempo final sea temprano en la maana siguiente, cambi el cdigo de:

[code] Dim d1 As New Xojo.Core.Date(Xojo.Core.Date.Now.Year, Xojo.Core.Date.Now.Month, Xojo.Core.Date.Now.Day, _
h1, m1, 0, 0, Xojo.Core.TimeZone.Current)
Dim d2 As New Xojo.Core.Date(Xojo.Core.Date.Now.Year, Xojo.Core.Date.Now.Month, Xojo.Core.Date.Now.Day, _
h2, m2, 0, 0, Xojo.Core.TimeZone.Current)

If d1.SecondsFrom1970> d2.SecondsFrom1970 Then
MsgBox “Error, hora final es menor que hora inicial”
Self.Focus= txtHFinal
Return
End If[/code]
a

[code]Dim d1 As New Xojo.Core.Date(2017, 1, 1, h1, m1, 0, 0, Xojo.Core.TimeZone.Current)
Dim d2 As New Xojo.Core.Date(2017, 1, 1, h2, m2, 0, 0, Xojo.Core.TimeZone.Current)

If d1.SecondsFrom1970> d2.SecondsFrom1970 Then
Dim nextDay As New Xojo.Core.DateInterval
nextDay.Days = 1
d2 = d2 + nextDay
End If[/code]

La fecha 2017, 1, 1 slo la uso como referencia y para el llenado de Xojo.Core.Date. No tengo prctica con este tipo de fecha y lo que pude usar para agregarle un da a la fecha y as poder restar 02:15 (sera del da siguiente) menos 22:45 (del primer da), fue usar otra variable DateInterval. Me imagino que, como todo, existe otra forma de hacerlo.

Saludos

Gracias por su ayuda, con ella he podido resolver el problema.