通过减去动态配置的时间单位来获取日期的有效方法

时间:2019-02-21 14:48:39

标签: java

我已安排Jobs读取“合格间隔”以根据可配置的参数扫描足够旧的数据。建议将“旧”标准作为值和Java 7日历单元。示例:

job1.cron=0 10 6 * * *
job1.eligibleinterval.value=5
job1.eligibleinterval.unit=Calendar.DAY   # Job 1's Eligible Data is 5 days old

job2.cron=0 10 6 * * *
job2.eligibleinterval.value=1
job2.eligibleinterval.unit=Calendar.MONTH   # Job 2's Eligible Data is 1 month old

理想情况下,受支持的单位应包括Minutes, Hours, Days, Months, Years(也许不包括Seconds)。

在代码中,必须按以下方式计算截止日期(这是DAY版本的硬编码):

// This hard-codes DAYS
LocalDate localDate = LocalDate.now().minusDays(
   Long.parseLong(poperties.getProperty("job1.eligibleinterval.value")));

我的问题是,是否有一个好的设计解决方案(也许在Java 8中)减去Java 8中动态提供的时间单位,以避免针对不同单位的If/Else决策树?是否有比minusDaysminusMonths更优雅的解决方案? (顺便说一下,minusMinutesminusHours没有快速的方法。)

1 个答案:

答案 0 :(得分:4)

您应该能够使用需要TemporalUnit的{​​{3}}重载 :

long amount = Long.parseLong(properties.getProperty("job1.eligibleinterval.value"));
TemporalUnit unit = ChronoUnit.valueOf(properties.getProperty("job1.eligibleinterval.unit"));

LocalDate localDate = LocalDate.now().minus(amount, unit);

此解决方案要求您的配置文件中的时间单位声明为符合LocalDate.minus()枚举中的常量。