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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用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代码里面方便一些

参考技术A 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()));
    

参考技术B 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);

追问

求完整代码

参考技术C 额,你怎么表达能力这么…差

java 分别获取当前时间的年月日以及当前时间所在周的周一周末日期

以前也经常用date去截取,但是病史所有场景都适合,或者说效率满足不了,或者说拼接格外麻烦。能用java本省的的方法去实现其实更爽。因为中西方的文化的差异有时候在简单的方法上我们不得不去加一些其他的去计算,谁让java是西方的语言,我也想用国产的开发语言,但不知道这辈子能不能看到了。上代码:

		SimpleDateFormat simdf = new SimpleDateFormat("MM月dd日");
		
		Calendar cal = Calendar.getInstance();
		System.out.println("现在时间:"+simdf.format(cal.getTime()));
		//分别获取年、月、日
		System.out.println("年:"+cal.get(cal.YEAR));
		System.out.println("月:"+(cal.get(cal.MONTH)+1));//老外把一月份整成了0,翻译成中国月份要加1
		System.out.println("日:"+cal.get(cal.DATE));
		
		cal.set(cal.DAY_OF_WEEK, cal.MONDAY);
		String weekhand = simdf.format(cal.getTime());
		System.out.println("当前时间所在周周一日期:"+weekhand);
		//cal.set(cal.DAY_OF_WEEK, cal.SUNDAY);这个不符合中国人的时间观,老外把上周周日定为一周的开始。
		
		cal.set(Calendar.DATE, cal.get(cal.DATE) + 6);
		String weeklast = simdf.format(cal.getTime());
		System.out.println("当前时间所在周周日日期:"+weeklast);

运行输出:

现在时间:07月06日
年:2017
月:7
日:6
当前时间所在周周一日期:07月03日
当前时间所在周周日日期:07月09日

  

以上是关于用java 进行日期计算,获取当前天+1天,周末节假日不算,在线等待中,十万火急……的主要内容,如果未能解决你的问题,请参考以下文章

Java语言,已知一个年月日的日期,获取该日期是这一年的多少天...........

java 给一个日期,往后加三天,如果是周末,节假日不算天数。直到加满三天为之,得出日期。

怎么用java将获取的日期往后添加一天

java 计算当前时间离月底有多少天

javascript获取当天日期,计算出该天所属周,列出本周从周一至周日的所有日期,求大神帮助!

选择日期+3天,不包括周末和节假日