Italian Calcolo tempo volo

Luigi S

Active Member
Licensed User
Ciao a tutti.
Sto calcolando il tempo di volo con questo codice:

B4X:
    IAS = edtVelocità.Text
    ALT = edtQuota.Text
    DIST = edtDistanza.Text
'    Log(edtVelocità.Text &"-"&  IAS)
'    Log(edtQuota.Text &"-"& ALT)
'    Log(edtDistanza.Text &"-"& DIST)
    TAS = IAS * (1+(ALT/1000*0.065))
'    Log("TAS = "& TAS)
    TempoVolo = DIST/TAS*3600*1000
'    Log("TempoVolo = " & TempoVolo)

    TempoVoloTicks = Round(TempoVolo)
    Log("CALCOLA---------------->>>>>>>>TempoVolo IN TICKS = "& TempoVoloTicks)
    
    DateTime.DateFormat="H:mm:ss"
    
    Dim targetTempoVolo As Long = DateUtils.UnixTimeToTicks(TempoVoloTicks)/1000
    Dim TempoVoloLeggibile As String = DateTime.Date(targetTempoVolo)
    
    lblTempoVolo.Text = TempoVoloLeggibile
    Log("CALCOLA---------------->>>>>>>>TempoVolo H:mm:ss = "& TempoVoloLeggibile)

e sull'emulatore tutto funziona correttamente.
quando lo metto sul mio cellulare mi aggiunge esattamente 1 ora, ma solo in TempoVoloLeggibile mentre TempoVoloTicks è corretto.
Ho pensato che possa dipendere dall'ora legale/solare che l'emulatore puo non considerare mentre il mio cellulare si, ma non capisco come possa entrarci in questo codice, che non tiene conto dell'orario ed oltretutto in questo periodo siamo in ora legale.
 

Sagenut

Expert
Licensed User
Longtime User
Ma questo
B4X:
DateTime.DateFormat="H:mm:ss"
forse dovrebbe essere
B4X:
DateTime.TimeFormat="HH:mm:ss"
 

Luigi S

Active Member
Licensed User
Si è vero ma non è quello il problema(l'ho testato). Siccome i dati in input non permettono mai di arrivare a tempi >= di 10 ore, per non avere sempre quello zero inutile davanti nella label ho tolto una H
 

Sagenut

Expert
Licensed User
Longtime User
Aggiungi
B4X:
DateTime.SetTimeZone(0)
 

Luigi S

Active Member
Licensed User
Grazie, pare funzionare, anche se non capisco perchè, visto che non c'è una richiesta tipo
B4X:
DateTime.Now
con cui sarebbe potuto entrare in gioco il fuso orario. Vabbe... grazie ancora!
 

Sagenut

Expert
Licensed User
Longtime User
Comunque stai lavorando con le funzioni DATA e ORA anche se gli passi un valore di TICKS tuo anzichè quello attuale (NOW).
Quindi viene gestito con le impostazioni data/orario correnti.
Tu invece devi lavorare con un periodo di tempo definito quindi imposti il timezone a 0 per non avere modifiche, visto che 1 ora è 1 ora ovunque. ;)
 

Luigi S

Active Member
Licensed User
Mi sono accorto solo ora che con questo codice
B4X:
DateTime.SetTimeZone(0)
mi toglie un'ora anche in altri campi dove è riportato l'orario di partenza e di arrivo.
Facendo un po' di prove, mi sono accorto che vengono aggiunte o sottratte quante sono le ore di scarto rispetto all'ora UTC
Dovrei limitare l'azione di tale codice solo alla label incriminata, oppure sottrarre lo scarto UTC nella formula di calcolo, ma non so proprio come fare , ora cerco un po' in giro.
 

Luigi S

Active Member
Licensed User
Ho trovato
B4X:
DateTime.TimeZoneOffset
che mi da l'offset dell'apparacchio, ora vado a letto domani vedo di inventarmi qualcosa.
 

Luigi S

Active Member
Licensed User
Vabbe non sono riuscito ad andare a letto.... :) ma ho risolto cosi

B4X:
    IAS = edtVelocità.Text
    ALT = edtQuota.Text
    DIST = edtDistanza.Text
'    Log(edtVelocità.Text &"-"&  IAS)
'    Log(edtQuota.Text &"-"& ALT)
'    Log(edtDistanza.Text &"-"& DIST)
    TAS = IAS * (1+(ALT/1000*0.065))
'    Log("TAS = "& TAS)
    TempoVolo = DIST/TAS*60*60*1000
'    Log("TempoVolo = " & TempoVolo)
'    lblTempoVolo.Text = Round2(TempoVolo,1)
    TempoVoloTicks = Round(TempoVolo)
    Log("CALCOLA---------------->>>>>>>>TempoVolo IN SECONDI = "& TempoVoloTicks)
    
    Dim currentTimezone As Double = DateTime.TimeZoneOffset
    Dim currentTimezoneLeggibile As Long = currentTimezone * 3600 * 1000
    Log("currentTimezone---------------->>>>>>>>currentTimezone = "& currentTimezone)
    
    DateTime.DateFormat="H:mm:ss"
'    DateTime.SetTimeZone(0)       '#####################################    QUESTA COSA NON FUNZIONA    ###################
    Dim targetTempoVolo As Long = (DateUtils.UnixTimeToTicks(TempoVoloTicks)/1000)  - currentTimezoneLeggibile 
    Dim TempoVoloLeggibile As String = DateTime.Date(targetTempoVolo)
    
    lblTempoVolo.Text = TempoVoloLeggibile
    Log("CALCOLA---------------->>>>>>>>TempoVolo H:mm:ss = "& TempoVoloLeggibile)

almeno pare....stavolta vado a letto davvero e domani faro dei test approfonditi.
 

Sagenut

Expert
Licensed User
Longtime User
All'avvio della app salvi il TimeZone corrente del telefono in una variabile globale
B4X:
Sub Globals
    'These global variables will be redeclared each time the activity is created.
    Private lbltempovolo As Label
    Private zona As Double
End Sub

Sub Activity_Resume
    zona = DateTime.TimeZoneOffset 'Salva il TimeZone reale nella variabile zona
End Sub
Quando devi fare il calcolo del tuo tempovolo puoi fare così:
B4X:
DateTime.SetTimeZone(0) 'Imposta il TimeZone a 0 per non avere offset

'Quì effettui i tuoi calcoli

DateTime.SetTimeZone(zona) 'Reimposta il TimeZone reale per poter lavorare correttamente con le date
 
Top