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
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
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
@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)
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
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))
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: 192

Fulvio75

Well-Known Member
Licensed User
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}"$)


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)))
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
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)
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
 
Top