Update
This commit is contained in:
		@@ -0,0 +1,113 @@
 | 
			
		||||
package io.izzel.taboolib.util.lite.cooldown;
 | 
			
		||||
 | 
			
		||||
import java.util.Calendar;
 | 
			
		||||
import java.util.function.Function;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @Author sky
 | 
			
		||||
 * @Since 2020-02-18 14:13
 | 
			
		||||
 */
 | 
			
		||||
public enum RealTime {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 周日开始,周六结束
 | 
			
		||||
     */
 | 
			
		||||
    START_IN_SUNDAY(r -> {
 | 
			
		||||
        Calendar time = Calendar.getInstance();
 | 
			
		||||
        switch (r.unit) {
 | 
			
		||||
            case HOUR: {
 | 
			
		||||
                // 重置日期
 | 
			
		||||
                time.set(Calendar.MILLISECOND, 0);
 | 
			
		||||
                time.set(Calendar.SECOND, 0);
 | 
			
		||||
                time.set(Calendar.MINUTE, 0);
 | 
			
		||||
                // 推进日期
 | 
			
		||||
                time.add(Calendar.HOUR, r.value);
 | 
			
		||||
                return time.getTimeInMillis();
 | 
			
		||||
            }
 | 
			
		||||
            case DAY: {
 | 
			
		||||
                // 重置日期
 | 
			
		||||
                time.set(Calendar.MILLISECOND, 0);
 | 
			
		||||
                time.set(Calendar.SECOND, 0);
 | 
			
		||||
                time.set(Calendar.MINUTE, 0);
 | 
			
		||||
                time.set(Calendar.HOUR_OF_DAY, 0);
 | 
			
		||||
                // 推进日期
 | 
			
		||||
                time.add(Calendar.DAY_OF_YEAR, r.value);
 | 
			
		||||
                return time.getTimeInMillis();
 | 
			
		||||
            }
 | 
			
		||||
            case WEEK: {
 | 
			
		||||
                // 重置日期
 | 
			
		||||
                time.set(Calendar.MILLISECOND, 0);
 | 
			
		||||
                time.set(Calendar.SECOND, 0);
 | 
			
		||||
                time.set(Calendar.MINUTE, 0);
 | 
			
		||||
                time.set(Calendar.HOUR_OF_DAY, 0);
 | 
			
		||||
                time.set(Calendar.DAY_OF_WEEK, 1);
 | 
			
		||||
                // 推进日期
 | 
			
		||||
                time.add(Calendar.WEEK_OF_YEAR, r.value);
 | 
			
		||||
                return time.getTimeInMillis();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return 0L;
 | 
			
		||||
    }),
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 周一开始,周日结束
 | 
			
		||||
     */
 | 
			
		||||
    START_IN_MONDAY(r -> {
 | 
			
		||||
        Calendar time = Calendar.getInstance();
 | 
			
		||||
        switch (r.unit) {
 | 
			
		||||
            case HOUR: {
 | 
			
		||||
                // 同上处理
 | 
			
		||||
                return START_IN_SUNDAY.next.apply(r);
 | 
			
		||||
            }
 | 
			
		||||
            case DAY: {
 | 
			
		||||
                // 同上处理
 | 
			
		||||
                return START_IN_SUNDAY.next.apply(r);
 | 
			
		||||
            }
 | 
			
		||||
            case WEEK: {
 | 
			
		||||
                // 判断周日
 | 
			
		||||
                if (time.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
 | 
			
		||||
                    // 推进日
 | 
			
		||||
                    time.add(Calendar.DAY_OF_YEAR, 1 + ((r.value - 1) * 7));
 | 
			
		||||
                } else {
 | 
			
		||||
                    // 推进周
 | 
			
		||||
                    time.add(Calendar.WEEK_OF_YEAR, r.value);
 | 
			
		||||
                    // 重置日
 | 
			
		||||
                    time.set(Calendar.DAY_OF_WEEK, 2);
 | 
			
		||||
                }
 | 
			
		||||
                // 重置时
 | 
			
		||||
                time.set(Calendar.HOUR_OF_DAY, 0);
 | 
			
		||||
                // 重置分
 | 
			
		||||
                time.set(Calendar.MINUTE, 0);
 | 
			
		||||
                // 重置秒
 | 
			
		||||
                time.set(Calendar.SECOND, 0);
 | 
			
		||||
                return time.getTimeInMillis();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return 0L;
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    Function<In, Long> next;
 | 
			
		||||
 | 
			
		||||
    RealTime(Function<In, Long> next) {
 | 
			
		||||
        this.next = next;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取下一周期的起始时间
 | 
			
		||||
     */
 | 
			
		||||
    public long nextTime(RealTimeUnit unit, int value) {
 | 
			
		||||
        return next.apply(new In(unit, value));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    class In {
 | 
			
		||||
 | 
			
		||||
        private RealTimeUnit unit;
 | 
			
		||||
        private int value;
 | 
			
		||||
 | 
			
		||||
        public In(RealTimeUnit unit, int value) {
 | 
			
		||||
            this.unit = unit;
 | 
			
		||||
            this.value = value;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -0,0 +1,24 @@
 | 
			
		||||
package io.izzel.taboolib.util.lite.cooldown;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @Author sky
 | 
			
		||||
 * @Since 2020-02-18 14:16
 | 
			
		||||
 */
 | 
			
		||||
public enum RealTimeUnit {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 以时为单位
 | 
			
		||||
     */
 | 
			
		||||
    HOUR,
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 以日为单位
 | 
			
		||||
     */
 | 
			
		||||
    DAY,
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 以周为单位
 | 
			
		||||
     */
 | 
			
		||||
    WEEK
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user