`
kanpiaoxue
  • 浏览: 1747802 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

计算工作日期的java工具类

 
阅读更多

 

 

import org.apache.commons.collections.CollectionUtils;
import org.joda.time.DateTime;
import org.joda.time.DateTimeConstants;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.google.common.base.Charsets;
import com.google.common.base.Preconditions;
import com.google.common.base.Stopwatch;
import com.google.common.collect.Lists;
import com.google.common.io.FileWriteMode;
import com.google.common.io.Files;

import java.io.File;
import java.io.IOException;
import java.util.List;

/**
 * @ClassName WorkDateCalculator
 * @author kanpiaoxue
 * @version 1.0
 * @CreateTime 2017/07/16 19:54:26
 * @Description 计算工作日期的 java 工具类
 */
public class WorkDateCalculator {
    protected static final Logger LOG = LoggerFactory.getLogger(WorkDateCalculator.class);
    private static final String FORMATE_DATE = "yyyy-MM-dd";
    private static final DateTimeFormatter FORMATTER = DateTimeFormat.forPattern(FORMATE_DATE);

    
    public WorkDateCalculator() {
    }

    /**
     * @param args
     * @author kanpiaoxue
     * @CreateTime 2017/07/16 19:54:26
     * @Description main 函数
     */
    public static void main(String[] args) {
        WorkDateCalculator cal = new WorkDateCalculator();
        DateTime startDate = DateTime.parse("2021-01-01", FORMATTER);
        DateTime endDate = DateTime.parse("2021-12-31", FORMATTER);
        List<DateTime> dateTimes = cal.calculate(startDate, endDate, null, null);
        boolean createFile = true;
        cal.show(dateTimes, createFile);
    }

    /**
     *
     * @param startDate
     *            开始日期
     * @param endDate
     *            结束日期
     * @param workStartDate
     *            每周的工作日的开始是星期几?默认是周一
     * @param workEndDate
     *            每周的工作日的结束是星期几?默认是周五
     * @return 工作日列表
     * @author kanpiaoxue
     * @CreateTime 2017/07/16 19:54:26
     * @Description 根据开始日期和结束日期以及制定的每周的工作日始末位置计算工作日列表
     */
    public List<DateTime> calculate(DateTime startDate, DateTime endDate, Integer workStartDate,
            Integer workEndDate) {
        Preconditions.checkNotNull(startDate, "startDate is null");
        Preconditions.checkNotNull(endDate, "endDate is null");
        if (null == workStartDate) {
            workStartDate = DateTimeConstants.MONDAY;
        }
        if (null == workEndDate) {
            workEndDate = DateTimeConstants.FRIDAY;
        }

        LOG.debug("startDate:{},endDate:{}", startDate.toString(FORMATE_DATE),
                endDate.toString(FORMATE_DATE));
        Preconditions.checkArgument(startDate.isBefore(endDate), "startDate is after endDate");
        List<DateTime> list = Lists.newArrayList();
        list.add(startDate);
        while (startDate.isBefore(endDate)) {
            DateTime tmp = startDate.dayOfYear().addToCopy(1);
            if (tmp.getDayOfWeek() >= workStartDate && tmp.getDayOfWeek() <= workEndDate) {
                list.add(tmp);
            }
            startDate = tmp;
        }
        return list;
    }

    /**
     * 得到日期所属的星期几
     * 
     * @param dateTime
     * @return
     * @author kanpiaoxue
     * @CreateTime: 2019/12/26 10:34:29
     * @Description:
     */
    public String dayOfWeek(DateTime dateTime) {
        Preconditions.checkNotNull(dateTime, "dateTime is null");
        int dayOfWeek = dateTime.getDayOfWeek();
        String num = null;
        switch (dayOfWeek) {
            case DateTimeConstants.MONDAY:
                num = "一";
                break;
            case DateTimeConstants.TUESDAY:
                num = "二";
                break;
            case DateTimeConstants.WEDNESDAY:
                num = "三";
                break;
            case DateTimeConstants.THURSDAY:
                num = "四";
                break;
            case DateTimeConstants.FRIDAY:
                num = "五";
                break;
            case DateTimeConstants.SATURDAY:
                num = "六";
                break;
            case DateTimeConstants.SUNDAY:
                num = "日";
                break;
            default:
                throw new IllegalArgumentException(String.format("can not found dayOfWeek:%s", dayOfWeek));
        }
        return String.format("星期%s", num);
    }

    /**
     * @param dateTimes
     *            日期列表
     * @param createFile
     *            是否创建文件
     * @author kanpiaoxue
     * @CreateTime 2017/07/16 22:01:35
     * @Description 根据日期列表和创建文件的标识生成工作日(周一至周五)的工作日志内容列表
     */
    public void show(List<DateTime> dateTimes, boolean createFile) {
        LOG.info("start to show");
        Stopwatch sw = Stopwatch.createStarted();
        Preconditions.checkArgument(CollectionUtils.isNotEmpty(dateTimes), "dateTimes is null or empty!");
        String format = "\n%s\n    今日工作:\n    今日收获:\n    明日工作:\n    持续跟进:\n";

        List<String> content = Lists.newArrayList();
        for (DateTime tmp : dateTimes) {

            String dayOfWeek = dayOfWeek(tmp);

            String date = tmp.toString(FORMATTER);
            String rs = String.format(format, date + "(" + dayOfWeek + ")");
            System.out.println(rs);
            content.add(rs);
        }

        if (createFile) {
            try {
                String fileName =
                        String.format("/Users/kanpiaoxue/tmp/tmp.%s.txt", DateTime.now().toString(FORMATTER));
                LOG.info("filename : {}", fileName);
                File file = new File(fileName);
                if (file.exists()) {
                    file.delete();
                }
                Files.createParentDirs(file);
                Files.asCharSink(file, Charsets.UTF_8, FileWriteMode.APPEND).writeLines(content);
                LOG.info("the file : {}", file);
            } catch (IOException e) {
                LOG.error(e.getMessage(), e);
            }
        }

        LOG.info("finish showing. It consumes {}", sw);

    }
}

 

分享到:
评论

相关推荐

    JAVA时间工具类(计算法定工作日工时等)

    JAVA时间工具类(计算法定工作日工时):计算某个日期加上几个工作日后的一个工作日期(除周末和法定节假日),计算某个日期后一天的工作日期(除周末和法定节假日),计算两个日期的真实工作日(除周末和法定节假日),...

    Java 日期比较工具类

    Java 日期比较工具类 各种日期操作及计算( 获取两个日期 间隔天数 间隔月数 格式化日期 )

    30个java工具类

    [工具类] 获得汉字拼音首字母的java工具类.java.txt [工具类] 获取绝对路径 .java.txt [工具类] 记录log日志文件的工具类 .java.txt [工具类] 连接数据库的工具类 .java.txt [工具类] 使用Java程序来实现HTTP文件的...

    Java日期工具类

    Java日期工具类 1、日期的各种格式化 2、获取当前年度 3、获取当前月份 4、获取当前天号数 5、获取当前时间往前推一个月的时间 6、获取上个月("MMM yyyy") 7、获取上个月("yyyymm") 8、获取上个月("yyyy-mm") 9、...

    【强2】30个java工具类

    使用java工具类可有效的提高开发效率! 没有CSDN积分的朋友到这里源头下载:http://www.javacs.cn/bbs/thread-382-1-1.html 感谢支持 [工具类] CookieCounter .java.txt [工具类] 验证码img .jsp.txt [工具类] Java中...

    常用的java工具类

    2.[工具类] Java中计算任意两个日期之间的工作天数 .java 3.[工具类] MD5 .java 4.[工具类] 时间工具TimeUtil.java 5.[工具类] 通信服务端simpleServer 6.[工具类] 使用Java程序来实现HTTP文件的队列下载 .java 7....

    java工具类:Java中计算任意两个日期之间的工作天数.java

    Java中计算任意两个日期之间的工作天数.java 工具类

    java各种工具类-非常齐全

    java各种工具类:包括日期工具类、字符串工具类、文件工具类、xml读写工具类、json工具类、http访问工具类、压缩包工具类等等。非常齐全

    java日期,时间工具类

    各种日期格式,时间戳,时间计算的相互转换。直接引入工程中,可使用

    日期工具类 可以进行日期天数计算

    这个工具类是计算两个时间相差多少天的工具类以及格式化时间

    最全Java常用日期处理工具类

    该Java工具类调用时只需要类名.方法即可调用。 1.返回纯数字的年月日时分秒时间戳:20191008103656 4.在日期上增加数个整月 5.在日期上增加天数 6.在日期上增加n分钟 7.两个时间相差距离多少天多少小时...

    android java日期计算工具

    android java日期计算工具

    时间日期转换 工具类

    时间日期转换工具类!各种格式各种转换和一些计算 交易日的工具

    jaava和jsp工具类

    [工具类] 获得汉字拼音首字母的java工具类 .java [工具类] 获取绝对路径 .java [工具类] 记录log日志文件的工具类 .java [工具类] 连接数据库的工具类 .java [工具类] 使用Java程序来实现HTTP文件的队列下载 ....

    我积攒的java工具类 基本满足开发需要的工具类

    D:\002 我的工具类\003 日期\DateUtil.java D:\002 我的工具类\004 加密 D:\002 我的工具类\004 加密\DESUtils.java D:\002 我的工具类\004 加密\PasswordHash.java D:\002 我的工具类\005 随机数 D:\002 我的工具类...

    java 请假天数计算工具类

    分享之前做的一个oa请假天数计算工具类,有点伤脑筋,弄了好久,可以根据公司实际要求修改。

    时间工具类

    时间类型方面很好用的工具类,包括时间类型的转化与计算等

    工作日工具类.java

    使用Java语言进行计算除去周六周日日期、节日假期的应该工作的工作日日数!项目实战中写的,里面有很详细的注释,不用担心看不懂!

    使用Java的Calendar类计算两段时间之间的工作日的天/小时/分钟/秒数

    该工具类用于两个时间段之间节假日的计算(可获取两个时间段之间的节假日天数,小时,分钟,秒)

Global site tag (gtag.js) - Google Analytics