zhub-client/src/main/java/net/tccn/timer/scheduled/ScheduledCycle.java

80 lines
2.5 KiB
Java

package net.tccn.timer.scheduled;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalUnit;
/**
* @author: liangxianyou at 2018/8/5 18:05.
*/
public class ScheduledCycle implements Scheduled {
private LocalDateTime theTime;
private long period;
private TemporalUnit unit = ChronoUnit.MILLIS;
private ScheduledCycle() {
}
public static Scheduled of(String periodCfg) {
TemporalUnit unit = ChronoUnit.MILLIS;
String endchar = "";
long period;
if (periodCfg.matches("^\\d+[y,M,d,H,m,s]$")) {
endchar = periodCfg.substring(periodCfg.length() - 1);
period = Long.parseLong(periodCfg.substring(0, periodCfg.length() - 1));
} else if (periodCfg.matches("^\\d+$")) {
period = Long.parseLong(periodCfg);
if (period <= 0) {
throw new IllegalArgumentException(String.format("ScheduledCycle period config error: [%s]", periodCfg));
}
} else {
throw new IllegalArgumentException(String.format("ScheduledCycle period config error: [%s]", periodCfg));
}
if ("y".equals(endchar)) unit = ChronoUnit.YEARS;
else if ("M".equals(endchar)) unit = ChronoUnit.MONTHS;
else if ("d".equals(endchar)) unit = ChronoUnit.DAYS;
else if ("H".equals(endchar)) unit = ChronoUnit.HOURS;
else if ("m".equals(endchar)) unit = ChronoUnit.MINUTES;
else if ("s".equals(endchar)) unit = ChronoUnit.SECONDS;
return of(period, unit);
}
public static Scheduled of(long period) {
return of(period, ChronoUnit.MILLIS);
}
public static Scheduled of(long period, TemporalUnit unit) {
LocalDateTime theTime = LocalDateTime.now().plus(period, unit);
return of(theTime, period, unit);
}
public static Scheduled of(LocalDateTime startTime, long period) {
return of(startTime, period, ChronoUnit.MILLIS);
}
public static Scheduled of(LocalDateTime startTime, long period, TemporalUnit unit) {
ScheduledCycle scheduled = new ScheduledCycle();
scheduled.theTime = startTime;
scheduled.period = period;
scheduled.unit = unit;
return scheduled;
}
@Override
public LocalDateTime nextTime() {
if (theTime.isAfter(LocalDateTime.now())) {
return theTime;
}
return theTime = theTime.plus(period, unit);
}
@Override
public LocalDateTime theTime() {
return theTime;
}
}