我已经安排了作业,根据可配置的参数读取“资格间隔”来扫描足够旧的数据。 “旧”标准被建议为值和 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
理想情况下,支持的单位应包括分钟、小时、天、月、年
(可能不是秒
)。
在代码中,需要按如下方式计算截止日期(这是硬编码的 DAY
版本):
// This hard-codes DAYS
LocalDate localDate = LocalDate.now().minusDays(
Long.parseLong(poperties.getProperty("job1.eligibleinterval.value")));
我的问题是,是否有一个好的设计解决方案(也许在 Java 8 中)可以减去 Java 8 中动态提供的时间单位,以避免不同单位的 If/Else
决策树?有没有比 minusDays
、minusMonths
更优雅的解决方案? (顺便说一句,minusMinutes
或 minusHours
没有快速方法。)
最佳答案
您应该能够使用 LocalDate.minus()
的重载需要一个TemporalUnit
:
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);
此解决方案要求您的配置文件声明的时间单位符合 ChronoUnit
中的常量。枚举。
关于java - 通过减去动态配置的时间单位来获取日期的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54809820/