2016-05-18 2 views
1

Пожалуйста, помогите! Мне нужно, чтобы получить общее количество часов и минут, какой формат «HH: мм» из ListBox, например:VB.NET Как получить общее количество часов и минут в списке

11:20 
    22:40 
    34:00 

Итого: 68:00

Я пытался использовать DATETIME и TimeSpan, но у него есть ошибка:

«DateTime представлено строкой не поддерживается в календаре System.Globalization.GregorianCalendar.»

Вот мой код:

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 '' не будет анализировать, потому что TimeSpan будет изображать его как '1: 10: 00'. Вам лучше оставить их как TimeSpans и просто отобразить результат в любом формате, который вам нужен, а не преобразовать в строку – Plutonix

+0

Спасибо, но мне нужен формат HH: mm для окончательного результата. –

+0

@Plutonix Я попробовал следующее: 'Dim ts As TimeSpan = TimeSpan.Parse (« 34:00 »)' и 'Dim ts As TimeSpan = TimeSpan.ParseExact (« 34:00 »,« HH: mm »,« Глобализация ». CultureInfo.InvariantCulture) '. Я получил «System.OverflowException» для обоих методов. –

ответ

1

Может быть, это может помочь вместо:

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 

Вы бы до сих пор литье Strings-типа Integer, поэтому я бы поставил, что внутри Try/Catch

+1

Спасибо! Оно работает. –

0

Вы не можете создать DateTime или Timespan из строки с использованием значения часа, которое больше 24. Вам нужно будет самостоятельно проанализировать ввод d преобразуйте его в допустимую строку, которая будет использоваться в 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 
Смежные вопросы