java 农历节日 转公历日期_Java日期时间API系列28-----Jdk8中java.time包中的新的日期时间API类,计算节假日和二十四节气。...

packagecom.xkzhangsan.time.holiday;importjava.time.DayOfWeek;importjava.time.LocalDate;importjava.time.MonthDay;importjava.time.temporal.ChronoField;importjava.time.temporal.ChronoUnit;importjava.time.temporal.Temporal;importjava.time.temporal.TemporalAdjusters;importjava.util.Date;importjava.util.Map;importjava.util.Map.Entry;importjava.util.Objects;importcom.xkzhangsan.time.LunarDate;importcom.xkzhangsan.time.constants.Constant;importcom.xkzhangsan.time.converter.DateTimeConverterUtil;importcom.xkzhangsan.time.formatter.DateTimeFormatterUtil;/*** 节日处理

* 包含

* 1.公历节假日计算, getLocalHoliday* 比如getLocalHoliday(Date date) 计算date的公历节日,getLocalHoliday(Map localHolidayMap, Date date) 可以传入自定义节日数据

* 2.农历节假日计算, getChineseHoliday* 比如getChineseHoliday(Date date) 计算date的农历节日,getChineseHoliday(Map chineseHolidayMap, Date date) 可以传入自定义节日数据

* 3.二十四节气计算, getSolarTerm* 比如getSolarTerm(Date date) 计算date的二十四节气

*

* 农历相关,仅支持公历1901-1950年的计算

* @ClassName: Holiday

* @Description: Holiday

*@authorxkzhangsan

* @date 2019年12月30日

*@version0.2 试用*/

public interfaceHoliday {/*** 根据日期获取公历节日

*@paramdate

*@return

*/

staticString getLocalHoliday(Date date){return getLocalHoliday(null, date);

}/*** 根据日期获取公历节日

*@paramlocalHolidayMap 自定义节日数据,特殊节日如,"母亲节", "5-W-2-7" 5表示5月,W表示星期,2表示第二个星期,7表示星期的第7天

*@paramdate

*@return

*/

static String getLocalHoliday(MaplocalHolidayMap, Date date){

Objects.requireNonNull(date,"date");returngetLocalHoliday(localHolidayMap, DateTimeConverterUtil.toLocalDateTime(date));

}/*** 根据日期获取公历节日

*@paramtemporal

*@return

*/

staticString getLocalHoliday(Temporal temporal){return getLocalHoliday(null, temporal);

}/*** 根据日期获取公历节日

*@paramlocalHolidayMap 自定义节日数据

*@paramtemporal

*@return

*/

static String getLocalHoliday(MaplocalHolidayMap, Temporal temporal){

Objects.requireNonNull(temporal,"temporal");

String localHoliday= "";if(localHolidayMap == null ||localHolidayMap.isEmpty()){

System.out.println("localHolidayMap is null, use default data");

localHolidayMap=LocalHolidayEnum.convertToMap();

}

MonthDay monthDay=MonthDay.from(temporal);

String monthDayStr=monthDay.format(DateTimeFormatterUtil.MMDD_FMT);for(Entryentry : localHolidayMap.entrySet()){if(entry.getKey().equals(monthDayStr)) {

localHoliday= localHoliday + " " +entry.getValue();

}//如果为特殊格式,解析对比

if (entry.getKey().contains("W")) {

String[] arr= entry.getKey().split("-");int month = Integer.parseInt(arr[0]);int weekIndex = Integer.parseInt(arr[2]);int weekValue = Integer.parseInt(arr[3]);

DayOfWeek dow=DayOfWeek.of(weekValue);//设置到当前节日的月份

Temporal tempTem =temporal.with(ChronoField.MONTH_OF_YEAR, month);//设置到当前节日的第几星期第几天

Temporal targetTem =tempTem.with(TemporalAdjusters.dayOfWeekInMonth(weekIndex, dow));

MonthDay targetMonthDay=MonthDay.from(targetTem);

String targetMonthDayStr=targetMonthDay.format(DateTimeFormatterUtil.MMDD_FMT);if(monthDayStr.equals(targetMonthDayStr)) {

localHoliday= localHoliday + " " +entry.getValue();

}

}

}returnlocalHoliday;

}/*** 根据日期获取农历几日

*@paramdate

*@return

*/

staticString getChineseHoliday(Date date){return getChineseHoliday(null, date);

}/*** 根据日期获取农历几日

*@paramchineseHolidayMap 自定义节日数据,特殊节日如除夕 用CHUXI表示

*@paramdate

*@return

*/

static String getChineseHoliday(MapchineseHolidayMap, Date date){

Objects.requireNonNull(date,"date");returngetChineseHoliday(chineseHolidayMap, DateTimeConverterUtil.toLocalDateTime(date));

}/*** 根据日期获取农历几日

*@paramtemporal

*@return

*/

staticString getChineseHoliday(Temporal temporal){return getChineseHoliday(null, temporal);

}/*** 根据日期获取农历几日

*@paramchineseHolidayMap 自定义节日数据

*@paramtemporal

*@return

*/

static String getChineseHoliday(MapchineseHolidayMap, Temporal temporal){

Objects.requireNonNull(temporal,"temporal");

String chineseHoliday= "";if(chineseHolidayMap == null ||chineseHolidayMap.isEmpty()){

System.out.println("chineseHolidayMap is null, use default data");

chineseHolidayMap=ChineseHolidayEnum.convertToMap();

}

LunarDate lunarDate=LunarDate.from(temporal);

String monthDayStr=lunarDate.formatShort();//对比枚举日期,返回假日

for(Entryentry : chineseHolidayMap.entrySet()){if(entry.getKey().equals(monthDayStr)) {

chineseHoliday= chineseHoliday + " " +entry.getValue();

}//如果为特殊节日除夕

if(entry.getKey().equals(Constant.CHUXI)) {

LocalDate tempLocalDate=lunarDate.getLocalDate();

LocalDate targetLocalDate= tempLocalDate.plus(1, ChronoUnit.DAYS);

LunarDate targetLunarDate=LunarDate.from(targetLocalDate);

String targetMonthDayStr=targetLunarDate.formatShort();if(Constant.CHUNJIE.equals(targetMonthDayStr)){

chineseHoliday= chineseHoliday + " " +entry.getValue();

}

}

}returnchineseHoliday;

}/*** 根据日期获取二十四节气

*@paramdate

*@return

*/

staticString getSolarTerm(Date date){

Objects.requireNonNull(date,"date");

LunarDate lunarDate=LunarDate.from(date);returnlunarDate.getSolarTerm();

}/*** 根据日期获取二十四节气

*@paramchineseHolidayMap

*@paramtemporal

*@return

*/

staticString getSolarTerm(Temporal temporal){

Objects.requireNonNull(temporal,"temporal");

LunarDate lunarDate=LunarDate.from(temporal);returnlunarDate.getSolarTerm();

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值