Java按照每日,每周,每月,每季度,每半年,每年计算周期

1. 通过传入计划的开始时间 - 截止时间 , 自动计算出今日所在是第几周期, 并返回当前周期的开始时间的结束时间

import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.Period;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalAdjusters;public class ReportingPeriodCalculator {// 计算给定日期所在季度的第一天
private static LocalDate firstDayOfQuarter(LocalDate date) {int month = date.getMonthValue();int quarterStartMonth = (month - 1) / 3 * 3 + 1; // 计算出季度开始的月份(1、4、7、10)return date.withMonth(quarterStartMonth).with(TemporalAdjusters.firstDayOfMonth());
}static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");public static ReportingPeriodDTO calculateObject(String startDateStr, String endDateStr, String periodType) {LocalDate startDate = LocalDate.parse(startDateStr);LocalDate endDate = LocalDate.parse(endDateStr);LocalDate today = LocalDate.now();// 确保开始日期在结束日期之前或相等if (startDate.isAfter(endDate) || startDate.isAfter(today)) {throw new IllegalArgumentException("开始日期不正确");}// 确保今天日期在结束日期之前或相等if (today.isAfter(endDate)) {throw new IllegalArgumentException("已经超出截止日期");}ReportingPeriodDTO dto = new ReportingPeriodDTO();switch (periodType) {case "每日":dto.setCycle((int) ChronoUnit.DAYS.between(startDate, today) + 1);dto.setStartTime(today.format(formatter));dto.setEndTime(today.format(formatter));return dto;case "每周":// 计算从开始日期到今天的完整周数,然后检查今天是否是新的一周的开始LocalDate startOfWeek = startDate.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)); // 假设星期一是一周的第一天LocalDate todayStartOfWeek = today.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));// 往前找,最近的礼拜一LocalDate weekEnd = today.with(TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY));// 往后找,最近的礼拜天long weeks = ChronoUnit.WEEKS.between(startOfWeek, todayStartOfWeek);if (!startDate.isEqual(todayStartOfWeek)) {weeks++;}dto.setCycle((int) weeks);// 当前是第几周期dto.setStartTime(todayStartOfWeek.format(formatter));// 本周周一if(endDate.isAfter(weekEnd)) { // 结束如期在礼拜天之后, 本周期结束日期则为周日 , 如果在其之前, 本周期结束日期则为截止日期dto.setEndTime(weekEnd.format(formatter));}else{dto.setEndTime(endDate.format(formatter));}return dto;case "每月":Period period = Period.between(startDate.withDayOfMonth(1), today.withDayOfMonth(1));int cycle = period.getYears() * 12 + period.getMonths() + (today.getDayOfMonth() >= startDate.getDayOfMonth() ? 1 : 0);LocalDate monthEnd = today.with(TemporalAdjusters.lastDayOfMonth());// 本月最后一天dto.setCycle(cycle);// 当前是第几周期dto.setStartTime(today.withDayOfMonth(1).format(formatter));// 本月第一天if(endDate.isAfter(monthEnd)) { // 截止日期在本周期结束日期之后, 则返回本周期结束日期, 否则返回截止日期dto.setEndTime(monthEnd.format(formatter));}else{dto.setEndTime(endDate.format(formatter));}return dto;case "每季度":LocalDate firstDayOfTodayQuarter = firstDayOfQuarter(today);// 本月所在的季度第一天LocalDate quarterEnd = firstDayOfTodayQuarter.plusMonths(3).minusDays(1);//本月所在的季度第一天的三个月以后的前一天LocalDate firstDayOfStartDateQuarter = firstDayOfQuarter(startDate);// 开始时间所在的季度第一天// 计算today所在的季度与startDate所在的季度之间的偏移量int quartersBetween = (int) ((ChronoUnit.MONTHS.between(firstDayOfStartDateQuarter, firstDayOfTodayQuarter) + 3) / 3);dto.setCycle(quartersBetween);// 当前是第几周期dto.setStartTime(firstDayOfTodayQuarter.format(formatter));if(endDate.isAfter(quarterEnd)) { // 截止日期在本周期结束日期之后, 则返回本周期结束日期, 否则返回截止日期dto.setEndTime(quarterEnd.format(formatter));}else{dto.setEndTime(endDate.format(formatter));}return dto;case "每半年":// 判断startDate和today是否在同一年的同一半年if (startDate.getYear() == today.getYear()) {if ((startDate.getMonthValue() < 7 && today.getMonthValue() < 7) || (startDate.getMonthValue() > 6 && today.getMonthValue() > 6)) {dto.setCycle(1);dto.setStartTime(startDate.withMonth(1).withDayOfMonth(1).format(formatter));if (endDate.getMonthValue() > 6) {dto.setEndTime(startDate.withMonth(6).withDayOfMonth(30).format(formatter));}else{dto.setEndTime(startDate.withMonth(endDate.getMonthValue()).withDayOfMonth(endDate.getDayOfMonth()).format(formatter));}return dto;}if (startDate.getMonthValue() < 7 && today.getMonthValue() > 6) {dto.setCycle(2);dto.setStartTime(startDate.withMonth(7).withDayOfMonth(1).format(formatter));dto.setEndTime(startDate.withMonth(endDate.getMonthValue()).withDayOfMonth(endDate.getDayOfMonth()).format(formatter));if (endDate.getMonthValue() != 12 && endDate.getDayOfMonth() != 31) {dto.setEndTime(startDate.withMonth(endDate.getMonthValue()).withDayOfMonth(endDate.getDayOfMonth()).format(formatter));}else{dto.setEndTime(startDate.withMonth(12).withDayOfMonth(31).format(formatter));}return dto;}} else {// 如果不在同一年的同一半年,计算跨越的半年数量// 首先计算年份差int yearsBetween = today.getYear() - startDate.getYear();int x = 0;if (startDate.getMonthValue() < 7 && today.getMonthValue() < 7) {x =  1;dto.setStartTime(today.withMonth(1).withDayOfMonth(1).format(formatter));if (endDate.getMonthValue() > 6) {dto.setEndTime(today.withMonth(6).withDayOfMonth(30).format(formatter));}else{dto.setEndTime(today.withMonth(endDate.getMonthValue()).withDayOfMonth(endDate.getDayOfMonth()).format(formatter));}}if (startDate.getMonthValue() < 7 && today.getMonthValue() > 6) {x = 2;dto.setStartTime(today.withMonth(7).withDayOfMonth(1).format(formatter));if (endDate.getMonthValue() != 12 && endDate.getDayOfMonth() != 31) {dto.setEndTime(today.withMonth(endDate.getMonthValue()).withDayOfMonth(endDate.getDayOfMonth()).format(formatter));}else{dto.setEndTime(today.withMonth(12).withDayOfMonth(31).format(formatter));}}int cycle1 = x + (yearsBetween * 2);dto.setCycle(cycle1);return dto;}case "每年":int cycle2 = today.getYear() - startDate.getYear() + (today.isAfter(startDate.withYear(today.getYear())) ? 1 : 0);dto.setCycle(cycle2);dto.setStartTime(startDate.withYear(startDate.getYear()).format(formatter));int todayYear = today.getYear();int startYear = startDate.getYear();int endYear = endDate.getYear();if (todayYear == startYear) {dto.setStartTime(startDate.withYear(today.getYear()).withMonth(startDate.getMonthValue()).withDayOfMonth(startDate.getDayOfMonth()).format(formatter));}else{dto.setStartTime(startDate.withYear(today.getYear()).withMonth(1).withDayOfMonth(1).format(formatter));}if (todayYear == endYear) {dto.setEndTime(startDate.withYear(today.getYear()).withMonth(endDate.getMonthValue()).withDayOfMonth(endDate.getDayOfMonth()).format(formatter));}else{dto.setEndTime(startDate.withYear(today.getYear()).withMonth(12).withDayOfMonth(31).format(formatter));}return dto;default:throw new IllegalArgumentException("不支持的周期类型:" + periodType);}}public static void main(String[] args) {String startDate = "2023-01-01";String endDate = "2025-08-28";String periodType = "每年";calculateObject(startDate, endDate, periodType);System.out.println(calculateObject(startDate, endDate, periodType));// 每周   ReportingPeriodDTO{cycle=61, startTime='2024-02-19 00:00:00', endTime='2024-02-25 23:59:59'}// 每月   ReportingPeriodDTO{cycle=14, startTime='2024-02-01 00:00:00', endTime='2024-02-29 23:59:59'}// 每季度  ReportingPeriodDTO{cycle=2, startTime='2024-01-01 00:00:00', endTime='2024-12-31 23:59:59'}// 每半年  ReportingPeriodDTO{cycle=3, startTime='2024-01-01 00:00:00', endTime='2024-06-30 23:59:59'}// 每年   ReportingPeriodDTO{cycle=2, startTime='2024-01-01 00:00:00', endTime='2024-12-31 23:59:59'}}
}public class ReportingPeriodDTO {private Integer cycle;private String startTime;private String endTime;public Integer getCycle() {return cycle == null ? 0 : cycle;}public void setCycle(Integer cycle) {this.cycle = cycle;}public String getStartTime() {return startTime == null ? "" : startTime.trim();}public void setStartTime(String startTime) {this.startTime = startTime + " 00:00:00";}public String getEndTime() {return endTime == null ? "" : endTime.trim();}public void setEndTime(String endTime) {this.endTime = endTime + " 23:59:59";}@Overridepublic String toString() {return "ReportingPeriodDTO{" +"cycle=" + cycle +", startTime='" + startTime + '\'' +", endTime='" + endTime + '\'' +'}';}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/31422.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

崩铁自动小助手ASR开发实录

文章目录 崩铁小助手ASR功能计划功能实现操作的模拟窗口的识别游戏窗口识别副本导航和平指南页面识别页面中高亮位置的寻找右侧具体副本的寻找 未完待续开源地址 崩铁小助手ASR 天下苦二游上班坐牢久矣。方舟有MAA造福大众&#xff0c;免去日常之苦&#xff0c;能让我专心于关…

UEFI 启动原理及qemu 虚拟化中使用

UEFI 启动原理及qemu 虚拟化中使用 什么是BIOS&#xff1f;什么是 UEFI&#xff1f; 什么是BIOS&#xff1f; 计算机启动时会加载 BIOS&#xff0c;以初始化和测试硬件功能。它使用 POST 或 Power On Self Test 来确保硬件配置有效且工作正常&#xff0c;然后寻找存储引导设…

LaTeX教程(013)-LaTeX文档结构(13)

LaTeX教程(013)- LaTeX \LaTeX LATE​X文档结构(13) 接上一篇 一个新的设计案例 首先&#xff0c;我们先建立一个目录文件&#xff0c;并导入到文档中。操作如下: 第一步创建文件test.tex&#xff0c;写入如下代码并编译两次: \documentclass{book} \usepackage[a5paper,m…

SpringCloud集成OpenFeign

一、简介 OpenFeign客户端是一个web声明式http远程调用工具&#xff0c;直接可以根据服务名称去注册中心拿到指定的服务IP集合&#xff0c;提供了接口和注解方式进行调用&#xff0c;内嵌集成了Ribbon本地负载均衡器。 二、SpringCloud集成OpenFeign 版本说明&#xff1a; S…

Airtest自动化测试框架

airtest是网易出品的一个基于python的跨平台的&#xff0c;基于图像识别的自动化测试框架&#xff0c;适用于游戏和APP&#xff0c;支持多平台&#xff0c;此款框架不需要一行行的写代码&#xff0c;而是用屏幕截屏的方式来进行自动化测试 之前提到过使用weditor工具进行元素定…

什么是OAuth2分布式授权协议?

今天我将和大家一起探讨在系统安全领域非常常见的一种授权协议&#xff0c;这就是OAuth2协议&#xff0c;这个协议通常用于对请求访问进行安全控制。在引入这个协议之前&#xff0c;让我们先来回顾两个基本概念&#xff0c;一个是认证&#xff0c;一个是授权。这两个概念比较容…

探索产业园的独特产业定位与价值

数字影像产业园的产业定位独特且全面&#xff0c;涵盖了数字贸易、数字服务、数字文旅和数字基建四大主导产业方向&#xff0c;体现了园区在数字化转型和产业升级方面的前瞻性和创新性。 一、数字贸易的推动者 数字影像产业园致力于推动数字贸易的发展&#xff0c;搭建全球化、…

mysql中的lead函数和over函数

文章目录 mysql中的lead函数和over函数作用需求场景实现方法group by分组和使用over函数分组有什么区别&#xff1f; mysql中的lead函数和over函数 作用 over函数是用来分组加排序的&#xff0c;然后等over函数分好组排好序之后&#xff0c;再使用lead函数去找当前分组内的下…

NUC980-OLED实现全中文字库的方法

1.背景 有一个产品&#xff0c;客户需要屏幕展示一些内容&#xff0c;要带一些中文&#xff0c;实现了OLED12864的驱动&#xff0c;但是它不带字库&#xff0c;现在要实现OLED全字库的显示 2.制作原始字库 下载软件pctolcd2002 设置 制作字库 打开原始文件 用软件自带的&…

“用友审批+民生付款”,YonSuite让企业发薪更准时

随着现代企业经营模式的不断创新和市场竞争的加剧&#xff0c;企业薪资管理和发放的效率、准确性和及时性已成为企业管理的重要一环。然而&#xff0c;在实际操作中&#xff0c;许多企业面临着薪资管理复杂、发放流程繁琐、数据不准确等难点和痛点。为了解决这些问题&#xff0…

山海鲸可视化自学2

如何使用iframe导入地图组件&#xff0c;并且与山海鲸内元素进行交互 以天地图为例 下面是个index.html文件&#xff0c;一定是index.html 在这里插入代码片 <!DOCTYPE html> <html><head><meta http-equiv"content-type" content"text…

【重磅消息】微软开源了自家的Florence-2,处理各种视觉任务的统一模型

在人工通用智能&#xff08;AGI&#xff09;系统的世界里&#xff0c;一个重要的转变正在发生&#xff0c;那就是利用多功能的、预先训练好的表征&#xff0c;在各种应用中表现出与任务无关的适应性。这种转变始于自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;现在…

机械硬盘和固态硬盘的区别及判断硬盘类型的方法

HDD&#xff08;机械硬盘&#xff09;和 SSD&#xff08;固态硬盘&#xff09;的主要区别 存储介质 HDD&#xff1a;使用磁性盘片&#xff08;磁盘&#xff09;和机械读写头SSD&#xff1a;使用闪存芯片 速度 HDD&#xff1a;读写速度较慢&#xff0c;因为需要机械读写头在…

新学期分班群发话术

尊敬的家长们&#xff1a; 我是XX学校X年级的班主任XXX老师。随着新学期的到来&#xff0c;我带着满心的期待和责任&#xff0c;向各位宣布一个重要的信息&#xff1a;本校即将开始新学年的分班工作。 分班的目的&#xff1a; 分班是为了适应不同学生的学习需求&#xff0c;确…

SaaS企业营销:PLG转型下SaaS企业如何成为赢家

在数字化浪潮的推动下&#xff0c;SaaS&#xff08;软件即服务&#xff09;行业正经历着前所未有的变革。特别是随着产品引领增长&#xff08;PLG&#xff09;模式的兴起&#xff0c;SaaS企业正面临着前所未有的机遇与挑战。如何在PLG转型中脱颖而出&#xff0c;成为行业赢家&a…

汇川学习笔记7 - 雕刻机项目

1、系统上电轴准备好之后&#xff0c;自动复回原点一次&#xff0c; 2、在雕刻机面板上有三个按钮用来控制画三种图形 3、注意cnc代码放置的文件夹 4、FILE0文件内容 5、FILE1文件内容 6、FILE2文件内容 7、程序代码下载地址 https://download.csdn.net/download/qq_6191667…

下载LLM

0.导入相关依赖 # 升级pip python -m pip install --upgrade pip# 下载速度慢可以考虑一下更换镜像源。 # -i https://pypi.tuna.tsinghua.edu.cn/simplepip install modelscope1.9.5 pip install transformers4.35.2 pip install streamlit1.24.0 pip install sentencepiece0…

无需科学上网:轻松实现国内使用Coze.com平台自己创建的Bot(如何实现国内免费使用GPT-4o/Gemini等最新大模型)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 如何在国内使用 Coze.com 创建的 Bot 📒📝 创建Bot📝 实现国内使用📝 测试⚓️ 相关链接 ⚓️📖 介绍 📖 Coze.com 是一个强大的平台,允许用户创建各种类型的 Bot。然而,许多国内用户可能会遇到访问问题,导致无法…

Centos7.9安装openldap

文章目录 一、背景二、正文2.1 openldap服务端必要软件安装2.1.1使用yum命令安装2.1.2安装libdb相关依赖2.1.3复制一个默认配置到指定目录下&#xff0c;并授权&#xff0c;这一步一定要做&#xff0c;然后再启动服务&#xff0c;不然生成密码时会报错2.1.4授权给ldap用户&…

windows系统共享文件时,有权限文件访问被拒绝

我们在使用windows操作系统的时候&#xff0c;需要复制或者更改网络中的共享文件。但是有时候会出现图下的情况&#xff1a;文件访问被拒绝 查看共享文件的安全属性&#xff0c;发现Everyone的权限是完全控制的 这个时候我们可以看到&#xff0c;这个共享文件图标右上方带了一把…