Flower@12 Ответов: 4

Как рассчитать разницу во времени между двумя временами в VB


Мне нужно рассчитать разницу во времени между двумя временами
Время начала смены-с 04:30 вечера до 12:30 утра
Сотрудник вовремя находится в 08:30 утра, то он показывает сообщение об ошибке время истекло

Что я уже пробовал:

dtShifTime = Convert.ToDateTime("16:30").ToString("HH:mm")
   Dim dtEntryTime As DateTime = Convert.ToDateTime("08:30").ToString("HH:mm")
dtLateTime = dtShifTime.AddHours(2)
     If lblStartTime.Text <> "" And (dtShifTime  < dtEntryTime) Then
                    MBox("Time Expired")
End IF

4 Ответов

Рейтинг:
2

[no name]

я попробовал в google, но они не соответствовали моим требованиям, сэр.
вот почему я спрашиваю codeproject.

Рейтинг:
2

Anthony Githae

Попробуйте этот блок кода ... При этом используется экземпляр timespan для проверки опоздания в минутах

Private Sub LatenessCheck()
      Dim dtShifTime As DateTime = Nothing
      Dim dtEntryTime As DateTime = Nothing
      Dim spLateness As TimeSpan

      If Date.TryParse("2019-01-01 16:30", dtShifTime) Then
        'dtShifTime is assigned
      End If
      If Date.TryParse("2019-01-01 08:30", dtEntryTime) Then
        'dtEntryTime is assigned
      End If
      If Not (dtShifTime = Nothing Or dtEntryTime = Nothing) Then
        spLateness = dtShifTime - dtEntryTime
        If spLateness.Minutes < 0 Then
          MsgBox("Late", MsgBoxStyle.Information + MsgBoxStyle.OkOnly, "Late")
        End If
      Else
        'not late, or date assignment error
      End If
    End Sub


Рейтинг:
1

OriginalGriff

Проблема в том, что ваша смена перекрывает два дня, причем полчаса приходится на "второй день".
поэтому, когда вы просто преобразуете время в объект DateTime, вы получаете время начала после времени окончания: 00:30 end, 16:30 start.

Затем идет сравнение строк ... почему? Зачем преобразовывать строки в числа, а затем обратно в строки, чтобы сделать числовое сравнение?

Вместо этого рассмотрите его как две смены: с 00:00 до 00:30 и с 16:30 до 23:59 и сравните для обоих.
Лучший способ сделать это-считать, что строка начинается как "минуты с полуночи":
От 0 до 30, от 990 до 1439 и преобразуйте текущее время в то же самое: 510.
Затем проверьте, находится ли он в одной из двух смен или нет.

Кстати: 08:30 вообще не входит в вашу смену ... так что "время истекло" было бы правильно...


Рейтинг:
0

Patrice T

Ваша проблема заключается в том, что вы установили 16:30 в переменную dtShifTime, а затем вы используете dtLateTime при сравнении.
dtLateTime не определен в настоящем Кодексе.
Используйте отладчик для просмотра значений переменных во время выполнения.

Ваш код ведет себя не так, как вы ожидаете, или вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что должен делать ваш cpde, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]

Visual Basic / Visual Studio Video Tutorial - Базовая Отладка - YouTube[^]
Visual Basic .NET programming for Beginners - точки останова и средства отладки[^]

Отладка в Excel VBA - простые макросы Excel[^]
MS Excel 2013: введение в отладку VBA[^]
Как отладить Excel VBA - YouTube[^]

Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.

Цитата:
Я уже использую отладчик для поиска того, как работает код, но я понятия не имею, для какого условия проверять разницу во времени, потому что применяются некоторые условия

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


[no name]

Извините сэр я забыл скопировать эту строчку вот что вы сказали
dtLateTime = dtShifTime.AddHours(2)
Потому что у каждого сотрудника есть разрешение на 2 часа с момента начала его смены вот почему я использую это но я забываю вставить его

Patrice T

Воспользуйся Улучшить вопрос чтобы обновить ваш вопрос.
Чтобы каждый мог обратить внимание на эту информацию.

[no name]

хорошо сэр

[no name]

Я уже использую отладчик для поиска того, как работает код, но я понятия не имею, для какого условия проверять разницу во времени, потому что применяются некоторые условия