项目需求:
现有一体验游戏机活动,前端选择游戏机机器数,活动日期和活动起止时间(同一天,且均取整点),并选择休息时间段。为方便运算,均取整数。每个人的体验时间限定为固定时间(管理员后台多选框设置一次游戏时长,简称“工时”,为固定的15min/20min/30min,均为了方便运算而如此设计)。由此,可以得出一天能容纳体验的玩家数。
现在,需要根据以上条件,算出一天内可供用户选择的游戏时间段。
/**
* 根据前端的一系列数据,算出总的可报批数
*/
@Override
public List<TimeStageEntity> getTimeStageList(HaircutEntity haircutEntity) {
Long id = haircutEntity.getId(); //活动id
Integer totalNum = haircutEntity.getCutNum(); // 理发师人数
Integer cutStageVal = haircutEntity.getCutStageVal(); // 理发时长type val值
String activStartTime = haircutEntity.getActivStartTime();
String activEndTime = haircutEntity.getActivEndTime(); //格式 2020-03-12 17:00
String restStartTime = haircutEntity.getRestStartTime();
String restEndTime = haircutEntity.getRestEndTime();
Integer asH = getHour(activStartTime); //开始小时
Integer aeH = getHour(activEndTime); //结束小时
Integer rsH = getHour(restStartTime); //休息开始时间
Integer reH = getHour(restEndTime); //休息结束时间
// Integer workH=aeH-asH; //工作时间
List<TimeStageEntity> tsList = new ArrayList<TimeStageEntity>();
Integer eachCount = 60 / cutStageVal;//每小时加几次
if (eachCount == null) {
// "工时选择异常"
return null;
}
//简单化
Integer zero = 0;
for (int i = asH; i < aeH; i++) { //比如,9开始 17结束
if (rsH <= i && i < reH) {
continue; //跳过休息时间
}
//弱智代码
StringBuffer sb1 = new StringBuffer();
for (int j = 0; j < eachCount; j++) {
//每个整点里的最后一个时间段存在时位进一位,单独处理
if (j == eachCount - 1) {
zero = 0;
TimeStageEntity ts = new TimeStageEntity();
StringBuffer sb2 = new StringBuffer();
sb2.append(i).append(":").append(60-cutStageVal ).append("-").append(i + 1).append(":").append("00");
ts.setTimeStageName(sb2.toString());
//设置一些共有参数
ts.setActivId(id);
ts.setTimeStageSignUpTotalNum(totalNum);
ts.setTimeStageSignUpNum(0);//当前时间段已报人数默认设置为0(初始化)
//加入集合
tsList.add(ts);
break;
}
String m = String.format("%02d", zero);
TimeStageEntity ts = new TimeStageEntity();
StringBuffer sb2 = new StringBuffer();
sb2.append(i).append(":").append(m);
zero = zero + cutStageVal;
sb2.append("-").append(i).append(":").append(zero);
ts.setTimeStageName(sb2.toString());
//设置一些共有参数
ts.setActivId(id);
ts.setTimeStageSignUpTotalNum(totalNum);
ts.setTimeStageSignUpNum(0);//当前时间段已报人数默认设置为0(初始化)
//加入集合
tsList.add(ts);
}
}
/**
* parseTimeString2Date
* 处理时间字符串,得到时,分,秒
*/
public static Date parseTimeString2Date(String timeString) {
if ((timeString == null) || (timeString.equals(""))) {
return null;
}
Date date = null;
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
date = new Date(dateFormat.parse(timeString).getTime());
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
public static String convertDate2String(Date date, String pattern) {
if (date == null)
return null;
DateFormat dateFormat = new SimpleDateFormat(pattern);
return dateFormat.format(date);
}
public static int getMonth(String timeString) {
String timeStr = convertDate2String(parseTimeString2Date(timeString), "yyyy-MM-dd HH:mm:ss");
return Integer.parseInt(timeStr.substring(5, 7));
}
public static int getDay(String timeString) {
String timeStr = convertDate2String(parseTimeString2Date(timeString), "yyyy-MM-dd HH:mm:ss");
return Integer.parseInt(timeStr.substring(8, 10));
}
public static int getHour(String timeString) {
String timeStr = convertDate2String(parseTimeString2Date(timeString), "yyyy-MM-dd HH:mm:ss");
return Integer.parseInt(timeStr.substring(11, 13));
}
/**
* @return
* 获取当前时间的公共方法(小工具)
* (ForExample)当前时间:2020-03-20
*/
private static String getCurrentDayStr() {
Date date = new Date();
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
String timeStr2 = sf.format(date);
return timeStr2;
}
以如下情况为例:
//测试自动生成时间段和插时间段表
@Test
public void testTimeStages() {
HaircutEntity haircutEntity = new HaircutEntity();
haircutEntity.setCutNum(1); //理发师人数
haircutEntity.setState(1); //活动状态
// haircutEntity.setCutStageVal(15); // 理发时长type val值
haircutEntity.setCutStageVal(15);
haircutEntity.setId(595546L); //活动id
haircutEntity.setActivStartTime("2020-03-12 9:00:00");
haircutEntity.setActivEndTime("2020-03-12 17:00:00");
haircutEntity.setRestStartTime("2020-03-12 12:00:00");
haircutEntity.setRestEndTime("2020-03-12 13:00:00");
List<TimeStageEntity> timeStageList = hairCutService.getTimeStageList(haircutEntity);
System.out.println("该活动当天时间段------");
for (TimeStageEntity ts:timeStageList){
System.out.println(ts.getTimeStageName());
}
}
打印结果:
补充:
一、如果ORM是Mybatis-plus,数据库存时间类型,前端想要展示格式化的时间字符串,可以这么处理:
//时间转换格式化,也可以在“实体类”层面处理:
@JsonFormat( pattern="yyyy-MM-dd")
private Date beginDate;
JsonFormat与@DateTimeFormat注解的使用
Ps.Mysql sql处理,java手动处理、实体类注解处理都还行,如果拖延到js处理,那是真滴蛋疼。
二、对时间进行加减操作,比如加10分钟减10分钟的操作,存在跨小时跨天跨周等蛋疼if考虑。推荐使用封装方法,不要自己写。
MySQL层面:
Mysql 时间字段(加上或者减去一段时间)
java层面:
Java中日期格式(String、Date、Calendar)的相互转换
演示代码:
String stringStartTime="9:53";
String stringStartTime2="9:03";
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
Date dateStartTime=null;
Date dateStartTime2=null;
try {
dateStartTime =sdf.parse(stringStartTime); //java中:字符串转换为时间类型
dateStartTime2 =sdf.parse(stringStartTime2);
//java中:时间转字符串类型
// sdf.format(new Date());
} catch (ParseException e) {
e.printStackTrace();
}
Calendar cal=Calendar.getInstance();//工厂方法,创建Calendar对象
if(dateStartTime!=null)cal.setTime(dateStartTime);//Date转换为Calendar,以便可以直接调用Calendar已写好了的时间加减方法,避免自己手动写时间加减而需要一堆if判断(存在跨小时跨天跨周等蛋疼if考虑)而丑化项目代码
cal.add(Calendar.MINUTE,+10);
Date dateDealTime=cal.getTime(); //sdf.format()入参必须是Date类型,否则抛异常
System.out.println("stringStartTime加10分钟后的时间,格式化后展示--"+sdf.format(dateDealTime));
System.out.println("---------我是分割线---------");
if(dateStartTime2!=null)cal.setTime(dateStartTime2);
cal.add(Calendar.MINUTE,-10);
Date dateDealTime2=cal.getTime();
System.out.println("stringStartTime2减10分钟后的时间,格式化后展示--"+sdf.format(dateDealTime2));
}
运行结果:
js层面:
moment() ,略