Почему DateDiff возвращает дату, а не количество минут? - PullRequest
2 голосов
/ 30 сентября 2019

Мне нужно выяснить, сколько минут существует между двумя строками.

h1 = TimeValue("06:00:00")
h2 = TimeValue("22:00:00")
res = DateDiff("n", h1, h2)

Однако res = 17/08/1902, тогда как ожидаемый результат - 960.

Кто-то может помочь мне исправитьэто пожалуйста?

Большое спасибо.

Редактировать 1

Sub calcul(hours As Variant, Optional n As Integer = 0)
    i = 3
    Do While (Cells(i, 0) <> "")
        Dim res As Date
        Dim h2 As Date
        Dim h1 As Date
        Dim h As Integer

        If (n = 0) Then
           h = 0
        Else
           h = Cells(i, 7).Value - 1
        End If

        h1 = TimeValue(hours(h)("h1"))
        h2 = TimeValue(hours(h)("h2"))
        res = DateDiff("n", h1, h2)

        ...

1 Ответ

8 голосов
/ 30 сентября 2019

Проблема здесь в том, как вы определили res.

Даты и значения времени являются числами. Даже если вы видите его как 30/09/2019 или 12:00:00, фактически для Excel оба случая являются числами.

Первая дата, которую Excel может правильно распознать, - 01.01.1900, целое числовое значение которой равно 1. Число2 будет 01.02.1900 и так далее. На самом деле, сегодня 43738.

Для времен то же самое, но десятичные части - это часы, минуты и секунды. 0,5 означает 12:00:00. Итак, на самом деле 43738,5 означает 30/09/2019 12:00:00.

В любом случае, в вашем случае вы получаете разницу во времени между 2 разами в минутах. В результате получается 960, , но вы присваиваете это значение типу date, поэтому 960 преобразуется в 17/08 / 1902.

Dim h1 As Date
Dim h2 As Date
Dim res As Single


h1 = TimeValue("06:00:00")
h2 = TimeValue("22:00:00")
res = DateDiff("n", h1, h2)

Debug.Print res

Код выше вернет960 правильно. Адаптируйте его под свои нужды.

ОБНОВЛЕНИЕ: Поскольку DateDiff возвращает Long, определение res как Single вообще не стоит . Я сделал это потому, что для работы со временем во многих случаях требуются десятичные дроби, но если вы используете просто DateDiff, то вы можете прекрасно сделать res as Long или res as Integer.

Обратите внимание на разницу между DateDiff и обычным вычитанием с простым кодом:

Dim time1 As Date
Dim time2 As Date
Dim res1 As Integer
Dim res2 As Single 'or double if you wish

time1 = "06:00:00"
time2 = "06:30:30"

'time difference between these 2 values are 30 minutes and 30 seconds (30,5 minutes in decimal)

res1 = DateDiff("n", time1, time2)
res2 = (time2 - time1) * 1440 '1440 is the number of minutes in a whole day

Debug.Print "With DateDiff:" & res1, "Normal: " & res2

Вывод этого кода: With DateDiff:30 Normal: 30,5

Использование DateDiff иногда не стоит. В зависимости от того, насколько точный вам нужен результат, DateDiff может компенсировать или нет. Я бы посоветовал вам избежать этого, если вы можете (это просто мое мнение)

Надеюсь, это поможет

ОБНОВЛЕНИЕ 2: О коде выше, да, решениебудет использовать DateDiff("s", time1, time2) / 60, чтобы преобразовать секунды в минуты, но это значение из-за десятичных разрядов должно быть присвоено типу данных, который это позволяет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...