【问题标题】:How to mathematically extract milliseconds, seconds and minutes from a serial date with an Excel-formula?如何使用 Excel 公式从序列日期中以数学方式提取毫秒、秒和分钟?
【发布时间】:2012-09-12 10:57:26
【问题描述】:

如何在不使用(我相信)舍入或单元格格式的SECOND() 函数的情况下计算 Excel 串行日期/时间中的秒数,如下例中的链接?我怎样才能将它延长几分钟?

下面底部示例的序列值(图像中的最后一行)是:

     Right: 41165.4444365394
     Left: 41165.4444321412

上面的例子是用下面的两个公式进行条件格式化的(打开 stop if true,并显示 优先顺序)。

在我看来,second 函数看不到 10:39:5810:39:59 之间的区别,因此与 'Display only seconds' 分辨率不匹配,并继续'显示毫秒分辨率',因为我对毫秒的计算工作正常。

    To see if the seconds are different, first: =SECOND($B2)<>SECOND($C2)
    To see if only milliseconds have passed between the two times:
    =ROUND(($B2*86400-INT($B2*86400))*1000,0)<>ROUND(($C2*86400-INT($C2*86400))*1000,0)

我应该将序列号与什么相乘以提供不四舍五入的秒数和分钟数(分别)?

【问题讨论】:

  • 您能否再次澄清一下:您不想要无拘无束的分钟或秒吗?这是您工作的日期:13.09.2012 10:39:59?是你计算的 371 毫秒还是 3556694399.371,这是我通过你的公式得到的。
  • 如果您正在使用公式或 VBA 或两者并提供更多关于整个过程的细节,是否愿意扩展?您知道您可以将“ss”作为单元格格式,即仅显示秒数 - 或“ss.000”以显示秒数和毫秒。
  • 顺便说一句,从这里得到它:stackoverflow.com/questions/3095407/…
  • @Jook - 我不能使用 VBA。我将编辑我的帖子。

标签: excel datetime excel-2007


【解决方案1】:

尝试使用FLOOR函数进行区分,即

=FLOOR($B2,"0:00:01")&lt;&gt;FLOOR($C2,"0:00:01")

这也可以区分秒数相同但分钟数不同的时间。

编辑:这将做同样的事情

=INT($B2*86400)&lt;&gt;INT($C2*86400)

【讨论】:

  • 带有“0:00:01”的部分->这不应该是要四舍五入的部分数吗? - 否则,很好,我知道我错过了一些地方^^
  • 感谢 Jook,“0:00:01”是一个时间值 - 1 秒 - 因此使用 FLOOR 和该值会将时间向下舍入到前一整秒,因此它将区分 @ 987654324@ 和12:34:57.001。同样你可以使用CEILING
  • .....您也可以使用带有 INT 的较短版本......编辑了我的答案
  • 我能澄清一下吗?我建议的公式是否适合您的需要,或者您是否需要它来做一些不同的事情……或者您只是想了解它是如何工作的?您在 B10 中的日期/时间存储为数字,在这种情况下,41162.3726578357 整数部分是日期(自 1900 年 1 月 1 日以来的天数),小数部分是时间。如果您使用 =MOD(B10,1) 仅提取小数部分,即 0.3726578357,则将其乘以 86400 即可得出当天的秒数(从午夜开始),即 32197.64 - INT 然后将其四舍五入为 32197。
  • 要从上面提取 57 和 41,或者使用这个版本=SECOND($B2-1/86400/2) - 从你的时间值中减去半秒然后取 SECOND 值,扣除抵消了 SECOND 的固有四舍五入。 ..或使用此公式=INT(MOD($B2*86400,60)) - B2*86400 获得总秒数,MOD 除以 60 时为您提供读数,有效去除分钟,INT 再次向下舍入
【解决方案2】:

你快到了,试试这个:

B2 = 41165.4444365394
C2 = 41165.4444321412

=(VALUE(TEXT(B2,"ss.000"))-ROUND(MOD(B2*86400,INT(B2*86400)),3))<>(VALUE(TEXT(C2,"ss.000"))-ROUND(MOD(C2*86400,INT(C2*86400)),3)


VALUE(TEXT(B2,"ss.000")) -> gives you 59,317

VALUE(TEXT(C2,"ss.000")) -> gives you 58,937

MOD(B2*86400,INT(B2*86400)) 
-> is more appropriate here than substracting, but basically the same thing

编辑: 只使用数学

我对此不是 100% 确定,但时间值不像毫秒那样直接,这就是原因:

excel 将像 1.00001 这样的值解释为 1 月 1 日。1900 年 00:00:01。

.之前的部分是日期,之后的部分是时间。

不幸的是,时间介于 0.00000 和 0.99999 之间,但您的平均一天只有 86400 秒 - 所以 0.0000115740740740741 是它们之间的因数。

将 0.00038 除以该因子或将其与 86400 相乘,得到 32.832 - 四舍五入为 33 秒,就像 excel 一样。您可以使用它来获取给定时间内的秒数。

编辑:

这是我现在的最终解决方案

=INT(MOD(B2,INT(B2))/0.0000115740740740741))

这会将您的任何时间转换为秒,这样您就可以在没有文本格式的情况下通过它们进行比较 - 像这样:

  =INT(MOD(B2,INT(B2))/0.0000115740740740741))<>INT(MOD(C2,INT(C2))/0,0000115740740740741))

你不用担心ms,他们会被INT截断。

哦,这是我的来源,它给了我正确的线索:

http://support.microsoft.com/kb/214094/EN-US

编辑感谢 barry houdini,我将添加一些额外信息:

=INT(MOD(B2,INT(B2))/0.0000115740740740741)
=INT(MOD(B2,INT(B2))*86400)
=INT(MOD(B2,1)*86400)
-> 38399 seconds of the day, without ms
-> shows only time differences regardless of date
=MOD(B2,1)*86400
-> 38399.317 seconds of the day, with ms
=INT(B2*86400)
-> 3556697399 seconds since 1.1.1900
-> shows time & date differences

=INT(MOD(B2*24*60*60,60)) (=INT(MOD(B2*86400,60)))
-> 59 seconds, regardless of time & date, only the current seconds part
=INT(MOD(B2*24*60,60))
-> 39 minutes
=INT(MOD(B2*24,60))
-> 10 hours

【讨论】:

  • 谢谢,但我想学习如何在不使用格式化函数的情况下计算秒数。至于 Mod,我已经阅读了(现在不方便)关于它在与某种形式的日期一起使用时如何失败的线程(不记得具体细节,但希望你知道我的意思)。一定有一种方法可以用纯数学来计算,不是吗?
  • 谢谢@Jook。我会跟进,直到您在解释中引入 0,00038。这是一个任意值,还是通过上一步得出的?
  • 是的 - 我通过设置两个值从 0,00001 到 0,99999 的列来测试这一点 - 并将它们格式化 - 一个作为数字,一个作为时间。然后选择 0,00038 来测试我的公式。
  • 再次感谢,我想你快到了,但是当我 c&p =ROUND(MOD(B2,INT(B2))/0,0000115740740740741)),0) 进入电子表格作为测试时,它在抱怨(我想到 0,0000115740740740741 中的 ,​​ 虽然我不知道如何解决它。
  • 哦,是的 - 你的英语在 0,00001 中必须是 . 而不是 , - 但是 houdini 用更好的解决方案让我感到惊讶
猜你喜欢
  • 2010-12-22
  • 2012-06-08
  • 2013-07-04
  • 1970-01-01
  • 1970-01-01
  • 2018-12-25
  • 2017-10-29
  • 2016-07-02
  • 2020-09-04
相关资源
最近更新 更多