用java 进行日期计算,获取当前天+1天,周末节假日不算,在线等待中,十万火急……

用java 进行日期计算,获取当前天+1天,周末节假日不算(忽略节假日),大概就是这个意思,计算产品收益用的。在线等待中十万火急,求大牛帮忙……

迟来的答案



1.周末版本(不含节假日判断)
注意:最下面是使用的 递归算法

/**
 * 获得收益时间(获取当前天+1天,周末不算).
 *
 * @param date
 *            任意日期
 * @return the income date
 * @throws NullPointerException
 *             if null == date
 */
private Date getIncomeDate(Date date) throws NullPointerException{
if (null == date){
throw new NullPointerException("the date is null or empty!");
}

//对日期的操作,我们需要使用 Calendar 对象
Calendar calendar = new GregorianCalendar();
calendar.setTime(date);

//+1天
calendar.add(Calendar.DAY_OF_MONTH, +1);

//判断是星期几
int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);

Date incomeDate = calendar.getTime();
if (dayOfWeek == 1 || dayOfWeek == 7){
//递归
return getIncomeDate(incomeDate);
}
return incomeDate;
}



测试方法:


@Test
public void testGetIncomeDate() throws ParseException{
String pattern = "yyyy-MM-dd HH:mm:ss";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);

System.out.println(simpleDateFormat.format(getIncomeDate(new Date())));
System.out.println(simpleDateFormat.format(getIncomeDate(simpleDateFormat.parse("2014-07-31 13:33:05"))));
System.out.println(simpleDateFormat.format(getIncomeDate(simpleDateFormat.parse("2014-08-01 13:33:05"))));
System.out.println(simpleDateFormat.format(getIncomeDate(simpleDateFormat.parse("2014-08-02 13:33:05"))));
System.out.println(simpleDateFormat.format(getIncomeDate(simpleDateFormat.parse("2014-08-03 13:33:05"))));
}



输出结果:


2014-08-01 13:48:09
2014-08-01 13:33:05
2014-08-04 13:33:05
2014-08-04 13:33:05
2014-08-04 13:33:05



注意:返回的是 时间+1的时间,精度是到毫秒 纳秒,如果有特殊需求,需要自己再处理下



2.周末+节假日版本

/**
 * 获得收益时间(获取当前天+1天,周末不算).
 *
 * @param date
 *            任意日期
 * @return the income date
 * @throws NullPointerException
 *             if null == date
 */
private Date getIncomeDate(Date date) throws NullPointerException{
if (null == date){
throw new NullPointerException("the date is null or empty!");
}

//对日期的操作,我们需要使用 Calendar 对象
Calendar calendar = new GregorianCalendar();
calendar.setTime(date);

//+1天
calendar.add(Calendar.DAY_OF_MONTH, +1);

Date incomeDate = calendar.getTime();

if (isWeekend(calendar) || isHoliday(calendar)){
//递归
return getIncomeDate(incomeDate);
}
return incomeDate;
}

/**
 * 判断一个日历是不是周末.
 *
 * @param calendar
 *            the calendar
 * @return true, if checks if is weekend
 */
private boolean isWeekend(Calendar calendar){
//判断是星期几
int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);

if (dayOfWeek == 1 || dayOfWeek == 7){
return true;
}
return false;
}

/**
 * 一个日历是不是节假日.
 *
 * @param calendar
 *            the calendar
 * @return true, if checks if is holiday
 */
private boolean isHoliday(Calendar calendar){
String pattern = "yyyy-MM-dd";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
String dateString = simpleDateFormat.format(calendar.getTime());

//节假日 这个可能不同地区,不同年份 都有可能不一样,所以需要有个地方配置, 可以放数据库, 配置文件,环境变量 等等地方
//这里以配置文件 为例子
ResourceBundle resourceBundle = ResourceBundle.getBundle("holidayConfig");
String holidays = resourceBundle.getString("holiday");

String[] holidayArray = holidays.split(",");

boolean isHoliday = org.apache.commons.lang.ArrayUtils.contains(holidayArray, dateString);
return isHoliday;
}



配置文件:


holiday=2014-10-01,2014-10-02,2014-10-03,2014-10-04,2014-10-05,2014-10-06,2014-10-07



测试方法 :

/**
 * Testenclosing_type.
 *
 * @throws ParseException
 *             the parse exception
 */
@Test
public void testGetIncomeDate() throws ParseException{
String pattern = "yyyy-MM-dd HH:mm:ss";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);

System.out.println(simpleDateFormat.format(getIncomeDate(new Date())));
System.out.println(simpleDateFormat.format(getIncomeDate(simpleDateFormat.parse("2014-07-31 13:33:05"))));
System.out.println(simpleDateFormat.format(getIncomeDate(simpleDateFormat.parse("2014-08-01 13:33:05"))));
System.out.println(simpleDateFormat.format(getIncomeDate(simpleDateFormat.parse("2014-08-02 13:33:05"))));
System.out.println(simpleDateFormat.format(getIncomeDate(simpleDateFormat.parse("2014-08-03 13:33:05"))));
System.out.println(simpleDateFormat.format(getIncomeDate(simpleDateFormat.parse("2014-09-30 13:33:05"))));
System.out.println(simpleDateFormat.format(getIncomeDate(simpleDateFormat.parse("2014-10-02 13:33:05"))));
}



结果:


2014-08-01 15:14:59
2014-08-01 13:33:05
2014-08-04 13:33:05
2014-08-04 13:33:05
2014-08-04 13:33:05
2014-10-08 13:33:05
2014-10-08 13:33:05

追问

感谢回答,问题是加上节假日呢?节假日也不算的,比如把所有节假日期放到一个常量里,当前日期如果是节假日,就不算

追答

你好, 我的 回答里面 2.周末+节假日版本 不算节假日的, 我是使用 单独的配置文件, 这样便于修改,增加,要比把值直接写Java代码里面方便一些

温馨提示:内容为网友见解,仅供参考
第1个回答  2014-07-30
import java.text.Format;
import java.text.SimpleDateFormat;
import java.util.Calendar;

public class $ {
    public static void main(String[] args) {

        Format f = new SimpleDateFormat("yyyy-MM-dd");
        Calendar c = Calendar.getInstance();

        System.out.println("今天是:" + f.format(c.getTime()));

        c.add(Calendar.DAY_OF_MONTH, 1);// 今天+1天

        int week = c.get(Calendar.DAY_OF_WEEK);

        // 是星期六 或者 星期日
        while (week == Calendar.FRIDAY || week == Calendar.SUNDAY) {
            c.add(Calendar.DAY_OF_MONTH, 1);// 顺延1天
            week = c.get(Calendar.DAY_OF_WEEK);
        }

        System.out.println("今天+1天是:" + f.format(c.getTime()));
    }
}

第2个回答  2014-07-25
Calendar calendar = Calendar.getInstance();
int day = calendar.get(Calendar.DAY_OF_WEEK);
//星期六或星期天。星期天是1,类推
if(day==1||day==7){
    //你的代码
}else{
    //你的代码
}

具体你要怎么算?

追问

这个去掉了周末,还有法定节假日也要去掉

追答

如果是五一、十一之类公历的还好说,因为只要用calendar自带的日期比较一下就行了,端午节、中秋节、春节之类的农历节日,就没办法了。

给个五一假期的,假设五月1号到3号,其它的类推

int month=calendar.get(Calendar.MONTH);
int date=calendar.get(Calendar.DAY_OF_MONTH);
//月份是0到11,4代表5月,日期不变
if(month==4&&date>=1&&date<=3){
    //你的代码
}

追问

感觉不是这样的,这样写起来太累而且也不是我想要的,能不能把用到的法定节日存到一个常量里,然后周末的最好也写一个方法,后面调用循环后当前日期+1就ok了,能不能按照我的意思给出具体的代码,谢谢了

追答

你还不如把日期转换成字符串存入list里,然后通过list.contains(s);来判断是否有这个日期。

比如还是五月1号到5月3号:

Calendar calendar=Calendar.getInstance();
List<String> list=new ArrayList<>();
//添加入具体日期,格式为"mmdd",五月1号为"0501"
list.add("0501");
list.add("0502");
list.add("0503");
//转换日期格式,格式和上面的对应
String date=String.format("%tm%td",calendar,calendar);
//判断列表中是否含有今天的日期
boolean b=list.contains(date);

追问

求完整代码

本回答被网友采纳
第3个回答  2014-07-25
额,你怎么表达能力这么…差

用java 进行日期计算,获取当前天+1天,周末节假日不算,在线等待中,十万...
1.周末版本(不含节假日判断)注意:最下面是使用的 递归算法 \/** * 获得收益时间(获取当前天+1天,周末不算). * * @param date * 任意日期 * @return the income date * @throws NullPointerException * if null == date *\/private Date getIncomeDate(Date date) throws NullPointerEx...

使用java 排除 两个日期段中的 休息日和节假日 。在线等待中十万火急...
结合思路,所见即所得的代码如下:\/\/ 所有节假日的日期集合,这里你可以自己添加,只写了两个仅供参考(完成思路1)List<LocalDate> holidays = Arrays.asList(LocalDate.parse("2016-01-01"), LocalDate.parse("2016-05-01"));\/\/ 按照起始2016-01-01,每次递增一天的方式生成一个StreamStream.i...

相似回答