Преобразовать строку во время и сравнить 2 из них - PullRequest
0 голосов
/ 10 мая 2019

У меня есть следующие строки:

01/04/2019 11:32:45

и

01/04/2019 11:38:13

Я хочу иметь возможность сравнить оба времени и затем добавить результат в ячейку.

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

Какой самый простой способ сделать это?

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

ура

Ответы [ 2 ]

1 голос
/ 10 мая 2019

Если у вас есть строки, содержащие дату, лучше всего конвертировать их в реальные значения Date.

Вы можете использовать функцию CDate для преобразования строк в даты, однако есть некоторые подводные камни, например. в зависимости от региональных настроек вашего компьютера формат даты (и порядок дня, месяца и года) может измениться, и CDate попытается соблюдать эти настройки. Если ваш код выполняется в другой части мира, один и тот же ввод может привести к разным датам. Это, вероятно, причина, по которой вы нашли сложный код, который разбивает строки на части, чтобы получить отдельные части даты.

Дата сохраняется как Double значение. Целая часть числа определяет дату, начиная с 31.12.1899. Дробная часть представляет время. Чтобы получить разницу между двумя датами, вы можете просто вычесть их.

Теперь возникает вопрос, что вы хотите сделать с разницей. Вы можете написать UDF, который возвращает эту разницу, и отформатировать вашу ячейку, чтобы отображать только часть времени. Просто подумайте, можете ли вы иметь различия> 1 дня. Или вы можете умножить разницу на 24, чтобы получить количество часов, или на 24 * 60, чтобы получить минуты.

UDF может выглядеть как

Function TimeDiff(s1 As String, s2 As String) As Date
    Dim d1 As Date, d2 As Date
    d1 = CDate(s1)
    d2 = CDate(s2)
    TimeDiff = IIf(d1 > d2, d1 - d2, d2 - d1)
End Function

Предполагая, что ваша строка даты находится в A1 и B1, вы можете написать формулу =TimeDiff(A1, B1) в ячейку C1.

Альтернатива для получения количества минут (обратите внимание на другой тип возвращаемого значения):

Function TimeDiffInMinutes(s1 As String, s2 As String) As Long
    Dim d1 As Date, d2 As Date, diff As Date
    d1 = CDate(s1)
    d2 = CDate(s2)
    Diff = IIf(d1 > d2, d1 - d2, d2 - d1)
    TimeDiffInMinutes = Diff * 24 * 60
End Function

Обе функции не будут иметь проблем, если даты разные.

Если ваш входной формат всегда в форме 01/04/2019 11:38:13, но CDate будет путать 1 апреля с 4 января, вы можете написать небольшую функцию, которая разбивает строку вручную и создает из нее дату. Просто замените вызов на CDate на вызов вашей собственной функции преобразования:

Function stringToDate(s As String) As Date

    Dim pieces() As String, datePieces() As String, timePieces() As String

    pieces = Split(s, " ")
    datePieces = Split(pieces(0), "/")
    timePieces = Split(pieces(1), ":")

    stringToDate = DateSerial(datePieces(2), datePieces(1), datePieces(0)) _
                 + TimeSerial(timePieces(0), timePieces(1), timePieces(2))
End Function
1 голос
/ 10 мая 2019

Сравнивает элементы time двух строк (вычитая одну из другой) и возвращает разницу в формате часов, минут и секунд:

Dim starttime As String
Dim endtime As String

starttime = "01/04/2019 11:32:45"
endtime = "01/04/2019 11:38:13"

timedif = TimeValue(endtime) - TimeValue(starttime)
Debug.Print Format(timedif, "hh:MM:ss")

Если вы хотите, чтобы отдельные дней также , вы можете использовать:

timedatedif = (DateValue(endtime) + TimeValue(endtime)) - (DateValue(starttime) +TimeValue(starttime))
Debug.Print Format(timedatedif, "dd:hh:MM:ss")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...