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

yizhihongxing

要计算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中工作时间(即除去节假日和双休日)的功能,具体如何选择,取决于个人习惯和代码需求。

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

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

相关文章

  • Spring Security安全框架之记住我功能

    标题:Spring Security安全框架之记住我功能详解 什么是记住我功能 记住我功能是指,在用户登录成功后,用户的身份认证信息会保持在客户端的cookie中,以便用户下次访问同一站点时不需要再次登录。 Spring Security中如何实现记住我功能 要在Spring Security中实现记住我功能,需要进行以下几个步骤: 1.在spring se…

    Java 2023年6月3日
    00
  • asp.net实现的MVC跨数据库多表联合动态条件查询功能示例

    ASP.NET 实现的 MVC 跨数据库多表联合动态条件查询功能是一个常见的需求,可以通过以下的步骤来实现。 步骤一:建立数据库 首先需要在数据库中建立相应的表,以便进行多表联合查询。在本次示例中,我们将创建2个表,分别是 “users” 和 “orders” 表。其中 “users” 表中包含以下字段:id, name, email, password,”…

    Java 2023年5月19日
    00
  • 详解SpringMVC解决跨域的两种方案

    下面是详解”SpringMVC解决跨域的两种方案”的完整攻略。 一、什么是跨域 跨域是指浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是Web应用程序中常见的安全漏洞。 二、为什么需要解决跨域 因为现在Web开发中使用的是前后端分离,分别使用不同的域名访问,一般情况下都会涉及到跨域问题。 三、SpringMVC解决跨域的两种方案 1、使用@Cr…

    Java 2023年5月16日
    00
  • Java虚拟机装载和初始化一个class类代码解析

    Java虚拟机(JVM)的主要任务之一是加载Java类并执行它们的代码。在JVM将class文件转换为可执行代码并在执行时,Java虚拟机会完成以下过程: 类加载 验证类 准备阶段 解析阶段 初始化阶段 以下是这些过程的完整详细解释: 类加载:在Java程序运行时,JVM首先会搜索类加载路径(classpath)来查找并加载字节码文件。类加载器将字节码文件读…

    Java 2023年5月26日
    00
  • 从字符串中截取等长字节的Java代码

    要从Java字符串中截取等长字节,我们可以使用Java内置的getBytes()方法。getBytes()方法可以将字符串转换为字节数组,我们可以根据需要从数组中截取所需的字节。 下面是截取等长字节的Java代码攻略: 1.首先,我们需要将字符串转换为字节数组,使用getBytes()方法,可以将字符串转换为字节数组。 String str = "…

    Java 2023年5月27日
    00
  • cookie+mybatis+servlet实现免登录时长两天半的整体流程

    首先,我们需要了解cookie,MyBatis和Servlet的基本知识。Cookie是存储在客户端的小型文本文件,用于在客户端和服务器之间传递信息。MyBatis是一种ORM框架,用于将Java对象映射到数据库表。Servlet是Java编写Web应用程序的技术。 实现免登录时长两天半的整体流程如下: 用户访问您的网站,并输入用户名和密码。 在服务器端,检…

    Java 2023年6月15日
    00
  • Spring MVC深入学习之启动初始化过程

    Spring MVC深入学习之启动初始化过程 Spring MVC是一个非常流行的开源Java MVC框架,拥有良好的扩展性和自由度,使用Spring MVC可以快速开发Web应用程序。在本文中,将详细讲解Spring MVC的启动初始化过程,帮助您更好地理解Spring MVC。 Servlet容器启动 在Web应用程序启动时,Servlet容器会根据we…

    Java 2023年5月16日
    00
  • Spring 代码技巧梳理总结让你爱不释手

    Spring 代码技巧梳理总结让你爱不释手攻略 介绍 Spring是一款开源的,轻量级的Java开发框架。它包含了一系列的工具,使得Java开发更加容易和高效。在本攻略中,我们会总结出一些Spring开发中的常用技巧,以帮助你更加熟悉和熟练地使用Spring。 技巧列表 使用@Autowired简化依赖注入 在Spring中,我们可以使用@Autowired…

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