`
kanpiaoxue
  • 浏览: 1781048 次
  • 性别: 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、...

    java 请假天数计算工具类

    这个工具类的设计通常涉及到日期处理、工作日计算以及根据公司规则进行调整等多个方面。在这个场景中,我们看到与SpringMVC、Shiro和Redis三个技术相关的标签,这表明该工具类可能是整合在基于这些技术的系统中的。 ...

    【强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.util`、`java.lang`、`java.io`等。下面将详细介绍...

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

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

    java 日期操作工具类:包括计算两个时间相差距离多少天多少小时多少分多少秒

    这篇博客文章“java 日期操作工具类:包括计算两个时间相差距离多少天多少小时多少分多少秒”提供了一个实用的工具类,帮助开发者更方便地处理日期和时间差异。下面将详细解释这个工具类中的关键知识点。 1. **Java...

    java各种工具类-非常齐全

    本资源包含了一系列全面的Java工具类,涵盖了多个核心领域,如日期处理、字符串操作、文件管理、XML和JSON解析以及HTTP请求等。 1. **日期工具类**: Java中的日期时间处理在过去一直被诟病,但在Java 8引入了`...

    Java工具类合集

    本资源名为“Java工具类合集”,显然是一份集合了多种功能的Java工具类库,可能包含了一系列开源框架中的实用工具类。 首先,我们可以从“mysql版本”这个标签推测,这个合集中可能包含了与MySQL数据库交互相关的...

    java日期工具类

    本文将深入探讨`java.util.Date`和`java.time`包中的日期工具类。 首先,`java.util.Date`是Java 1.0时代就存在的类,它代表了从1970年1月1日00:00:00 UTC(协调世界时)起的毫秒数。尽管`Date`类提供了获取和设置...

    Java日期工具类,Java时间工具类,Java时间格式化

    Java提供了多种工具类来帮助开发者处理日期和时间,使得我们可以方便地进行日期计算、格式化以及解析等操作。本篇将围绕Java中的日期工具类和时间工具类展开讨论,同时会涉及到日期时间的格式化。 首先,Java 8之前...

    java操作日期时间工具类

    Java提供了多种工具类来帮助开发者进行日期时间的操作,其中最常用的是`java.util.Date`、`java.util.Calendar`以及`java.time`包中的类。本篇将重点介绍Java操作日期时间的工具类,特别是通过`DateUtil.java`这个...

    最全的java时间(日期)工具类

    本文将深入探讨Java中的日期时间工具类,特别是基于给定的"DateUtil.java"文件,我们将聚焦在传统`java.util.Date`和`java.text.SimpleDateFormat`以及Java 8的`java.time`包中的相关类。 首先,我们来看看`java....

    Java - DateUtil 日期时间转换工具类

    内容概要:日期时间转换工具类,包括基本的Date类型,String类型,TimeStamp类型,LocalDateTime类型,LocalDate类型之间的互相转换,还提供了许多与时间获取,时间计算有关的方法,如:获取指定日期几天后的日期;...

Global site tag (gtag.js) - Google Analytics