1. 概述
在使用 FineReport 进行可视化展示时,经常会需要对日期数据进行处理,本文介绍几种日期类型数据的处理应用场景。
2. 获取月份或日期的时候显示 2 位
2.1 问题描述
在使用公式month()或者是day()时,如果月份或日期是一位数,则显示出来的也只有一位数,比如说 1 月 9 号,获取月份时显示的是 1,而不是 01,获取日期时,显示的是 9,而不是 09,如果需要获取到 01 或者是 09,这个该如何通过公式实现呢?
2.2 解决方案
通过公式或者自定义函数实现。
2.3 操作步骤
2.3.1 公式实现
1)使用 RIGHT、CONCATENATE、MONTH 组合函数实现。
例如显示当前时间(2021-08-31)对应的月份和天数且以两位数字显示。
在单元格分别输入:
月份公式:=right(concatenate('0',month(today())),2)
天数公式:=right(concatenate('0',day(today())),2)
公式说明:
公式 | 说明 |
---|---|
concatenate('0',month(today())) concatenate('0',day(today())) | 通过 concatenate 将获取到的月份或者天数前面拼接一个 0,比如说 11 月,则显示 011,如果是 2 月,则显示 02;如果是 31 号,则显示 031 |
right(concatenate('0',month(today())),2) right(concatenate('0',day(today())),2) | 通过 right 方法,获取右边的 2 位数字,比如说 2 月,截取 2 位数字,则为 02,比如 12 月,截取右边的两位,则为 12;比如 31号,则截取右边的两位 31 |
效果查看:
2)通过 FORMAT 来格式化字符串。
在单元格分别输入:
月份公式:=FORMAT(MONTH("2021-08-31"), "00")
天数公式:=FORMAT(day("2021-08-31"), "00")
公式说明:
公式 | 说明 |
---|---|
MONTH("2021-08-31") day("2021-08-31") | 返回月份数字:8 返回天数数字:31 |
FORMAT(MONTH("2021-08-31"), "00") FORMAT(day("2021-08-31"), "00") | 返回 format 格式,也就是字符串格式 |
效果查看:
2.3.2 自定义函数实现
也可通过自定义函数实现,代码如下:
package com.fr.function;
import com.fr.script.AbstractFunction;
public class Add0 extends AbstractFunction {
public Object run(Object[] args) {
String result = args[0].toString();
if(result.length() == 1)
result = '0' + result;
return result;
}
}
自定义函数的详细定义步骤请参照 自定义函数。
3. 利用日期函数生成特定编号
有些情况下需要生成特定字符且带「年月日时分秒」这样的字符串,类似 china20170726144516 这样的编号,可以直接利用时间公式和字符串拼接函数来实现。
在单元格中写入公式:="china" + FORMAT(now(), "yyyMMddhhmmss") 结果为:china20180101124516,即字符串“china”后面加当前的「年月日时分秒」。
注:一般编号非必要的情况下,不要全用数字,因为在导入导出到 EXCEL 时数字有可能出错。