Visual Basic.NET - Restar horas

 
Vista:
sin imagen de perfil

Restar horas

Publicado por Kenneth (15 intervenciones) el 20/10/2021 22:31:50
Como puedo restar un datetimenow con un textbox que igual sera una fecha?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

Restar horas

Publicado por Rey (3 intervenciones) el 21/10/2021 03:53:54
Creo q pudieras convertir el valor del textbox asigmandolo a una varianble de tipo datatime
Y luego cn los dos datatimes si puedes operar.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Restar horas

Publicado por Kenneth (15 intervenciones) el 21/10/2021 06:53:19
Podrias decirme como? la verdad no se mucho lo que quiero es restar Hora actual- Cualquier hora que yo ponga en el Textbox
Ejemplo Hora actual: 22:50:00 - 22:40:00 (Esto del Textbox) = 00:10:00 He intentado de mil maneras y no lo he logrado.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Restar horas

Publicado por Kenneth (15 intervenciones) el 21/10/2021 06:54:37
Podrias decirme como? la verdad no se mucho lo que quiero es restar Hora actual- Cualquier hora que yo ponga en el Textbox
Ejemplo Hora actual: 22:50:00 - 22:40:00 (Esto del Textbox) = 00:10:00 He intentado de mil maneras y no lo he logrado.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Phil Rob
Val: 3.353
Oro
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Restar horas

Publicado por Phil Rob (1554 intervenciones) el 21/10/2021 07:59:25
Hola,


" ... la verdad no se mucho lo que quiero ... " : Es difícil decirlo por ti.

Mira este código :

1
2
3
4
Dim D1 As Date = "22:50:00"
        Dim D2 As Date = "22:40:00"
        Dim Diferencia As Integer = DateAndTime.DateDiff(DateInterval.Minute, D2, D1)
        MessageBox.Show(Diferencia)

Cuando dices mas, quizá podré te dar mejor repuesta.

Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Restar horas

Publicado por Kenneth (15 intervenciones) el 21/10/2021 18:23:46
En realidad me falto la "coma".
En realidad no sé mucho, lo que quiero es...


Y si perfecto de esa manera lo he logrado hacer, el problema viene cuando quiero restar la hora actual y una hora tomada de un texbox.
La idea es que el usuario pueda poner cualquier hora en el texbox y haga la diferencia entre esa hora que puso y la hora actual y obvio que la muestre.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Phil Rob
Val: 3.353
Oro
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Restar horas

Publicado por Phil Rob (1554 intervenciones) el 21/10/2021 19:26:18
Asi, si conoces la unidad que quieres, mis códigos de esta mañana deben te gustar. Con tu ejemplo anterior solamente los minutos pueden servir.
Si no te gustan mis códigos, envía un ejemplo de la mostrada que quieres.
...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Restar horas

Publicado por Kenneth (15 intervenciones) el 21/10/2021 23:02:33
Dim D1 As Date = "22:50:00" ESTE DEBE SER Datetime.now
Dim D2 As Date = "22:40:00" Este un valor de Textbox
Dim Diferencia As Integer = DateAndTime.DateDiff(DateInterval.Minute, D2, D1)
MessageBox.Show(Diferencia)

Entiendo que de esa manera lo puedo hacer pero es desde el codigo, lo quiero hacer atravez del form de windows
Captura

COmo puedes ver en la captura, 20:50:00 Hora actual (datetime.now) - 20:40:00 ( cualquier hora que puede ser ingresada en el textbox)=00:10:00 (10 minutos que son el producto de la diferencia entre las horas

Algo como esto:
1
2
3
4
Dim D1 As Date = DateTime.Now.ToLongTimeString
        Dim D2 As Date = TxtHora.Text
        Dim Diferencia As Integer = DateAndTime.DateDiff(DateInterval.Minute, D2, D1)
        MessageBox.Show(Diferencia)

Pero me da error, dice "System.InvalidCastException: 'Conversion from string "" to type 'Date' is not valid.'"
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Phil Rob
Val: 3.353
Oro
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Restar horas

Publicado por Phil Rob (1554 intervenciones) el 22/10/2021 00:23:11
Sí, ahora comprendo este que quieres.
Miraré mañana (aquí, ahora, este la 0h20 am.
Voy dormir.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Restar horas

Publicado por Kenneth (15 intervenciones) el 22/10/2021 02:19:40
Claro más bien muchisimas gracias por la ayuda.
Que tengas una excelente noche.
Aqui apenas vamos comenzando la noche, es joven
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Phil Rob
Val: 3.353
Oro
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Restar horas

Publicado por Phil Rob (1554 intervenciones) el 22/10/2021 09:40:57
Hola,

Prueba este codigo :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
' La Function que hace el formato
   Private Function SegundosFormateadosHoras(ByVal CuantidadSegundos As Integer) As String
        Dim Resultado As String = ""
        Dim Tmp As Integer
 
        Tmp = CuantidadSegundos \ 3600             ' Calcular horas
        Resultado = String.Format("{0:D2}", Tmp) & ":"
        CuantidadSegundos -= Tmp * 3600
 
        Tmp = CuantidadSegundos \ 60               ' Calcular minutos
        Resultado &= String.Format("{0:D2}", Tmp) & ":"
        CuantidadSegundos -= Tmp * 60
 
        Tmp = CuantidadSegundos                      ' Calcular segundos
        Resultado &= String.Format("{0:D2}", Tmp)
 
        Return Resultado
 
    End Function
 
 
' Tus codigos que llaman el Function
Dim D1 As Date = DateTime.Now.ToLongTimeString
        Dim D2 As Date = TxtHora.Text
        Dim Diferencia As Integer = DateAndTime.DateDiff(DateInterval.Second, D2, D1)   ' !!! Trabajar con SECOND
        MessageBox.Show(SegundosFormateadosHoras(Diferencia))                  ' !!! Llamar la Function

Que tenga un buen día ...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Restar horas

Publicado por Kenneth (15 intervenciones) el 22/10/2021 23:25:43
Funciona perfectamente, solo que tengo que ajustar algunas cosas.
Revisa este adjunto, es lo que quiero hacer. Tocando las celdas y demas podras ver como funciona esta hecho con vba

Debe mostrar los minutos. Y debe tener en cuenta que si yo pongo una hora mayor debe mostrar los numeros en positivo y no en negativo como acá
Captura

Si la diferencia de las horas es 1:05:00, quiero poner en un label 65 minutos de diferencia y asi si la diferencia es 3:00:00 poner en un label 120 minutos y asi por ejemplo.

y en realidad los segundos no me importan solo me importan los minutos y las horas, Si me pudieras ayudar con eso seria perfecto yo agradeceria montones la ayuda.
Cuando puedas podrias explicarme un poco de como funciona la idea tambien es aprender
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Restar horas

Publicado por Kenneth (15 intervenciones) el 23/10/2021 00:08:32
Hola, ya logre sacar los minutos solamente.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Dim D1 As Date = DateTime.Now.ToLongTimeString
        On Error Resume Next
        Dim D2 As Date = TXTHORA.Text
        On Error Resume Next
        Dim Diferencia As Integer = DateAndTime.DateDiff(DateInterval.Second, D2, D1)   ' !!! Trabajar con SECOND
 
        LBRESUL.Text = (SegundosFormateadosHoras(Diferencia))
        Timer1.Enabled = True
        LBACTUAL.Text = D1
        Dim thishour = Hour((SegundosFormateadosHoras(Diferencia)))
        Dim thishour1 = Minute((SegundosFormateadosHoras(Diferencia)))
        Dim hor1 = thishour * 60
        horalabel.Text = hor1
        minutoslabel.Text = thishour1
        tiemposlabel.Text = hor1 + thishour1

Lo unico que necesito ahora es que tome en cuenta el cambio de dia y numeros en positivo

Cambio de dia :
Si la hora actual es ''00:05:00" Y yo pongo la hora 23:55:00 que me cuente solo 00:05:00 y no esto:
Captura
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Phil Rob
Val: 3.353
Oro
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Restar horas

Publicado por Phil Rob (1554 intervenciones) el 23/10/2021 00:27:35
Hola,
Miraré tus mensajes mañana pero me parece que tienes resultados negativos.
Si D2 > D1 Entonces hacer D2-D1
Si D1 > D2 entonces hacer D1-D2
Buenas noches...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Restar horas

Publicado por Kenneth (15 intervenciones) el 23/10/2021 02:38:09
Si correcto, algo asi seria, fijate en el excel con macro que hice, es algo como eso. Hay formulas en lugar de VB es lo que no sé hacer en VB

Y si podrias explicarme como funciona para aprender
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Phil Rob
Val: 3.353
Oro
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Restar horas

Publicado por Phil Rob (1554 intervenciones) el 23/10/2021 16:49:26
Hola,

He visto la hoja XLS. y no comprendo su objetivo.

Para tu problema inicial, debes me precisar :

El tiempo D2 es siempre mas grande que el tiempo mostrado en el Form ? Es correcta la afirmación siguiente ?
Si D2 es mas pequeño que D1, este es que D2 es un tiempo del día siguiente. Decimos que D2 es siempre
tarde que D1.

En esperando tu repuesta, trabajo como si esta es verdad.



...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Phil Rob
Val: 3.353
Oro
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Restar horas

Publicado por Phil Rob (1554 intervenciones) el 23/10/2021 18:02:27
Continuación ...

He trabajado como he dicho y es posible de calcular que entre 23:50:00 y 00:10:00, hay 20 minutos.
He guardado los segundos para calcular y los quito al final para la mostrada. Calculo un redondeo inferior o superior según que el resultado tiene 30'' o menos.

Adjunto mi proyecto de prueba para ti lo testar.

Por las explicaciones que pides, envias preguntas precises con mi código como base de comunicación.

Espero que este te ayudará ...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Restar horas

Publicado por Kenneth (15 intervenciones) el 24/10/2021 05:58:50
Hola, lo siento hoy tuve un dia pesado de trabajo en la estacion

Mira, esto es lo que estoy trabajando. La idea es que tendre dos de esos contadores
La hora de despacho es un TextBox, Los tiempos un Label y la Hora actual un Label

Fijate en ese, lo unico que tiene problema es que al ser las 00:05:00 (hora actual) y yo escribo en la hora de despacho (23:59) me da como resultado en Tiempos "143" Deberian de ser 6

** "Tiempos" es la forma en la que llamamos a los minutos desde la hora de despacho hasta la hora actual.
Mas bien creo que has tenido mucha paciencia conmigo y estoy seguro de que cuando yo tenga un buen nivel de conocimiento ayudare de la misma manera.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Phil Rob
Val: 3.353
Oro
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Restar horas

Publicado por Phil Rob (1554 intervenciones) el 24/10/2021 10:33:31
Hola,

Dices "... lo único que tiene problema es que al ser las 00:05:00 (hora actual) y yo escribo en la hora de despacho (23:59) me da como resultado en Tiempos "143" Deberían de ser 6 ... ". El, programa que te envío ayer da el resultado que quieres. Mira la primera imagen.
Pero, no mezclar las dos horas, este es la razón que hablo de D1 y D2. Debes saber dónde pones la hora de la cual tienes que restar y donde pones la hora que debe ser restado. En la reloj, en su rotación nórmale, hay 6 minutos entre 23:59:00 y 00:05:00. Pero en la rotación contraria, hay 23:54:00 entre 23:59:00 y 00:05:00. Mira la segunda imagen.
Así, tienes la solución en tu problema en los códigos de mi programa.

No puedo ejecutar tu código Reloj1 porqué no tiene el buena versión de FrameWork pero he lo leído rápidamente. Veo que utilizas un Timer pero no conozco su valor Interval. Debes saber que el valor Interval del Timer pode ser de 1 à 2147483647 milisegundos, hasta 595 horas. Si Interval tiene el valor 60000, entonces el evento Tick viene cada minuto. Pero Timer, no serve para hacer un reloj.
En tu procedimiento Timers1_Tick, veo códigos sin buen significado. Pero como no siempre he comprendido bien el objeto de tu programa, no puedo lo criticar.

En todos casos, para calcular correctamente el diferencia entre dos horas, este es necesario de convertir cada hora (hh:mm:ss) en un montón de segundos et restar entre los montones de segundos. Es posible (ver mis códigos) de corregir cuando tenemos el paso a otro día. El resultado también es un montón de segundos que es traduce en HH:MM:SS (o sin SS) con mi función SegundosFormateadosHoras(). También, miras en mis código como mostrar de manera separa las HH, MM y SS a partir de la cadena HH:MM:SS.

No tengo mucho tiempo hoy y mañana para trabajar con tu problema. Claro, obtendrás la solución si lees atentamente mis códigos.

" ... cuando yo tenga un buen nivel de conocimiento ayudare de la misma manera" : Muy buena idea, este es muy enriquecedor.

Que tenga un buen domingo ...

Horlo1


Horlo2
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Restar horas

Publicado por Kenneth (15 intervenciones) el 24/10/2021 16:06:18
En tu programa en "Tiempo entre ambos " Deberia mostrar "00:06:00"
Siendo D2 el día de ayer y D1 el día de hoy pero minutos después de media noche.

No sé di restándole 24 horas se arreglaría porque a tu resultado "23:54:00" le restó 24 horas y me da 00:-6:00 " que anda parecido a lo que debería mostrar.

Más bien muchas gracias por tu tiempo, cuando puedas ( solo si puedes) podrías ayudarme en eso.
Te agradezco por todo esto muchas gracias, saludos Kenneth
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Phil Rob
Val: 3.353
Oro
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Restar horas

Publicado por Phil Rob (1554 intervenciones) el 24/10/2021 17:45:36
Rápidamente con mi Smartphone, cuando obtiene -6, este es que no has corregido tus cálculos. Tienes mi programa y vees que no da resultado negativo.
Quizá hay error en los cálculos, o inversión de D1 y D2.
Empiezas con mi programa...
Buenas tardes... hasta martes...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Restar horas

Publicado por Kenneth (15 intervenciones) el 24/10/2021 21:27:53
Amigo pero yo te digo que lo que necesito es ese intervalo entre la diferencia de horas "00:06:00" no me lo muestra asi, me muestra 23:54:00 y conforme el tiempo va pasando pasa a 23:53:00, 23:52:00 y no es eso lo que necesito es el intervalo entre el tiempp entre ambos.

Necesito mostrar : Ejemplo D1(hora actual) : 00:05:00 - D2 (hora a restar) :23:59:00 =Tiempo entre ambos =00:06:00 y que cuando la hora actual sea 00:06:00 entonces sea D1(hora actual) : 00:06:00 - D2 (hora a restar) :23:59:00 =Tiempo entre ambos =00:07:00
00:07:00 entonces sea D1(hora actual) : 00:07:00 - D2 (hora a restar) :23:59:00 =Tiempo entre ambos =00:08:00
00:08:00 entonces sea D1(hora actual) : 00:08:00 - D2 (hora a restar) :23:59:00 =Tiempo entre ambos =00:09:00
00:09:00 entonces sea D1(hora actual) : 00:09:00 - D2 (hora a restar) :23:59:00 =Tiempo entre ambos =00:10:00

Yo habia usado el Timer1 en mi programacion simplemente para que el contador de DateTime.now se viera contando en tiempo real como un simple reloj.
Todo está perfecto solo que no muestra lo que quiero, necesito ese intervalo que hay entre esas dos horas

En verde: Lo que tu codigo hace
En Rojo: Lo que deseo hacer
Sin-titulo
Un saludo, creo que esta consulta te ha sacado canas verdes jajaja lo siento mucho. Prometo tener la misma paciencia
Hasta el martes, te cuidas disculpa nuevamente tanto tiempo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Phil Rob
Val: 3.353
Oro
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Restar horas

Publicado por Phil Rob (1554 intervenciones) el 26/10/2021 17:44:40
Hola,

He tenido ocupación improvista ...

Veo ahora tu, mensaje y no tengo mas tiempo hoy.

Pero, veo tus explicaciones muy precises. Lo miraré mañana.

Buenas tardes
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Restar horas

Publicado por Kenneth (15 intervenciones) el 26/10/2021 18:53:14
No te preocupes, mas bien mucha gracias por la ayuda.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Phil Rob
Val: 3.353
Oro
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Restar horas

Publicado por Phil Rob (1554 intervenciones) el 27/10/2021 08:42:46
Hola,

Como lo pensaba, es suficiente de permutar la lógica del calculo.

En mi procedimiento BRestar_Click(... ), puedes reemplazar los códigos como este :

1
2
3
4
5
6
7
8
9
10
11
12
13
' ... ... ...
        ' *** Esta es el calculo iníciale (PHR) : En el reloj, D2 es mas grande que D1
        'If SegundosD2 < SegundosD1 Then  ' Para hacer calcul correcto sobre hora : tras 24h, viene 00h.
        '    SegundosD2 += 86400  ' 24 * 3600, es decir 24 horas
        'End If
        'Dim Diferencia As Integer = SegundosD2 - SegundosD1
 
        ' *** Esta es el calculo pedido (Kenneth) : En el reloj, D1 es mas grande que D2
        If SegundosD1 < SegundosD2 Then  ' Para hacer calcul correcto sobre hora : tras 24h, viene 00h.
            SegundosD1 += 86400  ' 24 * 3600, es decir 24 horas
        End If
        Dim Diferencia As Integer = SegundosD1 - SegundosD2
' ... ... ...

Este el código completo de mi Form FContadorTiempo :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
Public Class FContadorTiempo
 
    Dim D1 As Date
    Dim D2 As Date
    Dim Diferencia As Integer
 
 
    Private Sub FBase_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        TBTiempoD1.Text = Now.ToLongTimeString   ' Tiempo del sistema por defecto
    End Sub
 
    Private Function SegundosFormateadosHoras(ByVal CuantidadSegundos As Integer) As String
        Dim Resultado As String = ""
        Dim Tmp As Integer
 
        Tmp = CuantidadSegundos \ 3600             ' Calcular horas
        Resultado = String.Format("{0:D2}", Tmp) & ":"
        CuantidadSegundos -= Tmp * 3600
 
        Tmp = CuantidadSegundos \ 60               ' Calcular minutos
        Resultado &= String.Format("{0:D2}", Tmp) & ":"
        CuantidadSegundos -= Tmp * 60
 
        Tmp = CuantidadSegundos                      ' Calcular segundos
        Resultado &= String.Format("{0:D2}", Tmp)
 
        Return Resultado
 
    End Function
 
    Private Function CuantidadSegundosEnTiempo(ByVal D As Date) As Integer  ' Sumar las segundos sin mirar la fecha
        Dim TiempoSinFecha As String = D.ToLongTimeString
        Dim PrimerDoblePunto As Integer = TiempoSinFecha.IndexOf(":", 0)
        Dim H As Integer = CType(TiempoSinFecha.Substring(0, PrimerDoblePunto), Integer)
        Dim M As Integer = CType(TiempoSinFecha.Substring(PrimerDoblePunto + 1, 2), Integer)
        Dim S As Integer = CType(TiempoSinFecha.Substring(PrimerDoblePunto + 4), Integer)
        Return S + M * 60 + H * 3600
    End Function
 
    Private Function RedondearLosSegundosAlTiempo(ByVal TiempoEscritoConSegungos As Integer) As Integer
        Dim SegundosDelTiempo As Integer = TiempoEscritoConSegungos Mod 60
        If SegundosDelTiempo < 30 Then
            Return TiempoEscritoConSegungos - SegundosDelTiempo  ' Si menos que 30'', borrar los segundos
        Else
            Return TiempoEscritoConSegungos + (60 - SegundosDelTiempo) ' Si  30'' o mas, pasa a el minuto superior
        End If
    End Function
 
    Private Sub BHoraSistema_Click(sender As Object, e As EventArgs) Handles BHoraSistema.Click
        TBTiempoD1.Text = Now.ToLongTimeString   ' poner el tiempo del sistema si me gusta
    End Sub
 
    Private Sub BRestar_Click(sender As Object, e As EventArgs) Handles BRestar.Click
        ' D1 y D2 estan de tipo Date, contienne una fecha con la hora. Cuando D2 pasa el día, el sistema toma el día siguiente y hace dificules los calculos : DateDiff mira todo fecha + hora..
        ' Es la razón porque calculamos la soma de segundos de cada tiempo. Después, podemos restar los segundos independientemente del fecha.
        Dim SegundosD1 As Integer
        Dim SegundosD2 As Integer
        If TBTiempoD1.Text = String.Empty Or TBTiempoD2.Text = String.Empty Then  ' No continuar si no los datos correctos
            Exit Sub
        End If
        D1 = CType(TBTiempoD1.Text, Date)
        D2 = CType(TBTiempoD2.Text, Date)
        SegundosD1 = CuantidadSegundosEnTiempo(D1)
        SegundosD2 = CuantidadSegundosEnTiempo(D2)
 
        '' Esta es mi calculo iniciale (PHR) : En el relog, D2 es mas grande que D1
        ''If SegundosD2 < SegundosD1 Then  ' Para hacer calcul correcto sobre hora : tras 24h, viene 00h.
        ''    SegundosD2 += 86400  ' 24 * 3600, es decir 24 horas
        ''End If
        ''Dim Diferencia As Integer = SegundosD2 - SegundosD1
 
        '' Esta es el calculo pedido (Kenneth) : En el relog, D1 es mas grande que D2
        If SegundosD1 < SegundosD2 Then  ' Para hacer calcul correcto sobre hora : tras 24h, viene 00h.
            SegundosD1 += 86400  ' 24 * 3600, es decir 24 horas
        End If
        Dim Diferencia As Integer = SegundosD1 - SegundosD2
 
        ' Si quieres quitar los segundos, redondear los segundos : Si igual 30' o mas, pasa al minuto superior, si no, borrar los segundos
        Diferencia = RedondearLosSegundosAlTiempo(Diferencia)
 
        TBResultado.Text = SegundosFormateadosHoras(Diferencia)
        MostarTextBoxHMS()
    End Sub
 
    Private Sub MostarTextBoxHMS()
        Dim PrimerDoblePunto As Integer = TBResultado.Text.IndexOf(":", 0)
        TBHoraResultado.Text = TBResultado.Text.Substring(0, PrimerDoblePunto)
        TBMinutoResultado.Text = TBResultado.Text.Substring(PrimerDoblePunto + 1, 2)
        TBSegundoResultado.Text = TBResultado.Text.Substring(PrimerDoblePunto + 4)
    End Sub
 
End Class

Tendré un poco tiempo en le tarde, mas no demasiado tarde, quizá las 17 h. (Ahora, es la 8h30). Si necesario ...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Restar horas

Publicado por Kenneth (15 intervenciones) el 28/10/2021 01:49:34
Pues eso seria todo creo, solamente que me gustaria quitarle la parte en que si la hora actual tiene mas de 30 segundos para el siguiente minuto toma como un minuto mas

Pero todo está perfecto si eso se pudiera seria un plus, que la hora sea exacta que no redondee si hay >30 segundos


Muchas gracias un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Phil Rob
Val: 3.353
Oro
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Restar horas

Publicado por Phil Rob (1554 intervenciones) el 28/10/2021 10:26:57
Hola,

“…si la hora actual tiene más de 30 segundos para el siguiente minuto toma como un minuto más… “ : este caso, la hora toma máximo 30 segundos más y pasa al minuto superior.
Si la hora actual no tiene más de 29 segundos, la hora pierde máximo 29 segundos y no cambia los minutos.
Este es el redondeado en comparación con la unidad de nivel inferior: redondeado según el medio minuto, redondeado según el medio céntimo, redondeado según el medio milímetro, …
El redondeado es siempre un error, este el nivel de la precisión querida.

Si no hace el redondeado cuando los segundos están 59, pierdes 59 segundos, casi un minuto. El error es más grande.

He hecho el redondeado porque has dicho que no quieres los segundos.

Hay varios casos.

Si no leer los segundos, ni escribir los segundos, decimos que el valor de los segundos es siempre cero. No hacemos de redondeado. Los segundos de las horas están siempre mostrados 00.
En BRestar_Click(… ), agregar las líneas (Atencion : división entera) :

1
2
3
  ' Para calcular SIN segundos
        SegundosD1 = (CuantidadSegundosEnTiempo(D1) \ 60) * 60  ' Atención : división entera \ NO escribir estas líneas si calculo con segundos
        SegundosD2 = (CuantidadSegundosEnTiempo(D2) \ 60) * 60

Si leemos los segundos, podemos los escribir o no. Los segundos mostrados en las zonas de texto están cuales del cálculo o 00.
Modificas el procedimiento MostarTextBoxHMS() según este quieres (poner comentarios donde es necesario) :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Private Sub MostarTextBoxHMS()
        Dim PrimerDoblePunto As Integer = TBResultado.Text.IndexOf(":", 0)
        TBHoraResultado.Text = TBResultado.Text.Substring(0, PrimerDoblePunto)
        TBMinutoResultado.Text = TBResultado.Text.Substring(PrimerDoblePunto + 1, 2)
 
        ' Para mostrar los segundos de los calculos, con redondeado o no
        TBSegundoResultado.Text = TBResultado.Text.Substring(PrimerDoblePunto + 4)
 
        ' Para mostrar los segundos siempre egual a 00
        TBSegundoResultado.Text = "00"
 
        ' Para no mostrar los segundos, quitar el TextBox TBSegundoResultado
        ' Nada a escribir aqui
    End Sub

Cuando los segundos de pantalla están tomados en los cálculos, podemos hacer el redondeado o no.
Para no hacer el redondeado, en BRestar_Click(… ), poner comentarios según este quieres :

1
2
3
4
5
' Para redondear los segundos segun que estan igual a 30" o no
        Diferencia = RedondearLosSegundosAlTiempo(Diferencia)
 
        ' Para NO redondear los segundos
        ' Diferencia = RedondearLosSegundosAlTiempo(Diferencia) ' esta linea en comentario, nada a escribir aquí

Este es el código completo de BRestar_Click y MostarTextBoxHMS. Debes ajustar los comentarios como voy de explicar.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
Private Sub BRestar_Click(sender As Object, e As EventArgs) Handles BRestar.Click
        ' D1 y D2 estan de tipo Date, contienne una fecha con la hora. Cuando D2 pasa el día, el sistema toma el día siguiente y hace dificules los calculos : DateDiff mira todo fecha + hora..
        ' Es la razon porque calculamos la soma de segundos de cada tiempo. Después, podemos restar los segundos  independientemente del fecha.
        Dim SegundosD1 As Integer
        Dim SegundosD2 As Integer
        If TBTiempoD1.Text = String.Empty Or TBTiempoD2.Text = String.Empty Then  ' No continuar si no los datos correctos
            Exit Sub
        End If
        D1 = CType(TBTiempoD1.Text, Date)
        D2 = CType(TBTiempoD2.Text, Date)
 
        SegundosD1 = CuantidadSegundosEnTiempo(D1)
        SegundosD2 = CuantidadSegundosEnTiempo(D2)
 
        ' AQUÍ, DEBES ELEGIR :
 
        ' Para calcular SIN segundos
        SegundosD1 = (CuantidadSegundosEnTiempo(D1) \ 60) * 60  ' Atencion : division entera \ NO escribir estas lineas si calculo con segundos
        SegundosD2 = (CuantidadSegundosEnTiempo(D2) \ 60) * 60
 
        '' Esta es mi calculo iniciale (PHR) : En el relog, D2 es mas grande que D1
        ''If SegundosD2 < SegundosD1 Then  ' Para hacer calcul correcto sobre hora : tras 24h, viene 00h.
        ''    SegundosD2 += 86400  ' 24 * 3600, es decir 24 horas
        ''End If
        ''Dim Diferencia As Integer = SegundosD2 - SegundosD1
 
        '' Esta es el calculo pedido (Kenneth) : En el relog, D1 es mas grande que D2
        If SegundosD1 < SegundosD2 Then  ' Para hacer calcul correcto sobre hora : tras 24h, viene 00h.
            SegundosD1 += 86400  ' 24 * 3600, es decir 24 horas
        End If
        Dim Diferencia As Integer = SegundosD1 - SegundosD2
 
 
        ' AQUÍ, DEBES ELEGIR :
 
        ' Para redondear los segundos segun que estan igual a 30" o no
        Diferencia = RedondearLosSegundosAlTiempo(Diferencia)
 
        ' Para NO redondear los segundos
        ' Diferencia = RedondearLosSegundosAlTiempo(Diferencia) ' esta linea en comentario, nada a escribir aqui
 
        TBResultado.Text = SegundosFormateadosHoras(Diferencia)
        MostarTextBoxHMS()
    End Sub
 
    Private Sub MostarTextBoxHMS()
        Dim PrimerDoblePunto As Integer = TBResultado.Text.IndexOf(":", 0)
        TBHoraResultado.Text = TBResultado.Text.Substring(0, PrimerDoblePunto)
        TBMinutoResultado.Text = TBResultado.Text.Substring(PrimerDoblePunto + 1, 2)
 
        ' AQUÍ, DEBES ELEGIR :
 
        ' Para mostrar los segundos de los calculos, con redondeado o no
        TBSegundoResultado.Text = TBResultado.Text.Substring(PrimerDoblePunto + 4)
 
        ' Para mostrar los segundos siempre egual a 00
        TBSegundoResultado.Text = "00"
 
        ' Para no mostrar los segundos, quitar el TextBox TBSegundoResultado
        ' Nada a escribir aqui
    End Sub

Supongo que, encontraras la solución que te gusta …
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Restar horas

Publicado por Kenneth (15 intervenciones) el 29/10/2021 13:16:48
Perfecto, muchisimas gracias por tu tiempo y por tu ayuda. Sin duda alguna una fuente de conocimiento muy amplia.
Desearía aprender mas de este mundo, si pudieras compartir conmigo manuales o fuentes de información donde pueda empezar a trabajar seria perfecto. Te dejo mu correo [email protected]

Muchas gracia por todo, un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar