Tpos
Tpos是一款笔者早期开发的用于计算时间位置的工具。在开发系统的过程中,我们经常会遇到需要指定时间位置的需求。比如:在任务调度系统中,我们需要指定任务的执行周期。如要求任务在每天早晨10点执行;要求任务在20分钟后执行等。这类时间定位需求目前已经有了比较好的解决办法,就是开源任务调度框架Quartz提供的Cron表达式。Cron表达式非常灵活,能够覆盖我们常用的几乎所有的任务调度需求。但它也存在自己的时间表示边界。首先它是为任务调度设计的,它的时间表示更多是后向的,即更多是表示未来的时间,方便我们指定任务在未来的某个时刻被调度执行。但对于某些前向的时间定位需求它就不能很好的支持了。如我们需要访问一段数据,数据范围是从现在到过去的某一个时刻,5分钟前,1周前等等。这类前向时间需求往往会和后向时间需求一起出现,如:有一个数据统计任务,它要求在每周一早上执行,统计上一周的数据。那么任务调度的时间需求是后向的,而数据访问的时间需求是前向的,即数据范围为当前时间到7天前。
Tpos表达式
为能更好的解决前向时间的定位问题,Tpos工具应运而生。Tpos支持Tpos表达式,格式如下:
($Now|$CurrentYear|…) [(+|-) num(y|m|w|d|h|mi|s)]+
表达式的第一部分($Now|$CurrentYear|…),表示基准时间,一般由时间保留字或时间字符串表示。如:$Now为一个时间保留字,表示当前时间,时间精确到秒。除$Now外还有$CurrentYear、$CurrentMonth、$CurrentWeek、$CurrentDay、$CurrentHour、$CurrentMinute六个时间保留字。它们分别表示当前年,当前月,当前周,当前日,当前小时,当前分钟。当前年除年份是当前以外,月,日为1月1日,时、分、秒为0时0分0秒。其它时间保留字也已此规则填充。如当前时间为“2019-09-01 12:20:11”,则$CurrentYear代表的时间为“2019-01-01 00:00:00”;$CurrentMonth代表的时间为“2019-09-01 00:00:00”,我们举例的时间刚好是9月1日,若举例时间为9月2日,则当月时间仍是2019年9月1日零时零分零秒;$CurrentWeek代表的时间为“2019-08-26 00:00:00”,2019年9月1日是周日,按中国人的习惯是周末,而这周的的第一天是周一即8月26日;$CurrentDay代表的时间为“2019-09-01 00:00:00”;$CurrentHour代表的时间为“2019-09-01 12:00:00”;$CurrentMinute代表的时间为“2019-09-01 12:20:00”;$Now代表的时间即“2019-09-01 12:20:11”。除可采用时间保留字定位基准时间外,还可以用一个时间字符串来做时间的基准定位。时间字符串的格式为"yyyy-MM-dd HH:mm:ss",如:“2019-09-01 12:20:11”等。时间字符串可以是任意的时间,但格式必须符合规定的时间格式。
表示式的第二部分为相对时间部分,它可以相对基准时间前向或后向按年、月、周、日、时、分、秒进行移动。当需要前向移动时使用“-”号;需要后向移动时使用“+”号。num表示要移动的数量,而字符y|m|w|d|h|mi|s则表示移动的单位,分别对应年、月、周、日、时、分、秒。相对时间部分可以是一个表达式,它支持各种移动的组合表达,如后向移动1个月零5天,可写为 “+1m + 5d”。使用者可根据自己的需要任意组合。
完整的Tpos表达式示例如下:
- $Now -3m : 表示以当前时间为基准向前偏移3个月
- $CurrentWeek + 4w : 表示以当前周为基准,向后偏移4周
- $CurrentMonth +5d +8h +30mi : 表示以当前月的第一天为基础,向后偏移5天8小时30分
- 2018-07-28 03:24:23 +1y +1m +4d +9h -4mi -12s : 含义就不解释了,这个表达式的结果是“2019-09-01 12:20:11”。需要注意的是,2018-07-28 03:24:23 两端不能有任何包围符。
Tpos应用
Tpos的应用非常简单,如下代码所示:
String exp = "2018-07-28 03:24:23 +1y +1m +4d +9h -4mi -12s";
// 构造表达式
TposExpression tposExpression = new TposExpression(exp);
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// getDate方法求解表达式的时间值
System.out.println(dateFormat.format(tposExpression.getDate()));
除通过构造方法构造Tpos表达式求解时间外,TposExpression类还提供了静态的position方法求解时间,position方法的定义如下:
// 参数date表示基准时间
// 参数adjustExpression表示相对时间表达式,表达式的书写规则同Tpos表达式中的相对时间部分
public static Date position(Date date, String adjustExpression)
关于该方法的调用示例就不演示了,可以参见开源工程:https://github.com/colorknight/tpos.git