java计算工作时间除去节假日以及双休日

要计算Java中工作时间(即除去节假日和双休日),一般的做法是使用第三方库或者手动编写代码来计算时间间隔并排除非工作日的时间。下面是两种实现方式的介绍。

使用第三方库

Java中有一些第三方库可以方便地计算时间间隔并排除非工作日。其中一种比较常用的是Joda-Time库。在计算时间间隔时,可以使用Period类,该类可以计算两个日期之间的天数、小时数、分钟数等时间间隔。在排除非工作日时,可以使用HolidayCalendar类,该类可以定义节假日和周末,并排除这些非工作日的时间。

下面是一个示例代码:

import org.joda.time.DateTime;
import org.joda.time.Period;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import org.joda.time.HolidayCalendar;
import org.joda.time.MutableDateTime;

public class WorkingTimeCalculator {
   private static final DateTimeFormatter FORMATTER = DateTimeFormat.forPattern("yyyy-MM-dd");

   public static void main(String[] args) {
      DateTime start = FORMATTER.parseDateTime("2021-09-01");
      DateTime end = FORMATTER.parseDateTime("2021-09-30");
      HolidayCalendar<MutableDateTime> holidayCalendar = new MyHolidayCalendar();
      Period workPeriod = Period.ZERO;
      MutableDateTime curDate = start.toMutableDateTime();
      while (curDate.isBefore(end)) {
         if (holidayCalendar.isHoliday(curDate)) {
            curDate.addDays(1);
            continue;
         }
         if (curDate.getDayOfWeek() >= 1 && curDate.getDayOfWeek() <= 5) {
            workPeriod = workPeriod.plus(Period.hours(8));
         }
         curDate.addDays(1);
      }
      System.out.println("Total working time: " + workPeriod.toString());
   }

   private static class MyHolidayCalendar implements HolidayCalendar<MutableDateTime> {
      public boolean isHoliday(MutableDateTime date) {
         DateTime christmas = FORMATTER.parseDateTime("2021-12-25");
         DateTime newYear = FORMATTER.parseDateTime("2022-01-01");
         return date.getMonthOfYear() == christmas.getMonthOfYear() && date.getDayOfMonth() == christmas.getDayOfMonth() ||
                date.getMonthOfYear() == newYear.getMonthOfYear() && date.getDayOfMonth() == newYear.getDayOfMonth();
      }
      public DateTime nextHoliday(MutableDateTime date) { return null; }
   }
}

这个示例代码计算从2021年9月1日到2021年9月30日工作日总时间,排除双休日和9月25日(国庆节)、10月1日(国庆节)这两天节假日。代码先将时间间隔初始化为Period.ZERO,然后循环计算每一天的工作时间,并在循环中判断是否为非工作日。

手动编写代码

在Java中手动编写代码来计算工作时间也是可行的。需要手动实现计算时间间隔和排除非工作日的逻辑。下面是一个示例代码:

import java.util.Calendar;

public class WorkingTimeCalculator {
   public static void main(String[] args) {
      Calendar start = Calendar.getInstance();
      start.set(2021, 8, 1);
      Calendar end = Calendar.getInstance();
      end.set(2021, 8, 30);
      int workHours = 0;
      while (start.before(end)) {
         int dayOfWeek = start.get(Calendar.DAY_OF_WEEK);
         if (dayOfWeek == Calendar.SUNDAY || dayOfWeek == Calendar.SATURDAY) {
            start.add(Calendar.DAY_OF_MONTH, 1);
            continue;
         }
         workHours += 8;
         start.add(Calendar.DAY_OF_MONTH, 1);
      }
      System.out.println("Total working time: " + workHours + " hours");
   }
}

这个示例代码计算从2021年9月1日到2021年9月30日工作日总时间,排除双休日。代码使用Calendar类来获取日期和星期几,并在循环中判断是否为双休日,如是则跳过计算工作时间,否则将工作时间加8小时。

这两种方式都可以实现计算Java中工作时间(即除去节假日和双休日)的功能,具体如何选择,取决于个人习惯和代码需求。

阅读剩余 44%

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java计算工作时间除去节假日以及双休日 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • Java实现Timer的定时调度函数schedule的四种用法

    一、背景介绍 Java中提供了一个Timer类,是一种比较简单的定时器实现,比如我们可以基于这个类实现类似于 Linux 中 Cron 一样定时执行某些任务的功能。其中,定时调度函数 schedule 是 Timer 类最常用的方法之一,他用于安排指定的任务在指定的时间点或者经过指定的延迟后执行一次。这个函数有 4 种用法,下面将详细讲解。 二、使用方法 s…

    Java 2023年5月20日
    00
  • Java毕业设计实战之共享租车信息管理系统的实现

    Java毕业设计实战之共享租车信息管理系统的实现 共享租车信息管理系统是一个基于Java的Web应用程序,它的主要作用是对租赁车辆进行管理和查询。本文将详细讲解实现该系统的完整攻略。 系统需求 在开始实现前,需要先明确系统的需求: 用户可以注册账号或使用已有账号登录系统; 用户可以浏览车辆信息,包含车辆图片、基本信息、租赁费用等; 用户可以选择租赁车辆,并提…

    Java 2023年5月24日
    00
  • java 中模式匹配算法-KMP算法实例详解

    Java中模式匹配算法-KMP算法实例详解 什么是模式匹配算法? 模式匹配算法是计算机科学中的一个基本问题,它是指在一个字符串中查找特定模式的过程。模式通常是一个短字符串,而在给定的文本字符串中查找该模式的过程被称为找到模式。模式匹配在很多领域应用广泛,如文本查找、图像处理、数据压缩等。 什么是KMP算法? KMP算法是一种著名的模式匹配算法,也称作 Knu…

    Java 2023年5月19日
    00
  • 正则表达式的匹配字串引用($1、$2…)

    上季度公司一个需求是要求优化项目接口的返回结果处理方式,原先各Controller直接调用SuperController的结果处理方法,类似这样: return callBackSuccess(data); return callBackSuccess(msg, data); return callBackFilure(AppCode.XXX); // Ap…

    Java 2023年4月17日
    00
  • java-servlet-转发AND路径(详解)

    下面是对应的完整攻略: Java Servlet 转发和路径详解 什么是 Servlet 转发? Servlet 转发是指一个 Servlet 将请求转发到另一个 Servlet(或 JSP、HTML等)进行处理,并将处理结果返回给客户端。在转发时,客户端并不知道请求被转发到了哪里,所以转发时可以使用相对路径,不一定非得使用绝对路径。 Servlet 转发示…

    Java 2023年6月15日
    00
  • Java Apache Commons报错“JXPathException”的原因与解决方法

    “JXPathException”是Java的Apache Commons类库中的一个异常,通常由以下原因之一引起: 无效的XPath表达式:如果XPath表达式无效,则可能会出现此错误。在这种情况下,需要检查XPath表达式以解决此问题。 无效的对象模型:如果对象模型无效,则可能会出现此错误。在这种情况下,需要检查对象模型以解决此问题。 以下是两个实例: …

    Java 2023年5月5日
    00
  • 这可能是最全面的MySQL面试八股文了

    什么是MySQL MySQL是一个关系型数据库,它采用表的形式来存储数据。你可以理解成是Excel表格,既然是表的形式存储数据,就有表结构(行和列)。行代表每一行数据,列代表该行中的每个值。列上的值是有数据类型的,比如:整数、字符串、日期等等。 数据库的三大范式 第一范式1NF 确保数据库表字段的原子性。最全面的Java面试网站 比如字段 userInfo:…

    Java 2023年4月25日
    00
  • Sprint Boot @Max使用方法详解

    @Max是Spring Boot中的一个注解,用于标记一个字段或方法参数的值必须小于或等于指定的最大值。在本文中,我们将详细介绍@Max注解的作用和使用方法,并提供两个示例。 @Max注解的作用 @Max注解用于标记一个字段或方法参数的值必须小于或等于指定的最大值。当使用@Max注解标记一个字段或方法参数时,如果该字段或方法参数的值大于指定的最大值,则会抛出…

    Java 2023年5月5日
    00
合作推广
合作推广
分享本页
返回顶部