package com.sohu.cache.util; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.Random; /** * 调度相关的工具类 * <p/> * Created by yijunzhang on 14-6-10. */ public class ScheduleUtil { private static final Logger LOGGER = LoggerFactory.getLogger(ScheduleUtil.class); private static final String COLLECT_TIME_FORMAT = "yyyyMMddHHmm"; private static final String DATE_FORMAT = "yyyyMMdd"; /** * cron表达式:每分钟,根据appId计算分钟的秒数 * * @param appId * @return */ public static String getMinuteCronByAppId(long appId) { String baseCron = (appId % 50) + " 0/1 * ? * *"; return baseCron; } public static String getMachineStatsCron(long hostId) { String baseCron = (hostId % 50) + " 0/" + ConstUtils.MACHINE_STATS_CRON_MINUTE + " * ? * *"; return baseCron; } public static String getFiveMinuteCronByHostId(long hostId) { String baseCron = (hostId % 50) + " 0/5 * ? * *"; return baseCron; } public static String getRedisSlowLogCron(long appId) { Random random = new Random(); String baseCron = random.nextInt(60) + " 0/20 * ? * *"; return baseCron; } /** * cron表达式:每小时,根据hostId计算小时的分钟数 * * @param hostId * @return */ public static String getHourCronByHostId(long hostId) { String hourCron = "0 %s 0/1 ? * *"; Random random = new Random(); long minute = (hostId + random.nextInt(Integer.MAX_VALUE)) % 60; return String.format(hourCron, minute); } /** * 计算前一分钟的时间,并格式化 * * @param collectTime 基准时间 * @return */ public static long getLastCollectTime(long collectTime) { SimpleDateFormat simpleDateFormat = new SimpleDateFormat(COLLECT_TIME_FORMAT); try { Date date = simpleDateFormat.parse(String.valueOf(collectTime)); Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.add(Calendar.MINUTE, -1); Date lastDate = calendar.getTime(); return Long.valueOf(simpleDateFormat.format(lastDate)); } catch (ParseException e) { LOGGER.error(e.getMessage(), e); return 0L; } } /** * 格式化时间 * * @param date * @return */ public static long getCollectTime(Date date) { SimpleDateFormat simpleDateFormat = new SimpleDateFormat(COLLECT_TIME_FORMAT); return Long.valueOf(simpleDateFormat.format(date)); } /** * 返回某一天的起始时间,如:201406300000 * * @param date 当前日期 * @param offset 针对当前日期的偏移 * @return 日期的long形式,如201406300000 */ public static long getBeginTimeOfDay(Date date, int offset) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.add(Calendar.DAY_OF_YEAR, offset); date = calendar.getTime(); SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT); return Long.valueOf(dateFormat.format(date) + "0000"); } }