Преобразование между временным интервалом и датой с помощью vb.net

Я запускаю приложение, в котором я могу получить требуемое время, однако, когда я пытаюсь вычесть одно значение из другого, появляется сообщение об ошибке, в котором говорится, что преобразование из типа даты не может произойти с промежутком времени. Переменные, которые я использую, показаны ниже:

Dim downtime As TimeSpan
Dim uptime As TimeSpan 

Dim errortime As String() = lb_critical.SelectedItem.Split({" | "}, StringSplitOptions.RemoveEmptyEntries)
Dim errortimefound As DateTime = Convert.ToDateTime(errortime(0).ToString())
downtime = DateTime.Now - errortimefound
uptime = DateTime.Now - Convert.ToDateTime(downtime.ToString())

Когда я запускаю это, я получаю ошибку с переменной времени простоя.

Чтобы попытаться решить эту проблему, я попытался преобразовать переменные во все DateTime, прежде чем их вычесть, поискал в Интернете, но безуспешно.

Может ли кто-нибудь определить, что я здесь делаю неправильно.

Спасибо, Эндрю, за улучшенный код, но, к сожалению, я все еще получаю сообщение об ошибке. См. Изображение ниже:

введите здесь описание изображения


person Satvir Singh    schedule 10.06.2016    source источник
comment
почему вы хотите преобразовать временной интервал в дату и время? проверьте это для получения дополнительной информации stackoverflow.com/questions/10276228/   -  person Abdul    schedule 10.06.2016
comment
Я просмотрел этот сайт, уже попробовал этот метод, но он не сработал.   -  person Satvir Singh    schedule 10.06.2016
comment
It is not very logical to convert TimeSpan to DateTime Или наоборот. Вычитание одного DateTime из другого не приведет к появлению первого упомянутого сообщения об ошибке. Мы не видим этот код, но он делает что-то еще, чтобы вызвать эту ошибку.   -  person Ňɏssa Pøngjǣrdenlarp    schedule 10.06.2016
comment
Пожалуйста, прочтите мой ответ Эндрю, я точно объяснил, что пытаюсь сделать.   -  person Satvir Singh    schedule 10.06.2016


Ответы (1)


Вот пример рабочего метода:

Private Sub Button54_Click(sender As System.Object, e As System.EventArgs) Handles Button54.Click
    getTimes("wibblewoffle")
    getTimes("2016-06-10 08:55:12")
End Sub

Private Sub getTimes(foundTime As String)

    Dim errortimefound As DateTime

    If DateTime.TryParse(foundTime, errortimefound) Then

        Dim downtime As TimeSpan = DateTime.Now.Subtract(errortimefound)
        Dim uptime As TimeSpan = DateTime.Now.Subtract(Convert.ToDateTime(downtime.ToString()))

        'do your magic here

    Else
        MessageBox.Show(String.Format("This is not a valid date time: =>[{0}]", foundTime))
    End If

End Sub
person Andrew Mortimer    schedule 10.06.2016
comment
Андрей, пожалуйста, взгляните на изображение в посте. Это сообщение об ошибке возникло с использованием улучшенного кода, который вы мне предоставили. Это как-то связано с errortime, так как ваш код работает, если дата вводится вручную, но не работает, если передается с использованием переменной errortime. - person Satvir Singh; 10.06.2016
comment
Что именно находится в строке, которую вы передаете? Я предполагаю, что это не понимается как действительное datetime. Вы можете попробовать DateTime.TryParse, чтобы проверить его. - person Andrew Mortimer; 10.06.2016
comment
У меня есть html-файл, из которого я читаю данные, и я заполняю этими данными список. Затем я прошу пользователя выбрать одну из строк из списка, и когда они это сделают, я хочу получить дату и время этой строки. Данные выглядят как 21.04.2016 08:53:44 | 21.04.2016 08:53:44 | frmManagement.LiquidInThisPositionToolStripMenuItem_Click (): возникло исключение - person Satvir Singh; 10.06.2016
comment
Думаю, время простоя - это правильно. Он возвращает временной интервал между ошибкой и моментом обнаружения. Что именно вам нужно в отношении времени безотказной работы? - person Andrew Mortimer; 10.06.2016
comment
да вы правы, простоя работает нормально. Проблема с временем безотказной работы, и система не распознает его как DateTime. Время безотказной работы - это значение того, как долго работает система. Поскольку эта проблема будет использоваться сразу после того, как система завершит выполнение задач, я хочу, чтобы время безотказной работы было uptime = now - starttime (у меня уже есть это значение) - downtime. Но в настоящее время он не работает с временем простоя. Основная проблема заключается в преобразовании из timespan в datetime, и в ходе исследований я обнаружил, что если временной промежуток имеет день, он не может преобразоваться в datetime. Это правда? - person Satvir Singh; 13.06.2016
comment
Разве «время безотказной работы» тогда было бы просто «время начала - время обнаружения ошибки»? - person Andrew Mortimer; 13.06.2016
comment
Давайте углубимся в детали. У меня есть база данных, которой нужно время начала, окончания, время безотказной работы, время простоя. Время начала - это время начала процесса и время окончания, когда он остановился. Я использую errorfoundtime, чтобы узнать время возникновения ошибки. Время простоя используется для определения того, когда система снова запустилась, путем вычитания времени ошибки сейчас. Это дает время, когда система остановилась и ничего не делала, потому что, когда эта программа используется для записи значений в базу данных, именно тогда система запускается. Время безотказной работы - это разница между временем запуска следующей системы и временем запуска предыдущей системы. - person Satvir Singh; 13.06.2016
comment
Итак, в вашей модели время начала и время окончания должны быть датами. Время безотказной работы и время простоя должно быть целым числом дней / часов (или как вы это измеряете). Это правильно? - person Andrew Mortimer; 13.06.2016
comment
Да все верно. Чтобы загрузить данные в базу данных, они должны быть в определенном формате данных, что я могу сделать, если смогу получить каждый отдельный компонент (день, месяц, час, ...). Я смог получить час, минуту, секунду, используя uptime.Hours.ToString. Однако мне также нужно получить день и месяц, но это дает странные значения, не знаю, как их получить. Я пробовал следующее для получения компонента дня, но не повезло: Тусклое время простоя As TimeSpan = TimeSpan.Parse (10.06.2016 08:55:12) MessageBox.Show (downtime.Days.ToString) - person Satvir Singh; 13.06.2016
comment
Я думаю, вы смешиваете DateTime и TimeSpan. TimeSpan - это время, прошедшее между двумя датами. - person Andrew Mortimer; 13.06.2016
comment
Давайте продолжим это обсуждение в чате. - person Satvir Singh; 13.06.2016