Excel公式根据文本字符串计算时间持续时间,如上午9:00 - 下午12:30


6

我正在尝试开发一个Excel公式,该公式将计算以下格式的时间范围字符串的实际持续时间: 1:00am – 3:00am

根据 本文 它似乎应该像减去两次一样简单。例如,要获得两次(4:55:00)之间的小时,分​​钟和秒,文章说要执行以下操作:

=TEXT(B2-A2,"h:mm:ss")

这是关于我有多远:

=TEXT(RIGHT(B2,SEARCH(" – ",B2))-LEFT(B2,SEARCH(" – ",B2)),"h:mm:ss")

我想知道问题可能是我的文本字符串除了时间之外没有“日期”组件。唯一的解决方案是能够进行减法操作以将日期“捏造”到字符串中吗?或者是否有另一种替代方法,除了单独分解小时和分钟组件并计算持续时间?我还想补偿任何潜在的从上午到下午的时间跨度,如下午9点到凌晨12:00,如果可能的话。


理想情况下,我不想使用超过提到的两个单元格...具有时间帧的单元格,以及具有公式的单元格来计算该时间范围的持续时间。所以,最短的单一配方获胜! :P
purefusion

Answers:


5

这是一个复杂的解决方案。最好只是粘贴它并希望最好,而不是试图坐下来解析这个。

=INT(MOD(MID(B2,FIND(":",B2,FIND("-",B2))-2,2) - LEFT(B2,FIND(":",B2)-1)+(MID(B2,FIND(":",B2,FIND("-",B2))+1,2) - MID(B2,FIND(":",B2)+1,2))/60+IF(MID(B2,FIND("m",B2)-1,1)=MID(B2,FIND("m",B2,FIND("-",B2))-1,1),IF(MID(B2,FIND(":",B2,FIND("-",B2))-2,2) - LEFT(B2,FIND(":",B2)-1)+(MID(B2,FIND(":",B2,FIND("-",B2))+1,2) - MID(B2,FIND(":",B2)+1,2))/60<0,24-IF(LEFT(B2,2)="12",12,0),0),12-IF(AND(MID(B2,FIND(":",B2,FIND("-",B2))-2,2) - LEFT(B2,FIND(":",B2)-1)<>0,MID(B2,FIND(":",B2,FIND("-",B2))-2,2)="12"),12,0)),24)) & ":" & TEXT((MOD(MID(B2,FIND(":",B2,FIND("-",B2))-2,2) - LEFT(B2,FIND(":",B2)-1)+(MID(B2,FIND(":",B2,FIND("-",B2))+1,2) - MID(B2,FIND(":",B2)+1,2))/60+IF(MID(B2,FIND("m",B2)-1,1)=MID(B2,FIND("m",B2,FIND("-",B2))-1,1),IF(MID(B2,FIND(":",B2,FIND("-",B2))-2,2) - LEFT(B2,FIND(":",B2)-1)+(MID(B2,FIND(":",B2,FIND("-",B2))+1,2) - MID(B2,FIND(":",B2)+1,2))/60<0,24-IF(LEFT(B2,2)="12",12,0),0),12-IF(AND(MID(B2,FIND(":",B2,FIND("-",B2))-2,2) - LEFT(B2,FIND(":",B2)-1)<>0,MID(B2,FIND(":",B2,FIND("-",B2))-2,2)="12"),12,0)),24)-INT(MOD(MID(B2,FIND(":",B2,FIND("-",B2))-2,2) - LEFT(B2,FIND(":",B2)-1)+(MID(B2,FIND(":",B2,FIND("-",B2))+1,2) - MID(B2,FIND(":",B2)+1,2))/60+IF(MID(B2,FIND("m",B2)-1,1)=MID(B2,FIND("m",B2,FIND("-",B2))-1,1),IF(MID(B2,FIND(":",B2,FIND("-",B2))-2,2) - LEFT(B2,FIND(":",B2)-1)+(MID(B2,FIND(":",B2,FIND("-",B2))+1,2) - MID(B2,FIND(":",B2)+1,2))/60<0,24-IF(LEFT(B2,2)="12",12,0),0),12-IF(AND(MID(B2,FIND(":",B2,FIND("-",B2))-2,2) - LEFT(B2,FIND(":",B2)-1)<>0,MID(B2,FIND(":",B2,FIND("-",B2))-2,2)="12"),12,0)),24)))*60,"00")

编辑: 修复了最后一次的公式。

发表评论:

要添加这些输出,要添加一系列这些输出,您可以使用以下公式:

=TEXT(SUM(VALUE(B2:B3)),"h:mm:ss")

您必须将其作为数组公式输入。输入公式时按Ctrl + Shift + Enter可执行此操作。


这绝对是复杂的!我可以看到一个解决方案来克服公式中的am / pm空间障碍可能会更短,但我离题了。无论如何,我尝试了它,但它确实有效,但是它很有问题,显然对我来说太复杂了! ;)
purefusion

奇怪的错误示例: 1:00am – 10:30am 计算到-1:30, 10:30am – 11:30am 计算到-9:00, 12:30pm – 2:00pm 计算到-11:30,和 7:00pm – 11:30pm 计算到-6:30。我没有仔细检查所有的积极结果是否有效。
purefusion

呃,你说对了!我走进战壕......很快回来......我希望。
Excellll

好的,现在一切都应该正常了。
Excellll

嘿,更新甚至更长!还有更多的错误: 2:30am – 3:00am 计算到 1:004:00am – 7:00am 计算到 1:009:00pm – 3:00am 计算到 1:00 在一个例子和 0:30 在另一个。那是怎么回事?! :P
purefusion

2

如果你可以在“am”或“pm”之前放置一个空格,那么这将有效:

=TEXT(RIGHT(B2,LEN(B2)-SEARCH(" - ",B2)-2) -
 LEFT(B2,SEARCH(" - ",B2)-1),"h:mm:ss")

这是一个基本的,在上午/下午之前不处理任何空间,但它不健壮或完整,因为它不会处理很多边缘情况,只是想把它用来展示一些不同的做事方式。我们需要知道您要解析的所有可能类型的字符串,以提供真正完整的解决方案:

=TEXT((MID(B2,SEARCH(" - ",B2)+3, LEN(B2)-SEARCH(" - ",B2)-4) &  
       IF(ISERROR(SEARCH("am",RIGHT(B2,8))), " pm", " am")) - 
      (LEFT(B2,SEARCH(" - ", B2)-3) & 
       IF(ISERROR(SEARCH("am",LEFT(B2,8)))," pm"," am")),
      "h:mm:ss")

是的,我刚注意到上午/下午之前有一个空格。看起来这样做可能有点复杂。你的公式看起来不错!补偿我尝试导致的任何一端的额外空间。
purefusion

您的方法的总体解决方案可能不再比下面的公式更复杂或更复杂! :)
purefusion

@purefusion,哈,没有人说这是最短的公式比赛!但是,如果你可以将必要的SUBSTITUTE函数放入公式中,那么这可能会更短。我知道Excel虽然限制了公式中SUBSTITUTE的实例数,但由于这个原因,这种方法可能会失败。
Excellll

我检查了。您可以将SUBSTITUTE函数嵌套到此公式中(右边的2个术语,左边的2个术语 - 一个用于“am”,一个用于“pm”)。这也会给你几秒钟的时间。
Excellll

很好!是的,我决定在最后一分钟动摇一些事情......但有时候我希望我能把一个以上的答案标记为正确!我认为总的来说,我会采取一种可以理解的解决方案,而不是“黑魔法”解决方案,但我给你炫耀,Excellll! :P
purefusion

1

Lance Roberts说,你需要在“am”或“pm”之前的空间。

你可以使用这个公式:

=SUBSTITUTE(SUBSTITUTE(B2; "am"; " am"); "pm"; " pm")

然后,试试这个:

=TEXT(TIMEVALUE(RIGHT(B2;SEARCH(" - ";B2;1)))-TIMEVALUE(LEFT(B2;SEARCH(" - ";B2;1)));"h:mm:ss")

啊,你的意思是制作第二个“临时”列来处理am / pm空间插入,然后根据这些临时单元格进行操作?那当然可能比运行它更清洁 SUBSTITUTE 每个实例的功能 B2 在一个巨大,复杂,单一的公式。 ;)
purefusion

不可否认,在某些情况下临时专栏可能不可行(尽管该专栏可能只是隐藏)。
purefusion

1

试试这个公式:

=A2+(A1>A2)-A1

哪里

A1 包含您的“发件人”时间
A2 包含你的“To”时间

然后,您可以使用TEXT函数将其格式化为字符串,
或使用数字格式 [h]:mm:ss

即使时间跨度超过午夜(即下午9:34至凌晨3:45),它也应该工作


首先,正如Lance所提到的,您需要在时间字符串中添加时间与AM / PM表示法之间的空格。

最简单的方法是使用Excel 查找和替换 特征。按 按Ctrl + H ,输入“am” 找什么 然后输入“am”(前面有一个空格) 用。。。来代替 。对“pm”做同样的事。

编辑:[删除嵌套的SUBSTITUTES]嵌套 SUBSTITUTES 毕竟是个坏主意。至少没有添加TRIM。


这是我的另一种矫枉过正的方法。

使用下面的公式创建一个名称(“tt”)(其中$ A1:$ A10是包含时间字符串的范围。

=TRIM(SUBSTITUTE(SUBSTITUTE($A1:$A10,"a"," a"),"p"," p"))

然后使用此公式获取持续时间(基于上面的第一个公式):

=RIGHT(tt,LEN(tt)-FIND("-",tt,1)-1)+
  (LEFT(tt,FIND("-",tt,1)-2)>RIGHT(tt,LEN(tt)-FIND("-",tt,1)-1))-
  LEFT(tt,FIND("-",tt,1)-2)

这根本不起作用,但我进一步研究了它,看起来如此 LEFT(B2,SEARCH(" – ",B2))RIGHT(B2,SEARCH(" – ",B2)) 正在两端保留一个空间,从“ - ”段留下。因此,我正在使用的时间串中有错误的空格。
purefusion

此外,我的时间串使用格式 12:00pm 而不是Excel的期望 12:00 PM 所以看起来它也在抛弃公式,但这似乎是非常混乱/复杂的解决方案。有任何想法吗?
purefusion

我会尽快更新我的答案,以帮助您解析时间字符串。您需要在时间和AM / PM表示法之间添加一个空格。然后使用VALUE让Excel将其解释为时间。
Ellesa

0

最大的问题是时间需要分钟和上午/下午之间的空格: 1:00 am - 3:00 am 要么 9:00 pm - 12:00 am

有了这个,你可以使用公式:

=TIMEVALUE(RIGHT(A1,SEARCH(" - ",A1)))-TIMEVALUE(LEFT(A1,SEARCH(" - ",A1)))+
IF(TIMEVALUE(RIGHT(A1,SEARCH(" - ",A1)))-TIMEVALUE(LEFT(A1,SEARCH(" - ",A1)))<0,1,0)

并将单元格格式化为自定义格式 h:mm:ss

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.