JDK版本: openjdk_8_382
hutool版本: 5.8.27-SNAPSHOT
cron:0 0 0 L 2 ?
当指定小月的最后一天时,计算下次时间就会死循环。
里面实现有点复杂,未想到怎么修复,还是大佬们来吧。。。
@Test
public void testNextMatchAfter() {
// 匹配所有月,返回下一月
DateTime date = DateUtil.parse("2022-04-08 07:44:16");
CronPattern pattern = new CronPattern("0 0 0 L 2 ?");
//noinspection ConstantConditions
Calendar calendar = pattern.nextMatchAfter(date.toCalendar());
System.out.println(DateUtil.date(calendar));
}
java.lang.StackOverflowError
at sun.util.calendar.ZoneInfo.getOffsets(ZoneInfo.java:236)
at java.util.GregorianCalendar.computeFields(GregorianCalendar.java:2336)
at java.util.GregorianCalendar.computeFields(GregorianCalendar.java:2308)
at java.util.Calendar.setTimeInMillis(Calendar.java:1804)
at java.util.Calendar$Builder.build(Calendar.java:1508)
at sun.util.locale.provider.CalendarProviderImpl.getInstance(CalendarProviderImpl.java:88)
at java.util.Calendar.createCalendar(Calendar.java:1666)
at java.util.Calendar.getInstance(Calendar.java:1627)
at cn.hutool.cron.pattern.matcher.PatternMatcher.nextMatchAfter(PatternMatcher.java:145)
at cn.hutool.cron.pattern.CronPattern.nextMatchAfter(CronPattern.java:191)
at cn.hutool.cron.pattern.CronPattern.nextMatchAfter(CronPattern.java:152)
at cn.hutool.cron.pattern.CronPattern.nextMatchAfter(CronPattern.java:156)
at cn.hutool.cron.pattern.CronPattern.nextMatchAfter(CronPattern.java:156)
at cn.hutool.cron.pattern.CronPattern.nextMatchAfter(CronPattern.java:156)
DayOfMonthMatcher使用31就表示最后一天,实际有歧义。不好兼容了。感觉得重构下,可参考quartz的CronExpression实现。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
确实是有问题,有31天的大月都正常,其他月份都有问题。
看了源码,个人浅解有两种,如果不对,欢迎指正:
第一种:
枚举里面初始化不用改,因为这个枚举不改,初始化的BoolArrayMatcher里面也不用改;
以上两点不改,那就在具体用的时候改:setToMin()方法,最后for循环把values[]数组填满之后,加一行修改的代码,
或者当part="MONTH"的时候,处理values[i-1]的值;
第二种:
在public PatternMatcher构造器中,处理PartMatcher[] matchers的时候,顺便根据入参的PartMatcher monthMatcher把PartMatcher dayOfMonthMatcher重新覆盖一遍。
以上是我随机在gitee找到这个项目,然后进来看见这个bug,花了两三个小时看了一下源码的理解,如果不正确欢迎指正
登录 后才可以发表评论