小算法:计算活动时间段的小功能(项目时间处理大集合)

项目需求:
现有一体验游戏机活动,前端选择游戏机机器数,活动日期和活动起止时间(同一天,且均取整点),并选择休息时间段。为方便运算,均取整数。每个人的体验时间限定为固定时间(管理员后台多选框设置一次游戏时长,简称“工时”,为固定的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() ,略

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值