关于时间的操作,写了个util
主要用于预测的时候,时间段的确定
预测的时间段,需要明确的规定范围,由于业务的促销都是整点开始,所以我们的预测时间段,也是从整点开始
所以就要将时间分为多个整段,比如一分钟一段,那么就是2018-06-18 00:00:00 到2018-06-18 00:01:00 就是一段
那么在确定一分钟为一段的前提下,我们就要将这一分钟内所有数据都归到这一分钟内
下面的util就有根据随机时间,确定这个时间是哪个段的
比如:
当前时间是2018-06-18 00:00:30 ,时间段为一分钟
根据下面的的方法,就可以得到2018-06-18 00:00:00和2018-06-18 00:01:00,也就是这个时间所在的时间区域
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;/*** 时间片分割工具类**/
public class TimeUtil {/*** 将一天的时间分割成等分的若干段,获得总段数** @param second 每个时间段的长度,单位秒* @return 返回一天的段数, 结果取加一法的结果*/public static int getAllSplitNums(int second) {return (24 * 60 * 60 - 1) / second + 1;}/*** 根据每段的时间和当前时间,算出当前时间在第几段* 时间段区间默认左闭右开* eg:如果5分钟为一个时间段的话,那么[00:00:00,00:05:00)就在第一段,返回1;[00:05:00,00:10:00)就在第二段,返回2** @param time* @param second* @return*/public static int getOneNum(long time, int second) {int secondNum = getSecondNum(time);return (secondNum - 1) / (second * 1000) + 1;}/*** 根据long类型的时间,获取时分秒的秒数** @param time long类型的时间* @return 时分秒的秒数*/public static int getSecondNum(long time) {Date date = new Date(time);SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm:ss:SSS");String format = simpleDateFormat.format(date);String[] split = format.split(":");int secondNum = 0;secondNum += Integer.valueOf(split[0]) * 60 * 60 * 1000;secondNum += Integer.valueOf(split[1]) * 60 * 1000;secondNum += Integer.valueOf(split[2]) * 1000;secondNum += Integer.valueOf(split[3]);return secondNum;}/*** 根据但当前时间和时间段长度,获得当前时间所在的时间段** @param reqTime 入参时间,eg:1535551963527,毫秒级* @param second 间隔时间* @return 返回入参时间所在的时间段,左开右闭*/public static String getSameTime(String reqTime, int second) {String s = null;try {Long reqTimeLong = Long.valueOf(reqTime);//获得这个时间在当天的第几段int secondNum = getSecondNum(reqTimeLong);long dayTime = reqTimeLong - secondNum;int oneNum = getOneNum(reqTimeLong, second);long end = dayTime + oneNum * second * 1000;long start = dayTime + (oneNum - 1) * second * 1000;SimpleDateFormat sdf2 = new SimpleDateFormat("yyyyMMddHHmmss");s = sdf2.format(start) + ":" + sdf2.format(end);} catch (Exception e) {e.printStackTrace();}return s;}/*** 是不是整时段,比如时间段是30秒,那么只有秒数是00或者30的才会返回true,其他情况返回false** @param timeInterval 时间段,单位秒* @return 布尔值*/public static Boolean isClock(Integer timeInterval) {if(timeInterval == null || timeInterval.equals(0)){return null;}long now = System.currentTimeMillis();SimpleDateFormat sdf2 = new SimpleDateFormat("yyyyMMddHH-mm-ss");String nowStr = sdf2.format(now);String[] split = nowStr.split("-");//只取分秒int res = Integer.valueOf(split[1]) * 60 + Integer.valueOf(split[2]);return res % timeInterval == 0;}/*** 根据本端时间获取下段时间* @param time 本段时间,格式必须是yyyyMMddHHmmss_yyyyMMddHHmmss的* @return 返回下段时间,格式也是yyyyMMddHHmmss_yyyyMMddHHmmss*/public static String getNextTime(String time){String nextTime = null;try {String[] split = time.split(":");SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");Date startDate = sdf.parse(split[0]);System.out.println("startDate:"+startDate);Date endDate = sdf.parse(split[1]);System.out.println("endDate:"+endDate);int timeInterval = (int) (endDate.getTime() - startDate.getTime()) / 1000;System.out.println("timeInterval:"+timeInterval);long nextTimeLong = endDate.getTime() + 1;nextTime = getSameTime(nextTimeLong + "", timeInterval);} catch (Exception e) {e.printStackTrace();}return nextTime;}
}