目录

(1)通过 Java 的基本语法来实现万年历

(2)Java 获取一年中所有的周六和周日

(3)Java 节假日导入导出


(1)通过 Java 的基本语法来实现万年历

在 Java 的时间计算方面还有很多好用的工具类,Java 常用的工具类封装框架链接如下:HUTool 框架官网

package com.taier.pulsar.date_utils;import java.util.Scanner;/*** @author swadian2008*/
public class DateUtils {public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.println("请输入年:");int year = sc.nextInt();System.out.println("请输入月份:");int month = sc.nextInt();//1.计算1900.1.1到输入年的天数int dayOfYear = 0;for (int i = 1900; i < year; i++) {if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0) { // 闰年dayOfYear += 366;} else {dayOfYear += 365;}}//2.计算1月到输入月的天数int dayOfMonth = 0;for (int i = 1; i < month; i++) {switch (i) {case 1:case 3:case 5:case 7:case 8:case 10:case 12:dayOfMonth += 31;break;case 4:case 6:case 9:case 11:dayOfMonth += 30;break;case 2:if ((year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0)) {dayOfMonth += 29;} else {dayOfMonth += 28;}break;}}//3.获取输入月的天数int day = 0;switch (month) {case 1:case 3:case 5:case 7:case 8:case 10:case 12:day = 31;break;case 4:case 6:case 9:case 11:day = 30;break;case 2:if ((year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0)) {day = 29;} else {day = 28;}break;}//4.计算星期int allDay = dayOfYear + dayOfMonth + 1;int week = allDay % 7; // 计算余数在星期中的位置int count = 0;// 计数器,记录日期的空格System.out.println("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六");//5.打印空格for (int i = 1; i <= week; i++) {System.out.print("\t\t\t");count++;}//6. 打印日历for (int i = 1; i <= day; i++) {if (i < 10) { // 为了格式化System.out.print(i + "\t\t\t");} else {System.out.print(i + "\t\t");}count++;//若记录数是七的倍数,换行输出if (count % 7 == 0) {System.out.println();}}}
}

打印效果如下:

(2)Java 获取一年中所有的周六和周日

下边的示例中使用了一个Map来收集周六和周日,可以根据需要进行调节:

import static java.time.temporal.TemporalAdjusters.firstInMonth;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.Month;
import java.time.Period;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.stream.Collectors;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;/*** @author swadian2008*/
public class WeekDay {public static void main(String[] args) {// 创建代表一年中第一天的LocalDate对象。int year = 2023;LocalDate now = LocalDate.of(year, Month.JANUARY, 1);Map<String, List<Integer>> weekMap = new HashMap<>(12);// 第一个星期六LocalDate saturday = now.with(firstInMonth(DayOfWeek.SATURDAY));do {String satMonth = String.valueOf(saturday.getMonthValue());if (CollectionUtils.isEmpty(weekMap.get(satMonth))) {weekMap.put(satMonth, new ArrayList<>(Arrays.asList(saturday.getDayOfMonth())));} else {List<Integer> values = weekMap.get(satMonth);values.add(saturday.getDayOfMonth());Collections.sort(values);weekMap.put(satMonth, values);}// 迭代一个星期saturday = saturday.plus(Period.ofDays(7));} while (saturday.getYear() == year);// 第一个星期天LocalDate sunday = now.with(firstInMonth(DayOfWeek.SUNDAY));do {String sunMonth = String.valueOf(sunday.getMonthValue());if (CollectionUtils.isEmpty(weekMap.get(sunMonth))) {weekMap.put(sunMonth, new ArrayList<>(Arrays.asList(sunday.getDayOfMonth())));} else {List<Integer> values = weekMap.get(sunMonth);values.add(sunday.getDayOfMonth());Collections.sort(values);weekMap.put(sunMonth, values);}// 迭代一个星期sunday = sunday.plus(Period.ofDays(7));} while (sunday.getYear() == year);Map<String, List<Integer>> sortWeekMap = weekMap.entrySet().stream().sorted((e1, e2) ->Integer.compare(Integer.parseInt(e1.getKey()), Integer.parseInt(e2.getKey()))).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1,LinkedHashMap::new));for (Entry<String, List<Integer>> map : sortWeekMap.entrySet()) {System.out.println(map.getKey() + "月:" + map.getValue().toString());}}
}

打印效果如下:

(3)Java 节假日导入导出

Java 节假日导入导出会要操作一些 excel 文件,推荐使用 Easy Excel

使用该框架后,就不再需要写原生的 POI 了,而且在数据量方面也提供了相关的解决方案。

导入 Excel 文件示例

文件上传的 Controller.calss 示例

    /*** 导入节假日管理信息* @param file*/@PutMapping("/file" )public void uploadHolidays(@RequestParam("file") MultipartFile file) throws IOException {return HolidaysService.uploadHolidays(file);}

上传过程 ServiceImpl.calss 示例

    // 上传数据,并返回上传的数据:这里有一个监听器,此监听器并非 Spring 进行管理public String uploadHolidays(MultipartFile file) throws IOException {List<ConfigureHolidaysVO> holidaysVOS = EasyExcel.read(file.getInputStream(), ConfigureHolidaysVO.class,new HolidaysDataListener(this)).sheet().doReadSync();return true;}

监听器的简单示例

@Slf4j
public class HolidaysDataListener implements ReadListener<ConfigureHolidaysVO> {private ConfigureHolidaysService holidaysService;public HolidaysDataListener(ConfigureHolidaysService holidaysService) {this.holidaysService = holidaysService;}private static final int BATCH_COUNT    = 100;/*** 缓存的数据*/private  List<ConfigureHolidaysVO> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);@Overridepublic void invoke(ConfigureHolidaysVO data, AnalysisContext context) {log.info("解析到一条数据:{}", JSON.toJSONString(data));cachedDataList.add(data);if (cachedDataList.size() >= BATCH_COUNT) {saveData();// 存储完成清理 listcachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);}}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {// 确保最后遗留的数据存储到数据库saveData();log.info("所有数据解析完成!");}/*** 加上存储数据库*/private void saveData() {log.info("{}条数据,开始存储数据库!", cachedDataList.size());holidaysService.saveBatchHolidaysVOs(cachedDataList);}
}

        导出 Excel 文件示例

文件导出的 Controller.calss 示例

    /*** 导出节假日管理信息* @param response*/@GetMapping("/{year}/file" )public void downloadHolidays(HttpServletResponse response, @PathVariable String year) throws IOException {HolidaysService.downloadHolidays(year, response);}

导出过程 ServiceImpl.calss 示例:当直接把数据流写入 HttpServletResponse 时,就可以直接在浏览器中下载导出的文件,当然也可以把文件写入到指定的路径,详情请查阅文档。

    /*** 数据导出*/public void downloadHolidays(String year, HttpServletResponse response) throws IOException {response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");response.setCharacterEncoding("utf-8");String fileName = URLEncoder.encode(year + "年节假日数据导出", "UTF-8").replaceAll("\\+", "%20");response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");EasyExcel.write(response.getOutputStream(), ConfigureHolidaysVO.class).sheet(year).doWrite(holidaysData(year));}/*** 获取存储在数据库中的节假日数据* @param year* @return*/private List<ConfigureHolidaysVO> holidaysData(String year) {return list(Wrappers.lambdaQuery(ConfigureHolidays.class).eq(ConfigureHolidays::getAdjustYear, year)).stream().map(r -> {ConfigureHolidaysVO vo = new ConfigureHolidaysVO();BeanUtils.copyProperties(r, vo);List<Integer> dayList = JSON.parseObject(r.getAdjustDays(), List.class);vo.setAdjustDays(dayList);return vo;}).sorted(Comparator.comparing(e -> Integer.valueOf(e.getAdjustMonth()))).collect(Collectors.toList());}

因为节假日的导入导出重点在于 POI 操作 ,并非本文重点,有关更加详细的 POI 操作请查阅 easy excel 文档。

Java 万年历、周六日计算、节假日导出相关推荐

  1. java 算出下一个工作日_Java 计算一段时间段内除去周六日、节假日的工作日数———超详细(全)...

    Java 计算一段时间段内除去周六日.节假日的工作日数'' 实现功能提要: 本文章记录的是某段时间的起止时间段内的工作日,既是除去周六周日以及节假日日期的工作日数: 注释比较多,因为怕自己忘记,写的可 ...

  2. Java 计算一段时间段内除去周六日、节假日的工作日数———超详细(全)

    Java 计算一段时间段内除去周六日.节假日的工作日数'' 1.前端界面简介 2.后台处理代码 3.注: <END> 实现功能提要: 本文章记录的是某段时间的起止时间段内的工作日,既是除去 ...

  3. SQL-剔除周六日,节假日,非工作时间

    需求是:求每个请求ID操作时间和验收时间之间的间隔,需要剔除周六日,节假日,非工作时间(我们的工作时间 09:00-17:30 午休时间12:00-13:00 午休时间不属于工作范围,需要剔除) 当看 ...

  4. MYSQL 如何得到两个日期间的工作日(不含周六日,节假日)

    写在前面  参考文章 SQL 如何得到两个日期间的工作日(附假期表)_Fuzz-CSDN博客_sql计算日期之间工作日函数 这篇文章使用的是SQL SEVER ,如何转化为 MYSQL 新手尝试两个小 ...

  5. Java 周日期计算工具,获取当前第几周,按周数获取周一至周日,按日期获取周一至周日

    记一个自己写的工具类: 1.按时间获取当前第几周 getzs 3.按日期获取周一至周日getgetBetweenDates2 4.按年份跟周数获取周一至周日 getgetBetweenDates3 结 ...

  6. 日期累加器(任意时间基础上加上天数,不包括节假日以及周六日)

    最近工作中遇到个需求,大致的实现功能是,在某一天的基础上加上规定的天数,所加的这些天中不包括周六日以及节假日. 比如: 在2月7日的基础上加7天,这7天不包含节假日和周六日,所以最后的时间应该是2月2 ...

  7. java 排除法定节假日以及正常周六日,计算两个Date相差的小时数

    项目组有一个需求,计算两个Date类型参数,相差的小时数.业务上有一些特殊的用途,可能用于绩效考核的目的吧- 如果不排除节假日周六日的话,处理起来非常easy,是个程序员都能写出来,但是-如果要排除法 ...

  8. Java自动生成日历,移除节假日和周六日

    Java生成日历,排除周六日以及法定节假日 一.生成简单日历,排除周六日和法定节假日 二.生成日历,农历转换,排除节假日 一.生成简单的日历 1.设置某年的开始时间和结束时间,例如:2021-01-0 ...

  9. java实现剩余年假计算_计算两个日期之间的天数、工时(去除周六日、年假日)...

    需求: 有个外出申请的功能,我填写上外出申请时间.外出返回日期, 自动计算出 外出的天数和工时(其中不包含周六日.年假日) 外出申请日期 :2020-12-24 14:54:00 外出返回日期 : 2 ...

最新文章

  1. [笔记].如何使用Nios II的中断:PIO中断与定时器中断
  2. 慎用MySQL replace语句
  3. SQL中的CASE WHEN语句
  4. 【Linux】一步一步学Linux——init命令(138)
  5. java ssm 系统的搭建_SSM框架下的javaweb学生管理系统--搭建系统结构
  6. 《0bug-C/C++商用工程之道》节选00--内存管理的基本要求
  7. 一朵更好的云 MADE IN 青云QingCloud
  8. mysql变红_数据库变成红色紧急
  9. 2017百度之星复赛:1003. Pokémon GO(递推)
  10. eclipse不报错 intelliji 报错_小白提问:导入内置包winsound不报错但没声音是什么情况?...
  11. 论文写作之WPS安装Mathtype插件编写数学公式
  12. c语言中printf输出,C语言中printf输出的总结
  13. winrar密码秒破_家用的指纹密码锁好用吗?什么品牌好?
  14. win7远程桌面连接设置
  15. 2023年重庆邮电大学计算机科学与技术(802)初试经验贴
  16. 微信开发者工具测试小程序
  17. 猿辅导9-12编程题3道
  18. JavaScript中document的用法
  19. python numpy 对西瓜数据小样进行 k-means 聚类
  20. 右移位和除以2(C++)

热门文章

  1. ubuntu-14.04 源码安装cntk笔记
  2. Python(十四)测试、调试和异常
  3. N型连接器市场现状及未来发展趋势分析
  4. 织梦mysql安装教程_新手教程:DedeCmsV5.7 SP1详细安装步骤(2)
  5. 2023“汇臻心 赋新能”,人大金仓百城巡展再启航
  6. BSRGAN超分辨网络
  7. html5 端午节 龙舟,龙舟竞渡共庆端午节
  8. vue3个人学习进度(PPT版)
  9. 借助VC++ UDF Studio探索UDF手册中没有记录的宏
  10. 300万年薪招不到人,谁能胜任首席安全官?