【问题标题】:Get the number of seconds from a duration获取持续时间的秒数
【发布时间】:2014-11-09 21:48:21
【问题描述】:

我正在寻求有关从文本中获取秒数的帮助。

这是我在 libreoffice calc 列 A 中的内容:

  • A1:35 天 21 小时 56 分钟
  • A2:3 天 0 小时 54 分钟
  • A3:1 天 3 小时 0 分钟
  • A4:5 小时 26 分钟
  • A5:32 分钟
  • A6:0 秒

我正在寻找一种解决方案(我对 Libreoffice Basic 不满意)从 B 列中的持续时间中获取秒数。问题在于解析列(这被视为文本,并且在数据中对其进行格式化仍然不不行)。我不知道如何拆分单元格以获取例如:35*86400+21*3600+56*60 for cell A1

我尝试使用 libreoffice 工具进行拆分,但如果我在 A 列中没有天数,则会生成例如:5(hours)*86400 等。对于单元格 A4

【问题讨论】:

    标签: time libreoffice duration calc


    【解决方案1】:

    带有 libreoffice API 的 Starbasic:

    function GETSECONDS(s1 as string) as long
     oFuncAccess = createUnoService( "com.sun.star.sheet.FunctionAccess" )
     s1 = oFuncAccess.callFunction("SUBSTITUTE", array(s1, "days", "*24*60*60+"))
     s1 = oFuncAccess.callFunction("SUBSTITUTE", array(s1, "hours", "*60*60+"))
     s1 = oFuncAccess.callFunction("SUBSTITUTE", array(s1, "minutes", "*60+"))
     s1 = oFuncAccess.callFunction("SUBSTITUTE", array(s1, "seconds", "*1+"))
     s1 = left(s1, len(s1)-1)
     lRes = 0
     sAdd = split(s1, "+")
     for i = lbound(sAdd) to ubound(sAdd)
      sMult = split(sAdd(i),"*")
      lResMult = 1
      for j = lbound(sMult) to ubound(sMult)
       lResMult = lResMult * val(sMult(j))
      next
      lRes = lRes + lResMult
     next 
     getSeconds = lRes
    end function
    

    用作 UDF,例如:=GETSECONDS(A1)

    时间测量单位必须是复数形式。

    问候

    阿克塞尔

    【讨论】:

    • TY 效果很好!我没想过用乘法代替我的文字。很Ty
    【解决方案2】:

    你没有说你的首选语言,我可以给你看一个 PHP 的例子。目标是在字符串中只留下数字,然后计算总和。我不知道所有可能的字符串变体,但此代码适用于您的输入。

    $durations = array(
        '35 days 21 hours 56 minutes',
        '3 days 0 hours 54 minutes',
        '1 days 3 hours 0 minutes',
        '5 hours 26 minutes',
        '32 minutes',
        '0 second'
    );
    $constants = array(60, 3600, 86400);
    $durationsTime = array();
    foreach ($durations as $duration) {
        $numbers = preg_replace('/[^0-9\s]/i', '', $duration);
        $values  = explode('  ', $numbers);
        $time    = 0;
        if (count($values) > 1) {
            foreach ($values as $key => $value) {
                $time += $value * $constants[count($values) - $key - 1];
            }
        } else {
            $time = strpos($duration, 'second') !== false ? intval($values[0]) : $values[0] * $constants[0];
        }
    
        $durationsTime[] = $time;
    }
    var_dump($durationsTime);die();
    

    【讨论】:

    • 其实我想知道是否有办法用 libreoffice 做到这一点。但是如果我必须在 Basic 中构建它,我会保留它。感谢您的帮助
    猜你喜欢
    • 2016-04-03
    • 1970-01-01
    • 2016-02-15
    • 2013-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-16
    • 2012-03-14
    相关资源
    最近更新 更多