【问题标题】:Convert string into time and compare 2 of them将字符串转换为时间并比较其中两个
【发布时间】:2019-09-28 11:53:12
【问题描述】:

我有以下字符串:

01/04/2019 11:32:45

01/04/2019 11:38:13

我希望能够比较两个时间,然后将结果添加到单元格中。

我是否更好地使用中间的间隙来拆分字符串,然后尝试将其转换为可读的时间?

最简单的方法是什么?

搜索了几个论坛,对于我认为很简单的任务,它们似乎都略胜一筹

干杯

【问题讨论】:

  • 嗨。你想比较什么?
  • 最终结果我想比较两次之间的差异。我有一大张 2500 多张,我正在苦苦挣扎
  • 并且工作表包含字符串,而不是日期?
  • 日期/时间只是 Excel 中的数字。日期是整数位,时间是分数。
  • 长话短说,我在单个单元格中有单独的成绩单,我已将成绩单的行拆分成一个数组。但需要一种方法来比较数组中的前 2 个日期戳。

标签: excel vba date time


【解决方案1】:

如果您有包含日期​​的字符串,最好将它们转换为真实的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 会将 4 月 1 日与 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

【讨论】:

    【解决方案2】:

    这将比较两个字符串的 时间 元素(从另一个减去一个)并返回格式化为小时、分钟和秒的差异:

    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")
    

    【讨论】:

    • 就是这样,太棒了。如果两个日期不同,它会变得更复杂吗?例如,第一个在 01/04/2019,然后第二个在 02/04/2019 ?还是这仍然有效?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-10
    • 1970-01-01
    • 2014-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-08
    相关资源
    最近更新 更多