在项目开发中,特别是报表展示的应用场景,我们经常会涉及到一些时间段的处理情况。例如本周,本月,上周,上月这种human reading的显示方式,其后台应转换为一个时间段,本文结合这个需求,提出一种可复用的方法,同时还包括在这个时间段内做一步sub-interval的方法。
基本数据结构
ReportDateRequest
首先从用户角度看,需要接收用户的选择,是一个约定俗成的时间区间,或是自定义的。该Request就封装了用户的时间区间选择,既包括一些固定时间段,也可以是自定义时间段,具体定义如下:
public class ReportDateRequest {
/**
* 时间请求的类型
* @see ReportDateCondition
*/
private int type;
/**
* 自定义情况下的上限(最晚的值)
*/
private long customUpper;
/**
* 自定义情况下的下限(最早的值)
*/
private long customLower;
type的定义使用一个枚举值固定下来,并根据每个值的不同特性,可转化为不同的时间段,如下。
ReportDateCondition
如上所述,RDC定义了可以选择的约定俗成的时间段的基本含义,具体定义如下(未列出构造函数):
public enum ReportDateCondition {
/**
* 任意时间段
*/
CUSTOM(0),
/**
* 当日
*/
TODAY(1),
/**
* 本周
*/
THIS_WEEK(2),
/**
* 上周
*/
LAST_WEEK(20),
/**
* 本月
*/
THIS_MONTH(3),
/**
* 上月
*/
LAST_MONTH(30)
}
枚举值中的code,即用于给前端标记当前用户选择的是何种时间区间。
ReportTimeLimit
有了枚举值,我们就可以将其转化为一种时间上下限,该类就是定义了一种时间上下限,根据每个枚举值可以生成一个ReportTimeLimit类。另外为了满足一些报表需要同比,环比的要求,在该类中再加入同比(上年同时间段)和环比(上日/周/月同时间段)的定义。具体描述如下
public class ReportTimeLimit {
/**
* 当前时间上限
*/
long currentUpper;
/**
* 当前时间下限
*/
long currentLower;
/**
* 环比上限
*/
long momUpper;
/**
* 环比下限
*/
long momLower;
/**
* 同比上限
*/
long yoyUpper;
/**
* 同比下限