Italian differenza fra 2 orari

tmtube73

Active Member
Licensed User
ho un orario inizio ad esempio le 14.50
ho un orario attuale ad esempio 14.57

in una labey vorrei venisse visualizzato
"la tua sessione dura da 00:07 minuti"

qualche idea? Grazie.
 

Sagenut

Expert
Licensed User
Longtime User
B4X:
Sub Process_Globals
    'These global variables will be declared once when the application starts.
    'These variables can be accessed from all modules.
    Private tmr As Timer 'Timer per aggiornare la Label ad ogni secondo
    Private orainizio As Long 'Variabile per salvare l'orario di inizio sessione
End Sub

Sub Globals
    'These global variables will be redeclared each time the activity is created.
    Private Label1 As B4XView
End Sub

Sub Activity_Create(FirstTime As Boolean)
    Activity.LoadLayout("Layout")
    tmr.Initialize("Tempo", 1000) 'Inizializzo il Timer ad 1 secondo con EventName "Tempo"
    DateTime.TimeFormat = "HH:mm:ss" 'Imposto il formato ora desiderato per la visualizzazione
End Sub

Sub Activity_Resume

End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub

Private Sub Tempo_Tick
    'Nella Label, ogni secondo, viene scritto il tempo trascorso che è dato da:
    'Orario attuale - Orario di Inizio Sessione - Le ore del fuso per non avere modifiche all'orario (trasformate in Ticks)
    Label1.Text = "La tua Sessione dura da " & DateTime.Time(DateTime.Now - orainizio - (DateTime.GetTimeZoneOffsetAt(DateTime.Now) * 3600000))
End Sub

Private Sub Button1_Click
    orainizio = DateTime.Now 'Salvo l'orario di inizio sessione
    tmr.Enabled = True 'Abilito il Timer
End Sub
Forse ci sono soluzioni anche più eleganti.
Questo codice è valido per monitorare una sessione in tempo reale dal suo inizio (dato dal Click sul Button1).
Se usato durante il cambio da ora legale a ora solare sicuramente darà risultati sballati. ?
Prendilo come spunto iniziale.
 

udg

Expert
Licensed User
Longtime User
Il modo più corretto sarebbe quello di far uso delle funzioni disponibili in DateUtils.
Utili anche nel caso i due orari appartengano a giorni diversi.
 

Atob4a

Member
Se puo' ancora servire pubblico, con tutta l'umiltà che posso esprimere, due funzioncine una ritorna la differenza tra due orari e l'altra ti da l'ora attuale nel formato hh:mm:ss

B4X:
public Sub sDiffOre(pOra1 As String, pOra2 As String,tipo As String) As Int
   
    Dim xOra1 As Long= DateTime.TimeParse(pOra1)
   
    Dim xOra2 As Long= DateTime.TimeParse(pOra2)
   
    Dim diff As Long =xOra2-xOra1
    Dim ret As Int =0
    If tipo.ToLowerCase="s" Then
        ret= diff/1000
    End If
   
    If tipo.ToLowerCase="m" Then
        ret= (diff/1000)/60
    End If
   
    If tipo.ToLowerCase="h" Then
        ret= (diff/1000)/3600
    End If
   
    Return ret
End Sub

Public Sub sOraTtuale() As String
    Dim OraAtt As Long = DateTime.Now
   
    Dim Ora As String = ""
    Dim Minuti As String =""
    Dim Secondi As String = ""
   
    Ora = DateTime.GetHour(OraAtt)
    Minuti  = DateTime.GetMinute(OraAtt)
    Secondi = DateTime.GetSecond(OraAtt)
   
    If Ora.Length=1 Then Ora="0" & Ora
    If Minuti.Length=1 Then Minuti="0" & Minuti
    If Secondi.Length=1 Then Secondi="0" & Secondi

    Return Ora & ":" & Minuti & ":" & Secondi
   
End Sub

Certo un po' "casereccio"...ma funzionano...non ho implementato la differenza tra ore in giornate diverse...a breve lo farò...
un piccolo esempio

B4X:
Dim OraAttuale As String  = sOraTtuale

Dim Ora1 As String  = "08:30:10"
Dim Ora2 As String  = "20:30:10"


If sDiffOre(Ora1,OraAttuale,"s") >=0 And sDiffOre(OraAttuale,Ora2,"s") >=0 Then
''  il tuo codice
end if

'oppure
Dim Ora1 As String  = "08:30:10"
Dim Ora2 As String  = "20:30:10"
log ("Secondi tra " & ora1 & " e " & Ora2 =" & sDiffOre(Ora1,Ora2,"s"))

[/CODE]

Ciao :)
 
Top