java实现计算周期性提醒的示例

 更新时间:2014年04月09日 09:08:39   作者:  
本文分享一个java实现计算周期性提醒的示例,可以计算父亲节、母亲节这样的节日,也可以定义如每月最好一个周五,以方便安排会议

可以计算父亲节、母亲节这样的节日,也可以定义如每月最好一个周五,以方便安排会议。

复制代码 代码如下:

/**
*
* @param strdate
*            开始日期,格式为yyyy-MM-dd HH:mm:ss
* @param cyclePriod
*            重复间隔
* @param loopPriod
*            重复类型,m=月,d=日,y=年,w=周,h=小时,f=分钟,s=秒
*            mn=月正数第几天,mb=月倒数第几天,如mb2为倒数第2天
*            w1..7=每周几,mn1w2=月第一个周2,mb2w4=月倒数第2个周四
*    w后的值可以是多值,w135代表周1、周3、周五
* @param isLunar
*            是否为阴历,传入的值必须为阳历,按阴历计算后返回的依然是阳历。目前阴历只有月和年的计算不同 其他重复类型根据需要再添加
* @return
*/
public static String nextTime(String strdate, int cyclePriod,
String loopPriod, Boolean isLunar) {
String returnValue = "";

int[] dates = DateUtils.genDate(strdate);

ChineseCalendar cCalendar = new ChineseCalendar();
cCalendar.setGregorianYear(dates[0]);
cCalendar.setGregorianMonth(dates[1]);
cCalendar.setGregorianDate(dates[2]);

if ("m".equalsIgnoreCase(loopPriod)) // 处理月
{
if (isLunar) {
for (int i = 0; i < cyclePriod; i++) {
cCalendar.nextChineseMonth();
}
returnValue = DateUtils.genDate(cCalendar.getGregorianYear(),
cCalendar.getGregorianMonth(),
cCalendar.getGregorianDate());
} else {
returnValue = DateUtils.calDate(strdate, cyclePriod, 2);
}
} else if ("d".equalsIgnoreCase(loopPriod)) // 处理日
{
returnValue = DateUtils.calDate(strdate, cyclePriod, 5);

} else if ("y".equalsIgnoreCase(loopPriod)) // 处理年
{
if (isLunar) {
cCalendar.addChineseYear(cyclePriod);
returnValue = DateUtils.genDate(cCalendar.getGregorianYear(),
cCalendar.getGregorianMonth(),
cCalendar.getGregorianDate());
} else {
returnValue = DateUtils.calDate(strdate, cyclePriod, 1);
}

} else if ("w".equalsIgnoreCase(loopPriod)) // 处理周
{
returnValue = DateUtils.calDate(strdate, cyclePriod, 3);

} else if ("h".equalsIgnoreCase(loopPriod)) // 处理小时
{
returnValue = TimeUtils.addTime(strdate, 0, cyclePriod);
} else if ("f".equalsIgnoreCase(loopPriod)) // 处理分钟
{
returnValue = TimeUtils.addTime(strdate, 1, cyclePriod);

} else if ("s".equalsIgnoreCase(loopPriod)) // 处理秒
{
returnValue = TimeUtils.addTime(strdate, 2, cyclePriod);

} else // 处理非常规周期
{
if ("m".equalsIgnoreCase(StringUtils.left(loopPriod, 1))) {
String mnb = loopPriod.substring(1, 2);
String wnb = "";
int mnbValue = 0;
int wnbValue = 0;
if (loopPriod.indexOf("w") > 1) {
wnb = loopPriod.substring(loopPriod.indexOf("w") + 1,
loopPriod.indexOf("w") + 2);
mnbValue = Integer.parseInt(loopPriod.substring(2,
loopPriod.indexOf("w")));
wnbValue = Integer.parseInt(loopPriod.substring(
loopPriod.indexOf("w") + 1, loopPriod.length()));
if ("n".equalsIgnoreCase(mnb)) {
returnValue = getBeforeWeekDay(strdate, mnbValue,
wnbValue);
} else if ("b".equalsIgnoreCase(mnb)) {
returnValue = getBackWeekDay(strdate, mnbValue,
wnbValue);
}

} else {
mnbValue = Integer.parseInt(loopPriod.substring(2,
loopPriod.length())) - 1;
if ("n".equalsIgnoreCase(mnb)) {
returnValue = calDate(giveMonthFirst(strdate),
mnbValue, 5);
} else if ("b".equalsIgnoreCase(mnb)) {
returnValue = calDate(giveMonthLast(strdate),
-mnbValue, 5);

}
}
} else if ("w".equalsIgnoreCase(StringUtils.left(loopPriod, 1))) {
String week = StringUtils.right(loopPriod,
loopPriod.length() - 1);
strdate = calDate(strdate, cyclePriod - 1, 3);
while (true) {

strdate = calDate(strdate, 1, 5);
if (week.indexOf(String.valueOf(getWeekDay(strdate))) >= 0) {
returnValue = strdate;
break;
}
}
}
}

return returnValue;
}

相关文章

  • Java读取DBF文件(GBK编码)的方法

    Java读取DBF文件(GBK编码)的方法

    在Java开发中,有时需要读取DBF(dBase文件)格式的数据文件,而这些文件通常采用GBK(简体中文)编码,本文将介绍如何使用Java读取采用GBK编码的DBF文件,需要的朋友可以参考下
    2024-11-11
  • Java NIO三大组件与ByteBuffer深入理解及使用

    Java NIO三大组件与ByteBuffer深入理解及使用

    这篇文章主要介绍了Java NIO三大组件与ByteBuffer,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-01-01
  • 数组与List之间相互转换的方法详解

    数组与List之间相互转换的方法详解

    本文是对数组与List之间相互转换的方法进行了详细的分析介绍,需要的朋友可以过来参考下。希望对大家有所帮助
    2013-10-10
  • Spring Cloud Gateway重试机制的实现

    Spring Cloud Gateway重试机制的实现

    这篇文章主要介绍了Spring Cloud Gateway重试机制的实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-03-03
  • Java图片与二进制相互转换实现示例讲解

    Java图片与二进制相互转换实现示例讲解

    这篇文章主要介绍了Java图片与二进制相互转换实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-03-03
  • 深入理解Java设计模式之访问者模式

    深入理解Java设计模式之访问者模式

    这篇文章主要介绍了JAVA设计模式之访问者模式的的相关资料,文中示例代码非常详细,供大家参考和学习,感兴趣的朋友可以了解
    2021-11-11
  • RocketMQ 源码分析Broker消息刷盘服务

    RocketMQ 源码分析Broker消息刷盘服务

    这篇文章主要为大家介绍了RocketMQ 源码分析Broker消息刷盘服务示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • Websocket如何保证接收消息完整性

    Websocket如何保证接收消息完整性

    用springboot起了个websocket服务端,有时候客户端发来的消息过长,无法接收完整,需要进行额外的处理,这篇文章主要介绍了Websocket如何保证接收消息完整性,需要的朋友可以参考下
    2023-09-09
  • java使用xpath解析xml示例分享

    java使用xpath解析xml示例分享

    XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力,下面是一小示例,需要的朋友可以参考下
    2014-03-03
  • Java 方法的重载与参数传递详解

    Java 方法的重载与参数传递详解

    在java中,方法就是用来完成解决某件事情或实现某个功能的办法。方法实现的过程中,会包含很多条语句用于完成某些有意义的功能——通常是处理文本,控制输入或计算数值,这篇文章我们来探究一下方法的重载与传参
    2022-04-04

最新评论