我需要每个月更新一下我的数据库中的一些用户记录(具体来说,给他们属于他们的订阅的积分),从他们注册的那天开始。我想这样做:
每天一次......
听起来很简单,但比它简单。问题是几个月并不总是有相同的天数。例如,如果有人注册3月31日,他应该何时更新? 4月30日,5月1日?或者我应该简单地将更新天数的范围限制在最低的常见范围28?我当然可以在第一天为大家做,虽然那不太理想。
你有经验与这样的情况分享?我正在使用Java + JPA + Hibernate中的MySQL 5。如果它有帮助,我已经在使用JodaTime了。
答案 0 :(得分:1)
如果使用弹簧,Spring scheduling就是你可以看到的。你可以有这样的方法:
@Scheduled("0 0 1 * *") // cron expression
public void executeOnceAMonth() {
}
并且只有<task:annotation-driven />
(有关配置的更多详细信息 - 在链接文档中)
这实际上是对Quartz的抽象,因此您也可以使用Quartz作业来完成它。
答案 1 :(得分:0)
您是否可以在每月20日(或其他任何时间)运行预定作业并计算每个用户的学分?
如果不是非常必要的话,我不会用偏移和东西使情况复杂化。
答案 2 :(得分:0)
而是有一个列'next_update_time',所以当用户注册时,列值应该用一个月后的时间更新
Calendar cal = Calendar.getInstance();
cal.add(Calendar.MONTH, 1);
cal.getTime();
每隔几个小时运行一个cronjob(调用另一个小的java代码)来检查具有next_update_time&gt; =当前时间的列,如果是,则更新记录并将next_update_time值设置为下个月。
答案 3 :(得分:0)
按照以下代码获取当月的最大日期。
Calendar calendar = Calendar.getInstance();
java.sql.Date userSignupdate = ...;
calendar.setTimeInMillis( userSignupdate );
// maxDay will hold the maximum date of the month. {28,29,30,31}
int maxDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
答案 4 :(得分:0)
我不明白为什么在这个月的第一天这样做不太理想。特别是如果你给予每个用户同一日期的部分功劳
根据我的经验,处理此问题的最简单方法是将每个用户“规范化”到他们加入时的第一个月。因此,如果有人在6月15日加入,他们会得到一个
1-(15/30)x monthly_credits credit。
从那时起,这是本月的第一天。
注意,如果您希望将用户分散到特定原因,可以使用类似的方法将用户分配到不同的日期(1-28)。