Excel 将字符串转换为时间并比较其中的两个
我有以下字符串:Excel 将字符串转换为时间并比较其中的两个,excel,vba,date,time,Excel,Vba,Date,Time,我有以下字符串: 01/04/2019 11:32:45 及 我希望能够比较这两个时间,然后将结果添加到单元格中 我最好用中间的空隙来分割字符串,然后试图把它转换成可读的时间? 最简单的方法是什么 搜索了几个论坛,他们似乎都稍微超过了我认为是一个简单的任务顶部 cheers这将比较两个字符串的时间元素(从另一个字符串中减去一个),并返回格式为小时、分钟和秒的差值: Dim starttime As String Dim endtime As String starttime = "01/04
01/04/2019 11:32:45
及
我希望能够比较这两个时间,然后将结果添加到单元格中
我最好用中间的空隙来分割字符串,然后试图把它转换成可读的时间?
最简单的方法是什么
搜索了几个论坛,他们似乎都稍微超过了我认为是一个简单的任务顶部
cheers这将比较两个字符串的时间元素(从另一个字符串中减去一个),并返回格式为小时、分钟和秒的差值:
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")
这将比较两个字符串的时间元素(从另一个字符串中减去一个),并返回格式为小时、分钟和秒的差值:
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")
如果您有包含日期的字符串,最好将其转换为实
date
值
您可以使用函数CDate
将字符串转换为日期,但是,存在相当多的缺陷,例如,根据计算机的区域设置,日期格式(以及日、月和年的顺序)可能会更改,CDate
将尝试遵守这些设置。如果您的代码在世界的另一个地方运行,相同的输入可能会导致不同的日期。这可能是您发现复杂代码的原因,该代码将字符串拆分为多个片段以获取日期的单个部分
日期存储为Double
值。数字的整数部分定义了日期,从1899年12月31日开始。小数部分代表时间。要得到两个日期之间的差值,只需将它们减去即可
现在问题来了,你想如何处理这个差异。您可以编写一个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
获取分钟数的替代方法(注意不同的返回值类型):
当日期不同时,这两个功能将不会出现问题
如果您的输入格式始终为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
如果您有包含日期的字符串,最好将其转换为实
date
值
您可以使用函数CDate
将字符串转换为日期,但是,存在相当多的缺陷,例如,根据计算机的区域设置,日期格式(以及日、月和年的顺序)可能会更改,CDate
将尝试遵守这些设置。如果您的代码在世界的另一个地方运行,相同的输入可能会导致不同的日期。这可能是您发现复杂代码的原因,该代码将字符串拆分为多个片段以获取日期的单个部分
日期存储为Double
值。数字的整数部分定义了日期,从1899年12月31日开始。小数部分代表时间。要得到两个日期之间的差值,只需将它们减去即可
现在问题来了,你想如何处理这个差异。您可以编写一个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
获取分钟数的替代方法(注意不同的返回值类型):
当日期不同时,这两个功能将不会出现问题
如果您的输入格式始终为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
你好你想比较什么?最终结果我想比较两次之间的差异。我有一张2500多张这样的表格,我正在努力工作,表格中包含字符串,而不是日期?日期/时间只是Excel中的数字。日期是整数位,时间是分数。长话短说,我在单独的单元格中有单独的转录本,我将转录本的行分割成一个数组。但是需要一种比较数组中前两个日期戳的方法。嗨。你想比较什么?最终结果我想比较两次之间的差异。我有一张2500多张这样的表格,我正在努力工作,表格中包含字符串,而不是日期?日期/时间只是Excel中的数字。日期是整数位,时间是分数。长话短说,我在单独的单元格中有单独的转录本,我将转录本的行分割成一个数组。但是需要一种方法来比较数组中的前两个日期戳。就是这样,太棒了。如果两个日期不同,会不会变得更复杂?例如,第一次是在2019年4月1日,第二次是在2019年4月2日?或者这还能用吗?就是这样,好极了。如果两个日期不同,会不会变得更复杂?例如,第一次是在2019年4月1日,第二次是在2019年4月2日?还是会