2016-05-18 1 views
1

Aidez s'il vous plaît! Je dois obtenir le total des heures et minutes format est "HH: mm" de ListBox, par exemple:VB.NET Comment obtenir le total des heures et minutes dans Listbox

11:20 
    22:40 
    34:00 

Total: 68:00

J'ai essayé d'utiliser Datetime et TimeSpan, mais il a erreur:

« le DateTime représenté par la chaîne est pas prise en charge dans le calendrier System.Globalization.GregorianCalendar. »

Voici mon code:

ListBox_monthtime.Items.Add("11:20") 
    ListBox_monthtime.Items.Add("22:40") 
    ListBox_monthtime.Items.Add("34:00") 

    'SUM TIMES IN LISTBOX 
    Dim MyDateTimeMonthly As DateTime 
    Dim MyTimeSpanMonthly As New TimeSpan 

    For Each S As String In ListBox_monthtime.Items 
     MyDateTimeMonthly = DateTime.ParseExact(S, "HH:mm", System.Globalization.CultureInfo.InvariantCulture) 
     MyTimeSpanMonthly = MyTimeSpanMonthly.Add(New TimeSpan(MyDateTimeMonthly.Day, MyDateTimeMonthly.Hour, MyDateTimeMonthly.Minute, 0)) 
    Next 

    monthtime_txt.Text = (MyTimeSpanMonthly.Days * 24 + MyTimeSpanMonthly.Hours) & ":" & MyTimeSpanMonthly.Minutes 
+1

'" 34:00 "' ne pas analyser car TimeSpan le représenterait comme '1: 10: 00'. Vous feriez mieux de les laisser comme TimeSpans et d'afficher simplement le résultat dans le format dont vous avez besoin plutôt que de convertir en chaîne – Plutonix

+0

Merci, mais j'ai besoin du format HH: mm pour le résultat final. –

+0

@Plutonix J'ai essayé ce qui suit: 'Dim ts As TimeSpan = TimeSpan.Parse (" 34:00 ")' et 'Dim ts As TimeSpan = TimeSpan.ParseExact (" 34:00 "," HH: mm ", Globalisation. CultureInfo.InvariantCulture) '. J'ai reçu une 'System.OverflowException' pour les deux méthodes. –

Répondre

1

Peut-être que cela peut aider à la place:

ListBox_monthtime.Items.Add("11:43") 
ListBox_monthtime.Items.Add("22:56") 
ListBox_monthtime.Items.Add("34:21") 

Dim totalHours As Integer 
Dim totalMinutes As Integer 
For Each S As String In ListBox_monthtime.Items 
    totalHours += S.Split(":")(0) 
    totalMinutes += S.Split(":")(1) 
Next 

Dim remainder = totalMinutes Mod 60 
totalHours += totalMinutes/60 

Dim totalTime = totalHours & ":" & remainder.ToString("D2") 
monthtime_txt.Text = totalTime 

Vous seriez encore jettes Cordes-Entiers, donc je mettrais que dans un Try/Catch

+1

Merci! Ça marche. –

0

Vous ne pouvez pas créer un DateTime ou un Timespan à partir d'une chaîne en utilisant une valeur d'heure supérieure à 24. Vous devrez analyser l'entrée yo urself et le convertir en une chaîne valide à utiliser par TimeSpan.parse().

Dim TotalTime As TimeSpan = TimeSpan.Zero 
For Each item As String In ListBox_monthtime.Items 
    TotalTime = TotalTime.Add(TimeSpan.Parse(FormatTimeString(item))) 
Next 
Me.monthtime_txt.Text = $"{CInt(TotalTime.TotalHours).ToString}:{TotalTime.Minutes}" 


Private Function FormatTimeString(TimeString As String) As String 
    Dim timeArr() As String = TimeString.Split(":") 
    If CInt(timeArr(0)) > 24I Then 
     Dim d As Int32 = CInt(timeArr(0)) \ 24I 
     FormatTimeString = $"{d}:{(CInt(timeArr(0)) - (24I * d)).ToString}:{timeArr(1)}:00" 
    Else 
     FormatTimeString = TimeString 
    End If 
End Function