问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

java中的时间操作问题,难题求解

发布网友 发布时间:2022-05-09 08:39

我来回答

6个回答

热心网友 时间:2024-01-29 13:01

我以前遇到过类似的问题。就是做值班表 自动排班的时候。
我不知道用SQL语句怎么做;而且又不想插入空数据,于是就用程序实现的。
其中有部分实现了时间段的构造,你可以看下。应该不难解决。
//半自动排班
@SuppressWarnings("unchecked")
public ActionForward automatic(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception{
ScheletableActionForm newform = (ScheletableActionForm)form;
String id_str = request.getParameter("id");
if(id_str==null){
id_str = newform.getSchele().getId_string();
}
long id = Long.parseLong(id_str);
Schele schele = ScheleDAO.getScheleById(id);
//排班明细结束时间由排班表决定
Date enddate = schele.getEnddate();

//排班模板时间段由该排班表已有的明细决定
List datelist = SchelelineDAO.getSchelelineShowSizeScheleId(id);
if(datelist==null||datelist.size()==0){
newform.setErrormsg("请至少先选择一个排班循环");

}
else{//该datelist长度一定大于0,否则不允许进入自动排班
Date startpoint = (Date)datelist.get(0);
Date endpoint = (Date)datelist.get(datelist.size()-1);

//只排endpoint至enddate之间的明细
Date start_go = TimeFormat.getDateAfter(endpoint, 0, 0, 1, 0, 0, 0);
Date end_go = enddate;

//构造自动排班的日期列表
ArrayList<Date> datelist_go = new ArrayList<Date>();
Date tempdate = start_go;
while(!tempdate.after(end_go)){
datelist_go.add(tempdate);
tempdate = TimeFormat.getDateAfter(tempdate, 0, 0, 1, 0, 0, 0);
}
int size = datelist_go.size();

//构造模板日期列表
ArrayList<Date> modellist = new ArrayList<Date>();
Date tempmodel = startpoint;
while(!tempmodel.after(endpoint)){
modellist.add(tempmodel);
tempmodel = TimeFormat.getDateAfter(tempmodel, 0, 0, 1, 0, 0, 0);
}
int modelsize = modellist.size();

//班次列表
List shiftlist = ShiftDAO.getShiftlistByDeptid(schele.getDeptid());

//按照自动排班的日期列表逐日进行
for(int i=0;i<size;i++){
int modelNo = getModelNo(i,modelsize);
String modeldate_s = TimeFormat.dateToString("yyyy-MM-dd",(Date)modellist.get(modelNo));
Date linedate = datelist_go.get(i);
for(int j=0;j<shiftlist.size();j++){//再按照班次进行
Scheleline line = new Scheleline();
Shift shift = (Shift)shiftlist.get(j);
long shiftid = shift.getId();
Scheleline modelline = SchelelineDAO.getSchelelineTrTd(id, shiftid, modeldate_s);
if(modelline!=null){//如果不为空,复制过来进行插入
line.setId(IdCreater.getId("Scheleline")); //id不复制
line.setDatea(linedate);
line.setMembers(modelline.getMembers());
line.setLeader(modelline.getLeader());
//line.setEndtime(modelline.getEndtime());
//line.setStarttime(modelline.getStarttime());
String datea_string = TimeFormat.dateToString("yyyy-MM-dd", linedate);
String starttime_str = datea_string+" "+TimeFormat.dateToString("HH:mm", shift.getStarttime());
Date nowdaytime = TimeFormat.stringToDate("yyyy-MM-dd", datea_string);
String endStr = shift.getEndstr();
if(endStr.equals("次日")){
nowdaytime = TimeFormat.getDateAfter(nowdaytime, 0, 0, 1, 0, 0, 0);
}
String endtime_str = TimeFormat.dateToString("yyyy-MM-dd", nowdaytime)+" "+TimeFormat.dateToString("HH:mm", shift.getEndtime());

line.setStarttime(TimeFormat.stringToDate("yyyy-MM-dd HH:mm", starttime_str));
line.setEndtime(TimeFormat.stringToDate("yyyy-MM-dd HH:mm", endtime_str));

line.setShiftname(modelline.getShiftname());
line.setScheleid(modelline.getScheleid());
line.setShiftid(modelline.getShiftid());
SchelelineDAO.addScheleline(line);
}
}
}
newform.setErrormsg("排班成功!");
}
newform.getSchele().setId_string(id_str);
ActionForward forward = detail(mapping, newform, request, response);
return forward;
}

//计算第i行的排班表应该选择的模板的行号j
private static int getModelNo(int i,int modelsize){
return i%modelsize;
}
//****************************自动排班结束**************************//

补充一下:中间有个TimeFormat方法,贴出来
public class TimeFormat {
//将传入的时间按照指定的格式转化成字符串返回
//注意传入的format_type必须为指定的时间格式,比如"yyyy-MM-dd HH:mm:ss"
//传入的date必须为Date型
public static String dateToString(String format_type,Date time_Date){
if(time_Date==null)return "";
SimpleDateFormat sdf = new SimpleDateFormat(format_type);
String format_time = sdf.format(time_Date);
return format_time;
}

//将传入的字符串转化成指定格式的日期返回
//注意传入的format_type必须为指定的时间格式,比如"yyyy-MM-dd HH:mm:ss"
//传入的time_str必须为符合format_type格式的字符串
public static Date stringToDate(String format_type,String time_Str){
SimpleDateFormat sdf = new SimpleDateFormat(format_type);
if(time_Str.length()<format_type.length()){
if(time_Str.length()==4){
time_Str += "-00-00 00:00:00";
}
if(time_Str.length()==7){
time_Str += "-00 00:00:00";
}
if(time_Str.length()==10){
time_Str += " 00:00:00";
}
if(time_Str.length()==13){
time_Str += ":00:00";
}
if(time_Str.length()==16){
time_Str += ":00";
}
}
Date date = new Date();
try{
date = sdf.parse(time_Str);
}catch(Exception e){
e.printStackTrace();
}
return date;
}

//将传入的Date型数据转化成指定格式的Date型返回
//注意传入的format_type必须为指定的时间格式,比如"yyyy-MM-dd HH:mm:ss"
//传入的time_Date必须为Date型时间
public static Date dateToDate(String format_type,Date time_Date){
String format_str = dateToString(format_type,time_Date);
Date format_date = stringToDate(format_type,format_str);
return format_date;
}

public static String getCurrentDate(String format_type){
SimpleDateFormat sdf = new SimpleDateFormat(format_type);
String format_time = sdf.format(new Date());
return format_time;
}

//根据传入的日期取得星期,返回星期的字符串,形如"星期二"
public static String getWeekTimeByDate(Date date){
String week = "";
String[] dayNames = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五","星期六"};
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK)-1;
if(dayOfWeek<0){
dayOfWeek=0;
}
week = dayNames[dayOfWeek];
return week;
}

//取得传入日期a年,b月,c天,d小时,e分钟,f秒以后的日期,若想得到以前的,参数为负值即可
public static Date getDateAfter(Date date,int years,int months,int days,int hours,int minutes,int seconds){
Calendar cal=Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.YEAR, years);
cal.add(Calendar.MONTH, months);
cal.add(Calendar.DATE, days);
cal.add(Calendar.HOUR, hours);
cal.add(Calendar.MINUTE, minutes);
cal.add(Calendar.SECOND, seconds);
date = cal.getTime();
return date;
}
//传入一个date得到该date的月
public static int getMonth(Date date){
Calendar c = Calendar.getInstance();
c.setTime(date);
return c.get(Calendar.MONTH)+1;
}
//传入一个date得到该date的月
public static int getDay(Date date){
Calendar c = Calendar.getInstance();
c.setTime(date);
return c.get(Calendar.DAY_OF_MONTH);
}
// 传入一个date得到该date的月
public static int getYear(Date date){
Calendar c = Calendar.getInstance();
c.setTime(date);
return c.get(Calendar.YEAR);
}

//取得A时间减去B时间后的毫秒数
public static long getPoorSeconds(Date a,Date b){
Calendar timea = Calendar.getInstance();
Calendar timeb = Calendar.getInstance();
timea.setTime(a);
timeb.setTime(b);
return timea.getTimeInMillis() - timeb.getTimeInMillis();
}
public static void main(String[] args) {

}
}

热心网友 时间:2024-01-29 13:01

假如你数据库中的日期字段是 dd 销售数量是 cc

select sum(cc) as count,to_char(dd,'yyyy-mm') as monthh
where dd>=to_date('2009-01-22','yyyy-mm-dd') and dd<=to_date('2010-02-02','yyyy-mm-dd') group by monthh

出来就是这样的格式

count monthh
24000 2009-01
434 2009-02
...
32 2009-12
..

这是在oracle中的写法,在其他库中可能没有to_char或者to_date的函数
你可以找一下其它库中类似oracle中to_char的函数...

热心网友 时间:2024-01-29 13:02

主要两种做法吧,
1: 用SQL,具体来讲需要建辅助表,比如:一张表里面是所有的月份MONTH_LIST,从2009-01到2010-12,字段名:month.
然后用这张表和你的表(假设叫sale_list)left_join,假设你的表内日期字段时varchar sale_date 日期格式:'yyyy-MM-dd',销售数量是:number sale_vol ;
那么SQL是:
select m.month as month , nvl(sum (s.sale_vol), 0) as sale_vol
from month_list m
left join sale_list s on m.month = substr (s.sale_date, 1,7)
where
m.month >= '2009-01' and m.month <= '2010-02'
group by m.month order by m.month

得到的结果就是完整的。

第二种做法是用程序实现。假设JfreeChart的数据模型要求是:
interface ColumDiagramDataModel
{
getColumnCount () ;
getColumnName (int index) ;
getColumnValue (int index) ;
}
那么,可以简单的将数据加载到数组中,然后实现其接口。
在提取数据的时候,就可以将数据不全。

推荐用程序来实现。这样依赖性小,数据量也小,性能较好。

热心网友 时间:2024-01-29 13:02

用flex很好实现

热心网友 时间:2024-01-29 13:03

这个问题在于你统计报表用的是什么方法,就这样看可能简单的用count(*) group by column这种方法是不行了,你需要用一些方法把没有的月份做成0,我相信你应该讲到这里已经明白了。

热心网友 时间:2024-01-29 13:04

在对应月份放入0
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
大学入学应该带哪些必备物品? tim删除聊天记录的方法步骤 pc端彻底删除tim聊天记录 甩脂机调到什么档位 如何用甩脂机 甩脂机的正确使用方法 使用抖脂机要注意什么 怎样申请小号微信号 ...的长和宽分别增加6米,扩建后草坪的面积增加了多少 ...扩建后长和宽分别增加10米,扩建后的操场面积增加了多少平方米?_百 ... 长方形的公园它的面积长和宽分别扩大十米后它的平方增加了面积增加了13... 求java中date类的用法例子(并附每条注释) java日期格式问题问题,怎么解决 java中时间类型的转换,中间怎么解决误差问题? java 中 SimpledateFormat 得到的时间错误 关于Java的Date日期显示问题? 在JAVA中怎么打印出当前日期和时间?用什么方法? java String 转 date 出现时间格式不对的问题 我用java的Date类获取系统时间怎么和实际的系统时间时间不一致啊?只是小时不一样 求解。。。。。。 用java取当前时间时时分秒与真实时间不符 java获取系统时间不对 JAVA 时间类,为什么我写的默认的时间 小时输出不对,分钟和秒却符合?求改进代码 小米平板2处理器性能和6年前的电脑比怎么样? 求推荐一款好的电子书 yota3俄罗斯墨水屏在中国哪里有卖 小便又骚臭味滴在地上变黑怎么回事? iPhone12pro过热会重启吗 12pro粉屏重启是因为什么 我这手机OPPOA59s屏幕锁屏忘记密码了,请问怎么解锁。 CPU(图拉丁),内存(SD)方面的一些问题 已装win10,现想装ubuntu19.10双系统,bios应如何设置(主板为b85-hd3)? 我用JAVA 直接打印一个DATE 怎么显示的是GMT时间 请问:在JAVA中怎样自动添加时间注释啊?非常感谢..... Java 格式化时间问题 如何在JAVA中显示系统的当前时间,希望广大的朋友们在你所给的程序后面加上您宝贵的注解!谢谢…… 请问分红险十年的期限,交了三年了,不想入了,保险公司能不能把以前交的钱退回? 我一次性在农业银行买了三年的分红保险,到时间可以全部退回来吗? 格力空调自动清洁人能在吗 出水芙蓉的下一句是什么 “出水芙蓉冰清玉洁”的下一句是什么? 若水伊人下一句是什么 用清水出芙蓉形容一个女孩儿气质的话,具体什么意思? 股价向下很大的缺口叫什么 梦见自己和别人打架对方流血,我还在水盆里洗血手 有没有推荐的培训自学考试的呢? 您好 请问大盘 例如创业板大盘指数K线图怎样看的 掌趣科技是蓝筹股吗? 关闭验证通道和越狱的关系 我有邮相箱不知在哪登录 音箱倒相孔开口位置及尺寸大小如何计算确定 24寸的拉杆箱空箱多重,乘机时行李不能超20KG,去买都是5KG左右的行相箱,请问24寸5KG的会不会太重