我有一个名为
的列 duty_counter
存储每个月工作的人数。
reset_date
存储上次重置日期。
我使用以下sql获取reset_date并将其设置为curr date
select distinct TO_CHAR(reset_date,'DD')as day,TO_CHAR(reset_date,'HH24')as hour,TO_CHAR(reset_date,'mi')as min from hr_mgt;
将此处的输出视为日期12,小时18,分钟00。
让我们说,每个月的第5天,duty_counter_column
只应重置为零一次。
Calendar reqDate = Calendar.getInstance();
reqDate.set(Calendar.DAY_OF_MONTH, Integer.valueOf(4));
reqDate.set(Calendar.HOUR_OF_DAY, Integer.valueOf(23));
reqDate.set(Calendar.MINUTE, Integer.valueOf(59));
Calendar currDate = Calendar.getInstance();
currDate.set(Calendar.DAY_OF_MONTH, Integer.valueOf(12));
currDate.set(Calendar.HOUR_OF_DAY, Integer.valueOf(18));
currDate.set(Calendar.MINUTE, Integer.valueOf(00));
System.out.println("reqDate : " + reqDate.toString());
System.out.println("currDate : " + currDate.toString());
if (currDate.equals(reqDate) || currDate.after(reqDate)) {
System.out.println("Reached the Req Date , reset the counter");
}
但是目前每当调度程序在每月5日之后运行时,它就会重置职责计数器。如何使这段代码每月5日只运行一次?
感谢您的建议和时间。
答案 0 :(得分:2)
您使用的Calendar
课程已过时。 JSR 310,现代Java日期和时间API(也称为java.time
)通常可以更好地使用。
/** On what day of each month should the count be reset? 1..28 */
private static final int DAY_OF_MONTH_TO_RESET_COUNT = 5;
/** In what time zone should above day-of-month be interpreted? */
private static final ZoneId timeZone = ZoneId.of("Asia/Pontianak");
public static void resetIfDue() {
// substitute reset_date from DB here
LocalDate lastResetDate = LocalDate.of(2017, Month.DECEMBER, 5);
LocalDate nextResetDate = lastResetDate.plusMonths(1)
.withDayOfMonth(DAY_OF_MONTH_TO_RESET_COUNT);
LocalDate today = LocalDate.now(timeZone);
// "not after today" means today or before today
if (! nextResetDate.isAfter(today)) {
System.out.println("Reset the count and update the reset_date in the database");
}
}
你是否同意这段代码不仅更短,而且比你的更优雅,更清晰?
在Java 1.7上,获取ThreeTen Backport并从org.threeten.bp
包导入类,上面的代码将起作用。从数据库中获取重置日期java.sql.Date
;例如,ResultSet.getDate()
会给你。然后立即使用DateTimeUtils.toLocalDate(sqlDateFromDatabase)
将其转换为LocalDate
以获取上述代码。使用Java 8,您可以直接从结果集中获取LocalDate
。
您需要决定是否将重置日期更新为计算的下一个重置日期,今天的日期或其他内容。我把它留给你。
我建议您为时区敏感操作提供明确的时区,例如获取今天的日期。所以如果不是亚洲/坤甸,请填写您的时区。要使用JVM的时区设置,请使用ZoneId.systemDefault()
。请注意,您的程序的其他部分或在同一JVM中运行的其他程序可能会更改该设置,因此如果有一天您遇到更新发生得太早或太晚,这可能是错误的来源。