You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java7下JSP报表周数转起止日期及多选周选项修改技术问询

一、修正周起始日期多选UI

  1. 调整多选框参数命名以支持批量选中,优化选项显示文本让用户清晰对应周标识与起始日期
  2. 确保选项值为正确的1-52周数

修正后的report.jsp代码片段:

out.println("<div class='grid_3' id='hidden_div' style='display:none;'>");
out.println("<p>");
// 修改name为weekStart[],支持多选参数提交
out.println("<select name='weekStart[]' id= 'weekStart' style='width:150px;' multiple='multiple' >");

String weekDates[]={"01-02","01-09","01-16","01-23","01-30","02-06","02-13","02-20","02-27",
        "03-06","03-13","03-20","03-27","04-03","04-10","04-17","04-24","05-01","05-08",
        "05-15","05-22","05-29","06-05","06-12","06-19","06-26","07-03","07-10","07-17","07-24",
        "07-31","08-07","08-14","08-21","08-28","09-04","09-11","09-18","09-25","10-02","10-09","10-16",
        "10-23","10-30","11-06","11-13","11-20","11-27","12-04","12-11","12-18","12-25"};
String weekNum[]={"Jan1", "Jan2", "Jan3", "Jan4", "Jan5", "Feb6", "Feb7", "Feb8", "Feb9", "Mar10", "Mar11", "Mar12", "Mar13", "Apr14", "Apr15", "Apr16", "Apr17",
                 "May18", "May19", "May20", "May21", "May22", "Jun23", "Jun24", "Jun25", "Jun26", "Jul27", "Jul28", "Jul29", "Jul30",
                 "Aug31", "Aug32", "Aug33", "Aug34", "Aug35", "Sep36", "Sep37", "Sep38", "Sep39", "Oct40", "Oct41", "Oct42", "Oct43", "Oct44",
                 "Nov45", "Nov46", "Nov47", "Nov48", "Dec49", "Dec50", "Dec51", "Dec52"};

// 循环覆盖全部52周,周数为索引+1
for (int k = 0; k < weekNum.length; k++){
    int weekNumber = k + 1;
    // 显示格式:周标识(起始日期),提升用户体验
    out.println("<option value='" + weekNumber + "'>" + weekNum[k] + " (" + weekDates[k] + ")</option>");
}
out.println("</select>");
out.println("</p>");
out.println("<p>");
out.println("<label>Year</label>");
out.println("<select name='year' id='year' class='mediumSelect'>");

String currentYear = Dates.getTimeStamp("yyyy");
for(int years=2020;years<(Integer.parseInt(currentYear)+5);years++) {
    if(Integer.parseInt(currentYear) == years){
        out.println("<option value='"+years+"' selected>"+ years +"</option>");
    }else{
        out.println("<option value='"+years+"'>"+ years +"</option>");
    }
}
out.println("</select>");
out.println("</p>");
out.println("</div>");

二、Java7环境下周数转起止日期实现

1. 扩展Dates.java日期处理方法

新增周起始/结束日期计算方法,适配业务规则:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;

public class Dates {
    // 根据年份和周数获取对应周的起始日期
    public static String getWeekStartDate(int year, int weekNumber) {
        String weekDates[]={"01-02","01-09","01-16","01-23","01-30","02-06","02-13","02-20","02-27",
                "03-06","03-13","03-20","03-27","04-03","04-10","04-17","04-24","05-01","05-08",
                "05-15","05-22","05-29","06-05","06-12","06-19","06-26","07-03","07-10","07-17","07-24",
                "07-31","08-07","08-14","08-21","08-28","09-04","09-11","09-18","09-25","10-02","10-09","10-16",
                "10-23","10-30","11-06","11-13","11-20","11-27","12-04","12-11","12-18","12-25"};
        
        // 校验周数合法性
        if(weekNumber <1 || weekNumber >52){
            return "";
        }
        return year + "-" + weekDates[weekNumber-1];
    }

    // 根据起始日期计算周结束日期(+6天)
    public static String getWeekEndDate(String startDate) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Calendar cal = Calendar.getInstance();
        try {
            cal.setTime(sdf.parse(startDate));
            cal.add(Calendar.DAY_OF_MONTH, 6);
            return sdf.format(cal.getTime());
        } catch (ParseException e) {
            LogFunction.loginfo("日期解析错误:" + e.getMessage());
            return "";
        }
    }

    // 保留原有getDayOfWeek方法(若不需要可移除)
    public static String getDayOfWeek(String dateString) {
        java.util.Date date=new java.util.Date();
        SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd");
        try{
            date=df.parse(dateString);
        }catch(Exception e){
            LogFunction.loginfo("getDayOfWeek解析错误:"+e.getMessage());
        }
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return Integer.toString(calendar.get(Calendar.DAY_OF_WEEK));
    }
}

2. 修正report_act.jsp多选周处理逻辑

处理用户选中的多个周数,转换为报表过滤所需的日期条件:

// report_act.jsp中的周处理逻辑
String[] selectedWeeks = request.getParameterValues("weekStart[]");
String year = request.getParameter("year");
if(selectedWeeks != null && selectedWeeks.length >0 && year != null && !year.isEmpty()){
    // 拼接多周的日期过滤条件
    StringBuilder dateFilter = new StringBuilder();
    int targetYear = Integer.parseInt(year);
    
    for(String weekStr : selectedWeeks){
        int weekNumber = Integer.parseInt(weekStr);
        String startDate = Dates.getWeekStartDate(targetYear, weekNumber);
        String endDate = Dates.getWeekEndDate(startDate);
        
        if(!startDate.isEmpty() && !endDate.isEmpty()){
            if(dateFilter.length() >0){
                dateFilter.append(" OR ");
            }
            dateFilter.append("date BETWEEN '").append(startDate).append("' AND '").append(endDate).append("'");
        }
    }
    // 编码过滤条件避免URL乱码
    String encodedFilter = java.net.URLEncoder.encode(dateFilter.toString(),"UTF-8");
    response.sendRedirect(namePage+".jsp?millId="+millId+"&stationStatus="+stationStatus+"&inspectorId="+inspectorId+"&roundIdList="+roundIdList+"&reportType="+reportType+"&jobPosition="+jobPosition+"&scheduleId="+scheduleId+"&filterType="+filterType+"&dateFilter="+encodedFilter+"&year="+year+"&roundId="+roundId+"&stationId="+stationId+"&sequenceId="+sequenceId+"&pageNo="+pageNo);
}else{
    // 未选择周数时的跳转逻辑
    response.sendRedirect(namePage+".jsp?error=请选择至少一个周数&millId="+millId+"&stationStatus="+stationStatus+"&inspectorId="+inspectorId+"&roundIdList="+roundIdList+"&reportType="+reportType+"&jobPosition="+jobPosition+"&scheduleId="+scheduleId+"&filterType="+filterType+"&roundId="+roundId+"&stationId="+stationId+"&sequenceId="+sequenceId+"&pageNo="+pageNo);
}

三、关键问题说明

  • 多选参数传递:必须将select的name设为weekStart[],后台才能通过request.getParameterValues获取所有选中项
  • 周数映射校验:添加周数范围校验,避免非法输入导致数组越界
  • 编码处理:对拼接的日期过滤条件做URL编码,防止中文或特殊字符乱码

内容的提问来源于stack exchange,提问作者khairun aqilah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 21:15:40