Italian Trasformare la differenza tra due date in ore

Fulvio75

Well-Known Member
Licensed User
Caio a tutti, se il risultato della differenza tra due date utilizzando dateUtil.periodbetween = 0 anni, 0 mesi, 3 giorni, 22 ore, 10 min, 15 sec come faccio a trasformarlo in ore (int)?
Devo fare il calcolo manualmente oppure c'è una funzione? pensavo che il preiod.hours si riferisse alle ore totali invece sonpo le ore reali da 0 a 24.
In VB c'è GetHours in DateTime.
Grazie
 

ivanomonti

Expert
Licensed User
Longtime User
si esiste trovi tutte le funzioni si datetime.
 

Star-Dust

Expert
Licensed User
Longtime User
basta scrivere DataTime sulla barra di ricerca
 

Fulvio75

Well-Known Member
Licensed User
Ok questo l'ho visto e utilizzato molte volte ma non esiste una funzione che da le ore totali in base ai giorni ore minuti e secondi.
In VB c'era gettothours che restituiva le ore totali
 

ivanomonti

Expert
Licensed User
Longtime User
@Fulvio75 ecco un sempio veloce, forse poi affinarlo meglio... il risultato sarà 9 giorni

B4X:
    Dim data1, data2, intervallo As Long
    DateTime.DateFormat="dd/MM/yyyy"
    data1= DateTime.GetDayOfYear(DateTime.DateParse("01/04/2020"))
    data2= DateTime.GetDayOfYear( DateTime.DateParse("10/04/2020"))
    intervallo = data2-data1
    Log(intervallo)
 

ivanomonti

Expert
Licensed User
Longtime User
cazzarola sono un Membro ben noto (Well-Known Member) sono due le possibilità

  1. sto sui coglioni per le stronzate che scrivo
  2. ho un cazzo enorme hahahahahah
 

ivanomonti

Expert
Licensed User
Longtime User
Ok questo l'ho visto e utilizzato molte volte ma non esiste una funzione che da le ore totali in base ai giorni ore minuti e secondi.
In VB c'era gettothours che restituiva le ore totali
esiste la funzione DateTime.TicksPerHour che basta moltiplicarlo per le ore e con la funzione DateTime.TicksPerDay fai lo stesso gioco di sopra,,, avrai la la differenza di ore che non ti sei impegnato hahahhaah
 

Fulvio75

Well-Known Member
Licensed User
Questo è ovvio...
Forse non sono stato chiaro...
Es:
15/05/2020 12:33:05 - 13/02/2020 06:00:13 = ore?? Le ore che passano tra le due date
 

Star-Dust

Expert
Licensed User
Longtime User
Contare distanze di tempo:
Dim data1 As Long=DateTime.DateTimeParse("04/01/2020","10:22:55")
Dim data2 As Long=DateTime.DateTimeParse("04/28/2020","08:10:10")
Dim Ore As Int = Abs(data2-data1)/DateTime.TicksPerHour

Se vuoi calcolare le ore o i giorni fai cosi
Contare distanze di tempo:
Dim data1 As Long=DateTime.DateTimeParse("04/01/2020","10:22:55")
Dim data2 As Long=DateTime.DateTimeParse("04/28/2020","08:10:10")
Dim Giorni as int = ABS(Data2-Data1)/DateTime.TicksPerDay

Oppure
Contare distanze di tempo:
Dim data1 As Long=DateTime.DateTimeParse("04/01/2020","10:22:55")
Dim data2 As Long=DateTime.DateTimeParse("04/28/2020","08:10:10")
Dim Ore as int = DateTime.GetHour(Date2-Date1)
 
Last edited:

ivanomonti

Expert
Licensed User
Longtime User
Questo è ovvio...
Forse non sono stato chiaro...
Es:
15/05/2020 12:33:05 - 13/02/2020 06:00:13 = ore??

uguale non cambia nulla, ripetp swvi affinarlo a secondo delle tute esigenze (2226 intervallo di ore totali)

totale giorni
24 ore per totale giorni
addizione delle ore dei due giorni start end

scrivo a naso (quindi possibil qualche imperfezione, ma di sicuro qualcuno correggerà)


B4X:
    Dim data1, data2, ore1, ore2, intervallo_day, intervallo_Hour As Long
    DateTime.DateFormat="dd/MM/yyyy HH:mm:ss"
    
    data1= DateTime.GetDayOfYear(DateTime.DateParse("15/05/2020 12:33:05"))
    data2= DateTime.GetDayOfYear( DateTime.DateParse("13/02/2020 06:00:13"))
    
    ore1= DateTime.GetHour(DateTime.DateParse("15/05/2020 12:33:05"))
    ore2= DateTime.GetHour( DateTime.DateParse("13/02/2020 06:00:13"))
    
    intervallo_day = data1-data2
    intervallo_Hour = ore1+ore2
    
    Log((24*intervallo_day)+ (intervallo_Hour))
 

Fulvio75

Well-Known Member
Licensed User
Ok domani provo pensavo ci fosse qualche cosa di più "spaziale" dove passavo tutto e mi restituiva le ore
 

Star-Dust

Expert
Licensed User
Longtime User
Troppo complicato, troppi calcoli
 

Star-Dust

Expert
Licensed User
Longtime User
dimmi dove, plase
Contiene 7 righe di codice, con 3 calcoli. Poi stai dividendo data da ore il che crea un errore.
Infatti non da risultati corretti. Facciamo un esempio.Dai ieri alle 11 a oggi alle 6 del mattino ci sono 19 ore.

Mio codice
B4X:
Dim data1 As Long=DateTime.DateTimeParse("04/28/2020","06:00:00")
Dim data2 As Long=DateTime.DateTimeParse("04/27/2020","11:00:00")
Log($"Ore: $1.0{Abs(data2-data1)/DateTime.TicksPerHour}"$)
Waiting for debugger to connect...
Program started.
Ore: 19

Il tuo codice:
B4X:
data1= DateTime.GetDayOfYear(DateTime.DateParse("04/28/2020 06:00:00"))
data2= DateTime.GetDayOfYear(DateTime.DateParse("04/27/2020 11:00:00"))
ore1= DateTime.GetHour(DateTime.DateParse("04/28/2020 06:00:00"))
ore2= DateTime.GetHour(DateTime.DateParse("04/27/2020 11:00:00"))

intervallo_day = data1-data2
intervallo_Hour = ore1+ore2

Log("Ore: " & ((24*intervallo_day)+ (intervallo_Hour)))
Waiting for debugger to connect...
Program started.
Ore: 24
 

Attachments

  • test.zip
    1.1 KB · Views: 267

Fulvio75

Well-Known Member
Licensed User
Ok grazie quindi sempre / ticksper... E ottengo il risultato che mi interessa ovviamente riferito al ticksper(quello che ho bisogno)
 

LucaMs

Expert
Licensed User
Longtime User
Ho preso un paio di codici di @Star-Dust (usando miei dati e impostazioni) e...

B4X:
Sub Test
    DateTime.DateFormat = "dd/mm/yyyy"

    Dim data1 As Long = DateTime.DateTimeParse("26/04/2020", "01:00:00")
    Dim data2 As Long = DateTime.DateTimeParse("29/04/2020", "23:10:15")

    Dim per As Period
    per = DateUtils.PeriodBetween(data1, data2)
    Log("Years   " & per.Years)
    Log("Month   " & per.Months)
    Log("Days    " & per.Days)
    Log("Hours   " & per.Hours)
    Log("Minutes " & per.Minutes)
    Log("Seconds " & per.Seconds)
'0 anni, 0 mesi, 3 giorni, 22 ore, 10 min, 15 sec

    Dim Ore As Int = DateTime.GetHour(data2 - data1)
    Log("Ore: " & Ore)
    ' Darà 23 ore, quindi arrotondando per eccesso.

    Log($"Ore: $1.0{Abs(data2 - data1) / DateTime.TicksPerHour}"$)
    ' Darà 94 ore, quindi arrotondando per difetto.
End Sub

C'è differenza negli arrotondamenti (il che non significa che siano sbagliati ma solo che è necessario tenerne conto)
 

Star-Dust

Expert
Licensed User
Longtime User
Il problema che citavo non riguarda l'arrotondamento della singola ora che si può gestire, ma sbagliare 5 ore.

L'arrotondamento è generato dal fatto che ho usato per semplicità $1.0{}, ma avrei potuto fare $1.2{} per ottenere due cifre decimali da trasformare in minuti.
Ma non era quello l'obiettivo
 
Cookies are required to use this site. You must accept them to continue using the site. Learn more…