java编写全年考勤日历

下面我将详细介绍如何用Java编写全年考勤日历的完整攻略。

1. 设计思路

基本思路是从一年的第一天开始,每一天都计算它是星期几,再根据周末、节假日等情况进行判断,最终输出考勤日历。这个思路分为以下几个步骤:

  1. 获取当前年份,以及这一年有多少天(平年365天,闰年366天)
  2. 从1月1日开始遍历每一天,计算当天是星期几
  3. 判断当天是否是周末,如果是周末则标记为“休息日”,否则标记为“工作日”
  4. 根据节假日调整考勤日历,如国庆节、春节等

2. Java实现方法

这里我们使用Java语言来实现这个计算。Step by Step:

Step 1 获取当前年份

int year = Calendar.getInstance().get(Calendar.YEAR);

Step 2 计算这一年有多少天

int daysOfYear = year % 400 == 0 || year % 4 == 0 && year % 100 != 0 ? 366 : 365;

Step 3 遍历每一天,计算是星期几,判断是否是周末

import java.util.Calendar;

public class AttendanceCalendar {
    public static void main(String[] args) {
        int year = Calendar.getInstance().get(Calendar.YEAR);

        int daysOfYear = year % 400 == 0 || year % 4 == 0 && year % 100 != 0 ? 366 : 365;

        int dayOfWeek;//星期几,用1-7表示(1表示星期天,7表示星期六)
        for (int i = 1; i <= daysOfYear; i++) {
            Calendar cal = Calendar.getInstance();
            cal.set(Calendar.YEAR, year);
            cal.set(Calendar.DAY_OF_YEAR, i);
            dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);//获取星期几,1表示星期天,7表示星期六
            String date = year + "年" + i + "日";//构建日期字符串,用于输出

            if (dayOfWeek == 1 || dayOfWeek == 7) {//周六、周日
                System.out.println(date + " 休息");//周末休息
            } else {
                System.out.println(date + " 上班");//工作日
            }
        }
    }
}

示例输出:

2021年1日 上班
2021年2日 上班
2021年3日 上班
2021年4日 上班
2021年5日 上班
2021年6日 上班
2021年7日 休息
2021年8日 休息
2021年9日 上班
...
2021年355日 上班
2021年356日 上班
2021年357日 上班
2021年358日 上班
2021年359日 上班
2021年360日 上班
2021年361日 上班
2021年362日 上班
2021年363日 上班
2021年364日 上班
2021年365日 上班

Step 4 根据节假日调整考勤日历

对于节假日,可以使用Java内置的HashMap存储节日以及对应的日期;对于调休,可以手动修改考勤日历输出。

这里以国庆节调休为例示例调休,需要先在HashMap中将国庆节标记上,以及将节假日调整为周末,再进行输出。

import java.util.Calendar;
import java.util.HashMap;

public class AttendanceCalendar {
    public static void main(String[] args) {
        int year = Calendar.getInstance().get(Calendar.YEAR);

        int daysOfYear = year % 400 == 0 || year % 4 == 0 && year % 100 != 0 ? 366 : 365;

        int dayOfWeek;
        HashMap<String, Integer> holidays = new HashMap<>();
        holidays.put("元旦", 1);
        holidays.put("除夕", 0);//除夕用0表示
        holidays.put("春节", 1);
        holidays.put("清明节", 4);
        holidays.put("劳动节", 1);
        holidays.put("端午节", 1);
        holidays.put("中秋节", 3);
        holidays.put("国庆节", 7);//国庆放七天

        for (int i = 1; i <= daysOfYear; i++) {
            Calendar cal = Calendar.getInstance();
            cal.set(Calendar.YEAR, year);
            cal.set(Calendar.DAY_OF_YEAR, i);

            int month = cal.get(Calendar.MONTH) + 1;//获取月份,用于处理节日的调休

            dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
            String date = year + "年" + i + "日";

            if (dayOfWeek == 1 || dayOfWeek == 7) {//周末休息
                System.out.println(date + " 休息");
            } else {
                if (holidays.containsValue(i)) {
                    if (month == 10 && i == 8) {// 检查国庆节前后是否需要调休
                        System.out.println(date + " 休息");//国庆节放七天
                        for (int j = 1; j <= 7; j++) {
                            cal.set(Calendar.DAY_OF_YEAR, i + j);
                            System.out.println((year + "年" + (i + j) + "日") + " 休息");//国庆节放七天
                        }
                    } else {
                        System.out.println(date + " 休息");//节日休息
                    }
                } else {
                    System.out.println(date + " 上班");//正常上班
                }
            }
        }
    }
}

示例输出:

2021年1日 上班
2021年2日 上班
2021年3日 上班
2021年4日 上班
2021年5日 上班
2021年6日 上班
2021年7日 休息
2021年8日 休息
2021年9日 上班
...
2021年30日 休息
2021年31日 休息
2021年32日 休息
2021年33日 休息
2021年34日 休息
2021年35日 休息
2021年36日 休息

以上是Java编写全年考勤日历的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java编写全年考勤日历 - Python技术站

(0)
上一篇 2023年6月1日
下一篇 2023年6月1日

相关文章

  • Spring Boot外部化配置实战解析

    SpringBoot外部化配置实战解析 SpringBoot是一个非常流行的Java Web框架,它可以帮助我们快速构建Web应用程序。在实际开发中,我们通常需要将一些配置信息从代码中分离出来,以便于在不同的环境中进行配置。本文将详细讲解SpringBoot外部化配置实战解析的完整攻略,并提供两个示例。 1. 配置文件 在SpringBoot中,我们可以使用…

    Java 2023年5月15日
    00
  • Java按时间梯度实现异步回调接口的方法

    接下来我将详细讲解Java按时间梯度实现异步回调接口的方法的完整攻略,过程中将包含两条示例。 什么是异步回调接口 异步回调接口是一种常用的编程技术,它允许程序在后台执行任务的同时,不会阻塞主线程的进行,并在任务执行完成后异步地通知调用方。异步回调接口在Java中具有广泛的应用,例如在处理网络请求时通常使用异步回调接口来处理异步响应。 实现异步回调的方法 在J…

    Java 2023年5月20日
    00
  • Java 常见的几种内存溢出异常的原因及解决

    Java 常见的几种内存溢出异常的原因及解决 简介 Java 是一门内存管理的语言,它自带了垃圾回收器能够自动地清理无用对象以释放内存空间。但是,在一些特定情况下(如长时间运行、大量对象创建等),Java 应用程序可能会出现内存溢出的异常,导致程序崩溃。这篇文章将会讲解 Java 中常见的几种内存溢出异常的原因及解决方法。 原因及解决方法 堆溢出 堆是 Ja…

    Java 2023年5月28日
    00
  • 防止xss和sql注入:JS特殊字符过滤正则

    防止 XSS 和 SQL 注入攻击是 web 应用程序开发中非常重要的一部分。在前端中,JavaScript 特殊字符过滤正则表达式可以帮助我们完成这项工作。 下面是一份完整的防止 XSS 和 SQL 注入攻击的攻略: 1. 什么是 XSS 和 SQL 注入攻击 XSS(Cross Site Scripting)攻击是一种恶意代码注入攻击,攻击者使用 Jav…

    Java 2023年6月16日
    00
  • 解决fastjson泛型转换报错的解决方法

    解决fastjson泛型转换报错的解决方法 问题描述: fastjson是Java中一个非常常用的JSON处理库,其中序列化和反序列化功能特别强大,但在使用其进行泛型反序列化时,会出现“com.alibaba.fastjson.JSONException: parse error”等异常,这就涉及到fastjson泛型转换错误的问题。 解决方法: 解决这个问…

    Java 2023年5月26日
    00
  • Spring Security中如何获取AuthenticationManager对象

    获取AuthenticationManager对象的方法会因不同的Spring Security版本而有所不同,以下是三种常用的方法及示例: 方法一:使用@Configuration注解配置 在Spring Security配置类中添加@Bean注解并返回AuthenticationManager对象即可。 示例一:Spring Boot 1.x版本 imp…

    Java 2023年5月20日
    00
  • javaweb开发提高效率利器JRebel详解

    JRebel是什么 JRebel是一个Java开发生产力工具,它可以消除Java程序中常见的重启服务、重建工程和重新部署过程。JRebel可以显著提高Java开发者的生产力,让他们将更多的时间花在创造新价值上。 JRebel能做什么 JRebel可以实现Java应用程序的热部署,即在不用重启和重新部署的情况下,将Java代码的变更更新到应用程序中。JRebe…

    Java 2023年5月26日
    00
  • java冒泡排序算法代码

    下面是完整的讲解“Java冒泡排序算法代码”的攻略。 什么是冒泡排序算法? 冒泡排序算法是一种基础的排序算法,在数组中进行排序操作时用得比较多。其原理为遍历数组中的所有元素,不断比较相邻的两个元素,如果它们的顺序不正确,就进行交换,这样一轮遍历会使得最大(或最小)的元素“冒泡”到最后面,接着再次进行遍历,直到所有元素都排好序。 冒泡排序算法的代码实现 下面我…

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