重慶分公司,新征程啟航
為企業(yè)提供網(wǎng)站建設、域名注冊、服務器等服務
為企業(yè)提供網(wǎng)站建設、域名注冊、服務器等服務
時間處理,更方便和更易讀的代碼角度講,肯定要用Java8的新date api啦,由于涉及到一系列日期,所以結(jié)合Java8的Stream也是理所當然
成都創(chuàng)新互聯(lián)公司專注于企業(yè)營銷型網(wǎng)站建設、網(wǎng)站重做改版、通道網(wǎng)站定制設計、自適應品牌網(wǎng)站建設、HTML5建站、成都商城網(wǎng)站開發(fā)、集團公司官網(wǎng)建設、成都外貿(mào)網(wǎng)站建設、高端網(wǎng)站制作、響應式網(wǎng)頁設計等建站業(yè)務,價格優(yōu)惠性價比高,為通道等各大城市提供網(wǎng)站開發(fā)制作服務。
總體思路:
由于節(jié)假日每年在變,所以需要羅列出所有的節(jié)假日集合A
生成2016-01-01 至 2016-05-01所有的日期,生成日期集合B
從B中過濾掉A中的節(jié)假日
從B中過濾掉周六周日
最后把B中集合打印
結(jié)合思路,所見即所得的代碼如下:
//?所有節(jié)假日的日期集合,這里你可以自己添加,只寫了兩個僅供參考(完成思路1)
ListLocalDate?holidays?=?Arrays.asList(LocalDate.parse("2016-01-01"),?LocalDate.parse("2016-05-01"));
//?按照起始2016-01-01,每次遞增一天的方式生成一個Stream
Stream.iterate(LocalDate.parse("2016-01-01"),?localDate?-?localDate.plusDays(1))
//?按照要求的時間間隔2016-01-01?至?2016-05-01中的實際間隔天數(shù)截斷Stream(完成思路2)
.limit(ChronoUnit.DAYS.between(LocalDate.parse("2016-01-01"),?LocalDate.parse("2016-05-01")))
//?過濾其中的節(jié)假日(完成思路3)
.filter(localDate?-?!holidays.contains(localDate))
//?過濾其中的周六
.filter(localDate?-?!DayOfWeek.SATURDAY.equals(DayOfWeek.of(localDate.get(ChronoField.DAY_OF_WEEK))))
//?過濾其中的周日(完成思路4)
.filter(localDate?-?!DayOfWeek.SUNDAY.equals(DayOfWeek.of(localDate.get(ChronoField.DAY_OF_WEEK))))
//?打印最后結(jié)果(完成思路5)
.forEach(System.out::println);
打印的結(jié)果:
綜上:結(jié)合新時間API的易用性+Stream處理集合的快捷性,寫出代碼還是很簡潔的
因為很多的節(jié)假日,沒有規(guī)律性。所以程序?qū)崿F(xiàn)只有寫死日期。
可以做一個配置文件,手工填寫假日信息,然后再由java顯示出來。
遲來的答案
1.周末版本(不含節(jié)假日判斷)
注意:最下面是使用的 遞歸算法
/**
?*?獲得收益時間(獲取當前天+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"))));
}
輸出結(jié)果:
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.周末+節(jié)假日版本
/**
?*?獲得收益時間(獲取當前天+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;
}
/**
?*?一個日歷是不是節(jié)假日.
?*
?*?@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());
//節(jié)假日?這個可能不同地區(qū),不同年份?都有可能不一樣,所以需要有個地方配置,?可以放數(shù)據(jù)庫,?配置文件,環(huán)境變量?等等地方
//這里以配置文件?為例子
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"))));
}
結(jié)果:
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
public?static?boolean?isWeekend(Date?date)?{
Calendar?cal?=?Calendar.getInstance();
cal.setTime(date);
int?result?=?cal.get(Calendar.WEEK_OF_MONTH);
if?(result?==?Calendar.SATURDAY?||?result?==?Calendar.SUNDAY)?{
return?true;
}
return?false;
}
這段代碼只是判斷是不是周末,節(jié)假日的話只能通過某些數(shù)據(jù)配置來判斷了。節(jié)假日是沒法計算的。