我表里面有两个时间段
1:2009-01-01 至 2009-04-30
2:2009-05-01 至 2009-12-31
我想在这个时间段里面算钱。
时间在1里面每个月的钱是100元
时间在二里面每个月的钱是50元我现在想写个类来算某个时间段内的钱。比如2008-10-01 至 2009-03-01
像这个时间段有效时间是有两个月,即1,2月 所得的钱是200
又如 2008-10-01 至 2010-01-01
这个就算1,2这两个时间段的钱总和
1时间段为4*100
2时间段为8*50
大家给个思路怎么设计,或者给伪代码也行 尽量能详细 谢谢
1:2009-01-01 至 2009-04-30
2:2009-05-01 至 2009-12-31
我想在这个时间段里面算钱。
时间在1里面每个月的钱是100元
时间在二里面每个月的钱是50元我现在想写个类来算某个时间段内的钱。比如2008-10-01 至 2009-03-01
像这个时间段有效时间是有两个月,即1,2月 所得的钱是200
又如 2008-10-01 至 2010-01-01
这个就算1,2这两个时间段的钱总和
1时间段为4*100
2时间段为8*50
大家给个思路怎么设计,或者给伪代码也行 尽量能详细 谢谢
表数据项大概是:
序号,类别(类别有两个:医疗为1,工伤为2),执行开始时间,执行结束时间,缴费基数,缴费比率等。
某个时间段内的钱=时间月数×基数×比率我已经写出来了,不过还不够好,大概是这样,谁有更简洁的方法吗?
package com.sx.ldlsc.zqzpgl.ywcl.sbbt;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;import com.sx.db.DbCommon;
import com.sx.ldlsc.zqzpgl.common.DBFactory;
import com.sx.ldlsc.zqzpgl.valuebean.sbbt.SbbtJsVB;
import com.sx.support.dba.dbSQLResult;
public class Sbbtbz {
// 医疗保险
private final String YLBX = "1";
// 工伤保险
private final String GSBX = "2";
public Sbbtbz(){
}
public DbCommon db = DBFactory.getDBCommonInstance("sbbt","sbbtservice","v1.0"); /**
* @param kssj 开始时间
* @param jssj 结束时间
* @param bxlx 保险类别 1为医疗保险,2为工伤保险
* @return
*/ public int getBtMoney(String kssj,String jssj,String bxlx){
String sql =" SELECT bxlx,nd,zxkssj,zxjssj,jfjs,jfbl FROM " +
" (SELECT bxlx,nd,zxkssj,zxjssj,jfjs,jfbl FROM zpgl_bxcsb " +
" WHERE zxkssj<='"+jssj+"' AND bxlx='"+bxlx+"' " +
" UNION SELECT bxlx,nd,zxkssj,zxjssj,jfjs,jfbl FROM zpgl_bxcsb " +
" WHERE zxjssj>= '"+kssj+"' AND bxlx='"+bxlx+"') y ";
dbSQLResult sr = db.querySql(sql);
/**
* 计算出这个时间段内算钱的段数
* */
List list = new ArrayList();
if(sr!=null && sr.getRows()>0){
for(int i=0;i<sr.getRows();i++){
SbbtJsVB vb = new SbbtJsVB();
vb.setBxlx(sr.getData()[i][0]);
vb.setNd(sr.getData()[i][1]);
vb.setZxkssj(sr.getData()[i][2]);
vb.setZxjssj(sr.getData()[i][3]);
vb.setJfjs(sr.getData()[i][4]);
vb.setJfbl(sr.getData()[i][5]);
list.add(vb);
}
}
Iterator it = list.iterator();
int size = list.size(); // 时间段数量
int num = 0; //定义钱总数
int i = 1;
while(it.hasNext()){
SbbtJsVB vb = (SbbtJsVB)it.next();
if(i==1){
num += getMoney(Integer.parseInt(vb.getJfjs()),Integer.parseInt(vb.getJfbl()),getMonths(kssj,vb.getZxjssj()));
}else if(i!=1 && i!=size){
num += getMoney(Integer.parseInt(vb.getJfjs()),Integer.parseInt(vb.getJfbl()),getMonths(vb.getZxkssj(),vb.getZxjssj()));
}else if(i==size){
num += getMoney(Integer.parseInt(vb.getJfjs()),Integer.parseInt(vb.getJfbl()),getMonths(vb.getZxkssj(),jssj));
}
i++;
}
i=0;
return num;
}
/**
* @param begin 开始时间
* @param end 结束时间
* @return
*/
public int getMonths(String begin,String end){
/*开始日期年*/
int beginYear = Integer.parseInt(begin.substring(0, 4));
/*开始日期月*/
int beginMonth = Integer.parseInt(begin.substring(4, 6));
/*开始日期天*/
int beginDay = Integer.parseInt(begin.substring(6,8));
/*结束日期年*/
int endYear = Integer.parseInt(end.substring(0, 4));
/*结束日期月*/
int endMonth = Integer.parseInt(end.substring(4, 6));
/*结束日期天*/
int endDay = Integer.parseInt(end.substring(6,8));
int amount = (endYear - beginYear) * 12 + (endMonth - beginMonth);
if (amount != 0 && endDay < beginDay) amount = amount - 1;
return amount;
}
//计算钱数
/**
* @param js 基数
* @param bl 比率
* @param ys 月数
* @return
*/
public int getMoney(int js,int bl,int ys){
return (js)*(bl)*ys;
}
public String getGSBX() {
return GSBX;
}
public String getYLBX() {
return YLBX;
}
}
GregorianCalendar inv_start1 = new GregorianCalendar(2009, 1, 1, 0, 0);
GregorianCalendar inv_end1 = new GregorianCalendar(2009, 4, 30, 0, 0);
GregorianCalendar inv_start2 = new GregorianCalendar(2009, 5, 1, 0, 0);
GregorianCalendar inv_end2 = new GregorianCalendar(2009, 12, 31, 0, 0);
int tax1 = 100;
int tax2 = 50; GregorianCalendar start = new GregorianCalendar(2008, 1, 31, 0, 0);
GregorianCalendar end = new GregorianCalendar(2009, 2, 1, 0, 0);
int sum1 = dateCheck(start, end, inv_start1, inv_end1, tax1);
int sum2 = dateCheck(start, end, inv_start2, inv_end2, tax2);
if (sum1 < 0) {
sum1 = 0;
}
if (sum2 < 0) {
sum2 = 0;
}
int sum = sum1 + sum2;
System.out.println(sum1);
System.out.println(sum2);
System.out.println(sum);
} public static int dateCheck(GregorianCalendar start, GregorianCalendar end,
GregorianCalendar invStart, GregorianCalendar invEnd, int tax) {
int full = invEnd.get(Calendar.MONTH) - invStart.get(Calendar.MONTH)
+ 12
* (invEnd.get(Calendar.YEAR) - invStart.get(Calendar.YEAR))
+ (invEnd.get(Calendar.DATE) - invStart.get(Calendar.DATE) + 1)
/ invEnd.get(Calendar.DAY_OF_MONTH);
int former = start.get(Calendar.MONTH) - invStart.get(Calendar.MONTH)
+ 12 * (start.get(Calendar.YEAR) - invStart.get(Calendar.YEAR))
+ (start.get(Calendar.DATE) - invStart.get(Calendar.DATE) + 1)
/ invEnd.get(Calendar.DAY_OF_MONTH);
int latter = invEnd.get(Calendar.MONTH) - end.get(Calendar.MONTH) + 12
* (invEnd.get(Calendar.YEAR) - end.get(Calendar.YEAR))
+ (invEnd.get(Calendar.DATE) - end.get(Calendar.DATE) + 1)
/ invEnd.get(Calendar.DAY_OF_MONTH);
if (former < 0) {
former = 0;
}
if (latter < 0) {
latter = 0;
}
System.out.println(former);
System.out.println(latter);
System.out.println(full);
return (full - former - latter) * tax;
}