反馈已提交

网络繁忙

时间类型计算

  • 文档创建者:Poseidon
  • 历史版本:15
  • 最近更新:Roxy 于 2022-06-09
  • 1. 概述

    1.1 预期效果

    在处理单元格报表时,难免会出现很多单元格之间的计算,我们通常可以使用 DATESUBDATE 函数 来进行计算两个日期的时间差。

    不过有的时候有特殊情况需要精确到 xx 小时 xx 分钟 xx 秒,可以使用下面这种时间类型相加减的公式。

    最终的效果如下:

    222

    1.2 实现思路

    本文提供三种方式。

    方案一:简单的公式时间计算。

    方案二:特殊格式处理后的计算。

    方案三:使用自定义函数计算。

    2. 简单的时间计算

    首先新建报表,在 A2 单元格中输入13:00:00、B2 输入 13:26:00

    C2 单元格输入小时差:HOUR(B2) - HOUR(A2) 

    D2 单元格输入分钟差:MINUTE(B2) - MINUTE(A2)

    因为小时差可能的大于 0,所以 E2 单元格输入实际分钟差:C2 * 60 + D2

    F2 单元格输入最终的时间差:TRUNC(E2 / 60) + "小时" + MOD(E2, 60) + "分钟"

    模板样式如下:

    222

    3. 特殊格式处理

    3.1 时间格式不是标准的 hh:MM:ss 格式

    如果时间格式不是标准的 hh:MM:ss 格式,可用以下公式处理:

    在 A4 单元格中输入 13:50、B4 输入 14:20

    C4 单元格输入小时差:HOUR(FORMAT(TIME(INDEXOFARRAY(SPLIT(B4, ":"), 1), INDEXOFARRAY(SPLIT(B4, ":"), 2), 00), "HH:mm:ss")) - HOUR(FORMAT(TIME(INDEXOFARRAY(SPLIT(A4, ":"), 1), INDEXOFARRAY(SPLIT(A4, ":"), 2), 00), "HH:mm:ss"))

    D4 单元格输入分钟差:MINUTE(FORMAT(TIME(INDEXOFARRAY(SPLIT(B4, ":"), 1), INDEXOFARRAY(SPLIT(B4, ":"), 2), 00), "HH:mm:ss")) - MINUTE(FORMAT(TIME(INDEXOFARRAY(SPLIT(A4, ":"), 1), INDEXOFARRAY(SPLIT(A4, ":"), 2), 00), "HH:mm:ss"))

    因为小时差可能的大于 0,所以 E4 单元格输入实际分钟差:C4 * 60 + D4

    F4 单元格输入最终的时间差:TRUNC(E4 / 60) + "小时" + MOD(E4, 60) + "分钟"

    模板样式如下:

    222

    针对于特殊情况,主要是把时间类型格式化,然后再做处理,最重要的公式还是基本的时间公式 HOUR(),MINUTE() 基础公式。

    3.2 时间格式为 yyyy-mm-dd hh:MM:ss

    如果时间格式为 yyyy-mm-dd hh:MM:ss,还需要对天数进行处理,转化成小时:

    在 A6 单元格中输入 2017-01-20 13:30:30、B6 输入 2017-01-22 11:19:20

    C6 单元格输入小时差:TRUNC((DATETONUMBER(B6) - DATETONUMBER(A6)) / 1000 / 60 / 60) + "小时"

    D6 单元格输入分钟差:TRUNC((DATETONUMBER(B6) - DATETONUMBER(A6)) / 1000 / 60) - TRUNC((DATETONUMBER(B6) - DATETONUMBER(A6)) / 1000 / 60 / 60) * 60 + "分"

    E6 单元格输入秒数差:if(right(B6, 2) - right(A6, 2) > 0, right(B6, 2) - right(A6, 2), right(B6, 2) - right(A6, 2) + 60) + "秒"

    F6 单元格输入最终的时间差:C6 + D6 + E6

    模板样式如下:

    222

    同时我们也可以使用一些其他公式来获取时间值,例如:

    小时差:DATESUBDATE(B6, A6, "h") + "时"

    分钟差:DATESUBDATE(B6, A6, "m") - DATESUBDATE(B6, A6, "h") * 60 + "分"

    秒数差:DATESUBDATE(B6, A6, "s") - (DATESUBDATE(B6, A6, "m") - DATESUBDATE(B6, A6, "h") * 60) * 60 - DATESUBDATE(B6, A6, "h") * 60 * 60 + "秒"

    4. 自定义函数

    如果感觉公式嵌套太繁琐,可以直接 自定义函数,计算时间差即传递 2 个时间段直接相加减。

    DateDiff 函数源码详见:

    https://code.fanruan.com/demo/example/src/branch/persist/10.0/src/main/java/com/fr/function/DateDiff.java

    4.1 编译自定义函数

    编译 DateDiff.java 生成DateDiff.class文件拷贝至报表应用所在目录%FR_HOME%\webapps\webroot\WEB-INF\classes\com\fr\function下。

    4.2 注册自定义函数

    编译完成后,选择服务器>函数管理器,添加 DateDiff 函数,如下图所示:

    222

    4.3 使用自定义函数

    新建模板,给单元格添加公式DateDiff(TODATE("2017-01-20 13:30:30"),TODATE("2017-01-22 11:19:20"),"h{2}小时m{2}分s{2}秒"),使用方法如下:

    222


    附件列表


    主题: 二次开发
    已经是第一篇
    已经是最后一篇
    • 有帮助
    • 没帮助
    • 只是浏览
    中文(简体)

    鼠标选中内容,快速反馈问题

    鼠标选中存在疑惑的内容,即可快速反馈问题,我们将会跟进处理。

    不再提示

    10s后关闭



    AI

    联系我们
    在线支持
    获取专业技术支持,快速帮助您解决问题
    工作日9:00-12:00,13:30-17:30在线
    页面反馈
    针对当前网页的建议、问题反馈
    售前咨询
    采购需求/获取报价/预约演示
    或拨打: 400-811-8890 转1
    qr
    热线电话
    咨询/故障救援热线:400-811-8890转2
    总裁办24H投诉:17312781526
    提交页面反馈
    仅适用于当前网页的意见收集,帆软产品问题请在 问答板块提问前往服务平台 获取技术支持