【问题标题】:Subtract two dates to get the hourly difference减去两个日期以获得每小时的差异
【发布时间】:2016-08-26 13:46:38
【问题描述】:

给定从字符串格式化的两个 YYYY-MM-DD-HH:MM 日期,我想获取日期之间的小时时差。

这是我的代码:

Dim ds1 As String: ds1 = "March 3, 2015 2:00pm " 
Dim ds2 As String: ds2 = "March 4, 2015 3:00pm " '25 hours difference 

ds1 = Format(ds1, "YYYY-MM-DD-HH:MM") '2015-03-03-14:00
ds2 = Format(ds2, "YYYY-MM-DD-HH:MM") '2015-03-04-15:00

Dim d As Date: d = CDate(ds2) - CDate(ds1) 'gives the 25 hour diffrence

代码在 CDate(ds2) 和 CDate(ds1) 上出现“类型不匹配”错误,因为 CDate 仅适用于日期,而不适用于小时/分钟。

如何获取这些日期之间的小时差?

【问题讨论】:

  • CDate 适用于日期、小时和分钟。因为YYYY-MM-DD-HH:MM 不是CDate 识别的日期时间格式,您会收到类型不匹配错误。将Debug.Print IsDate(ds1) 添加到您的代码以进行验证。如果数据以该格式交给您,您需要将其作为文本字符串解析为 CDate 可以识别的格式。如果要将日期时间转换为该格式,请先计算小时数,然后再进行格式化。

标签: excel vba date


【解决方案1】:

时间间隔不是日期,因此您的变量 d 不应属于 Date 类型。因为你想要几个小时,它应该是一个数字数据类型,比如Long

对于小时差异,您可以使用DateDiff 函数,提供您想要计算差异的单位:

Dim ds1 As String
Dim ds2 As String
Dim d As Long

ds1 = "2015-03-03 14:00"
ds2 = "2015-03-04 15:00"

d = DateDiff("h", CDate(ds1), CDate(ds2))

Debug.Print d ' outputs 25

备注

日期的Format 仅在参数可以转换为日期时才有效,因此您不妨立即对原始字符串执行CDate

如果您可以选择格式,则优先使用"2015-03-03 14:00" 格式(日期和时间部分之间没有连字符)。在我的设置中,如果那里有连字符,则转换失败。

【讨论】:

  • 格式行需要被删除,因为它将它放入 Excel 无法解析为日期的字符串中,或​​者需要删除日期和时间之间的 -
  • 不起作用,它给出的答案是 24 而不是 25。如果我将第二个日期更改为晚上 8 点或晚上 10 点,它仍然给出 24
  • @BDillan 如果您将 Debug.Print d 放在它之后给出 25,至少对我而言。你在用 d 做什么。
  • 25 也适合我。请注意,您的日期格式应在小时前不带连字符:如"2015-03-03 14:00"
  • @ScottCraner 好的,它不起作用,因为我在小时/分钟之间有一个连字符
【解决方案2】:

使用 DateDiff 方法

 Sub test()
   Dim ds1 As String: ds1 = "March 3, 2015 2:00pm "
   Dim ds2 As String: ds2 = "March 4, 2015 3:00pm " '25 hours difference

   ds1 = Format(ds1, "YYYY-MM-DD HH:MM") '2015-03-03-14:00
   ds2 = Format(ds2, "YYYY-MM-DD HH:MM") '2015-03-04-15:00

   Dim d As Date: d = CDate(ds2) - CDate(ds1) 'gives the 25 hour diffrence
   youranswer = DateDiff("h", ds1, ds2)
End Sub

【讨论】:

    【解决方案3】:

    仅供参考:如果您减去 real 日期,则会返回以天为单位的差异。乘以 24(因为一天有 24 小时),你会得到小时的差异。
    例如;

    Print (#03-04-2015 15:00# - #03-03-2015 14:00#) *24 返回 24.9999999999418

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多