计算两个日期相差几年几月几天,考虑闰年平年

news2024/11/15 17:29:35

java8以下 计算两个日期相差几年几月几天,考虑闰年平年

  //    java 计算两个日期相差几年几月几天,考虑闰年平年
    public void calculateDifference(String startDade, String endDate) {

        Calendar calendar1 = Calendar.getInstance(); // 第一个日期,默认当前日期
        Calendar calendar2 = Calendar.getInstance(); // 第二个日期,默认当前日期

        // 设置第一个日期的年、月、日
        calendar1.set(Calendar.YEAR, RexgUtil.getYMD(startDade)[0]);
        calendar1.set(Calendar.MONTH, RexgUtil.getYMD(startDade)[1]);
        calendar1.set(Calendar.DAY_OF_MONTH, RexgUtil.getYMD(startDade)[2]);

        if (null != endDate) {
            calendar2.set(Calendar.YEAR, RexgUtil.getYMD(endDate)[0]);
            calendar2.set(Calendar.MONTH, RexgUtil.getYMD(endDate)[1]);
            calendar2.set(Calendar.DAY_OF_MONTH, RexgUtil.getYMD(endDate)[2]);
        }
        int yearDifference = calendar2.get(Calendar.YEAR) - calendar1.get(Calendar.YEAR);
        int monthDifference = calendar2.get(Calendar.MONTH) - calendar1.get(Calendar.MONTH);
        int dayDifference = calendar2.get(Calendar.DAY_OF_MONTH) - calendar1.get(Calendar.DAY_OF_MONTH);

        // 考虑日期超出状况,需要从年或者月借位
        if (dayDifference < 0) {
            monthDifference -= 1;
            int month = calendar1.get(Calendar.MONTH);
            int year = calendar1.get(Calendar.YEAR);

            // 判断是否为2月,考虑闰年平年
            if (month == Calendar.FEBRUARY) {
                if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
                    dayDifference += 29;
                } else {
                    dayDifference += 28;
                }
            } else if (month == Calendar.APRIL ||
                    month == Calendar.JUNE ||
                    month == Calendar.SEPTEMBER ||
                    month == Calendar.NOVEMBER) {
                dayDifference += 30;
            } else {
                dayDifference += 31;
            }
        }

        if (monthDifference < 0) {
            yearDifference -= 1;
            monthDifference += 12;
        }

        System.out.println("Years: " + yearDifference);
        System.out.println("Months: " + monthDifference);
        System.out.println("Days: " + dayDifference);

    }



public class RexgUtil {

    public static int[] getYMD(String yyyymmddStr) {
        int[] ymd= new int[3];
//        String input = "2023年08月03日";

        // 使用正则表达式匹配年、月、日
        String pattern = "([0-9]{4})年([0-9]{2})月([0-9]{2})日";
        Pattern regex = Pattern.compile(pattern);
        Matcher matcher = regex.matcher(yyyymmddStr);

        if (matcher.find()) {
            String year = matcher.group(1);
            String month = matcher.group(2);
            String day = matcher.group(3);

//            System.out.println("年: " + year);
//            System.out.println("月: " + month);
//            System.out.println("日: " + day);

            ymd[0] = Integer.parseInt(year);
            ymd[1] = Integer.parseInt(month);
            ymd[2] = Integer.parseInt(day);
        }
        return ymd;
    }
}

如:2015年1月9日至今相差

 

jdk8以上的代码更简洁:

import java.time.LocalDate;
import java.time.Period;
import java.time.temporal.ChronoUnit;

public class Main {
    public static void main(String[] args) {
        //设置开始日期和结束日期
        LocalDate startDate = LocalDate.of(2010, 1, 1);
        LocalDate endDate = LocalDate.of(2020, 9, 20);

        //按整月计算差值
        long monthsBetween = ChronoUnit.MONTHS.between(startDate, endDate);
        long years = monthsBetween / 12;
        long remainMonths = monthsBetween % 12;

        //按天计算差值
        long daysBetween = ChronoUnit.DAYS.between(startDate.plusMonths(monthsBetween), endDate);
        
        System.out.println("相差" + years + "年" + remainMonths + "月" + daysBetween + "天");
        
      //或者你也可以使用Period做更精确的计算
        Period period = Period.between(startDate, endDate);
        System.out.println("相差" + period.getYears() + "年" + period.getMonths() + "月" + period.getDays() + "天");
    }
}

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

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

相关文章

vue+Nodejs+Koa搭建前后端系统(八)-- vue router路由嵌套、stroe状态管理

前言 本文是在该系列的基础上&#xff0c;针对前端的修改。其中前端采用vue3框架&#xff0c;脚手架为vite&#xff0c;ui组件库为ElementPlus&#xff0c;路由为vue-router&#xff0c;状态管理库为Pinia。 路由嵌套 整合模块数据文件&#xff08;路由、菜单&#xff09; …

HTB- Sau

HTB- Sau 信息收集立足root 信息收集 访问55555端口&#xff0c;得到Request Baskets。 最底下发现将详细版本暴露了出来。 这有一篇可能的ssrf漏洞文章&#xff08;这个图是postman&#xff09;。 不过似乎没有明白使用方法。在最上面还有几个功能没有尝试过。 在Settings上…

k8s之Helm安装

一、最快安装–官网提供的脚本–默认获取最新版本 cd /usr/local/src/ curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 chmod 700 get_helm.sh ./get_helm.shhelm search hub wordpresssource <(helm completion bash) h…

思迈特CEO吴华夫:大模型加持下的ABI平台,彻底解决指标平台与BI的割裂之痛丨数据猿专访...

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 在现代商业环境中&#xff0c;企业的业务需求日趋复杂&#xff0c;对数据分析的依赖也越来越深。从实时销售情况到市场趋势分析&#xff0c;从客户行为研究到产品优化调整&#xff0c;每一个环节都离不开数据的支撑。然而&a…

vue3.0 bpmn-js + TS 简易教程

前言 bpmn.js是一个BPMN2.0渲染工具包和web建模器, 使得画流程图的功能在前端来完成. 这里主要记录本人在开发bpmn中的流程 参照了 LinDaiDai_霖呆呆 大佬的文档 实战 安装 bpmn npm install --save bpmn-jsHTML <template><div class"designer-container&quo…

【深度学习】Collage Diffusion,拼接扩散,论文,实战

论文&#xff1a;https://arxiv.org/abs/2303.00262 代码&#xff1a;https://github.com/VSAnimator/collage-diffusion 文章目录 AbstractIntroductionProblem Definition and Goals论文其他内容实战 Abstract 基于文本条件的扩散模型能够生成高质量、多样化的图像。然而&a…

WEB集群——tomcat

1. 简述静态网页和动态网页的区别。 2. 简述 Webl.0 和 Web2.0 的区别。 3. 安装tomcat8&#xff0c;配置服务启动脚本&#xff0c;部署jpress应用。 一、简述静态网页和动态网页的区别 &#xff08;1&#xff09;静态网页 1.什么是静态网页 请求响应信息&#xff0c;发…

解码产品经理:深度剖析这个角色的五大职责

了解产品经理的角色 在一个组织中&#xff0c;产品经理的角色是至关重要的。他们不仅需要理解市场动态和用户需求&#xff0c;还需要将这些信息转化为实际的产品策略和行动计划。产品经理在团队中的地位是核心的&#xff0c;他们需要协调各个部门&#xff0c;包括开发、设计、…

可缝合神经网络

文章目录 Stitchable Neural Networks摘要本文方法实验结果 Stitchable Neural Networks 摘要 包含大量强大的预训练模型族(如ResNet/DeiT)的model zoo已经达到了前所未有的范围&#xff0c;这对深度学习的成功有重要贡献。由于每个模型族都由具有不同尺度的预训练模型(例如&…

W5100S-EVB-PICO做DNS Client进行域名解析(四)

前言 在上一章节中我们用W5100S-EVB-PICO通过dhcp获取ip地址&#xff08;网关&#xff0c;子网掩码&#xff0c;dns服务器&#xff09;等信息&#xff0c;给我们的开发板配置网络信息&#xff0c;成功的接入网络中&#xff0c;那么本章将教大家如何让我们的开发板进行DNS域名解…

ModaHub魔搭社区——阿里云通义千问宣布开源!70亿参数模型上线魔搭社区,免费可商用

通义千问开源!8月3日,AI模型社区魔搭ModaHub上架两款开源模型Qwen-7B和Qwen-7B-Chat,阿里云确认其为通义千问70亿参数通用模型和对话模型,两款模型均开源、免费、可商用。在多个权威测评中,通义千问7B模型取得了远超国内外同等尺寸模型的效果,成为当下业界最强的中英文7B…

月报总结|Moonbeam 7月份大事一览

炎炎夏日&#xff0c;Moonbeam于越南举办了线下交流会&#xff0c;在EthCC 2023和以太坊社区成员共同讨论多链应用&#xff0c;在Polkadot Decoded中分享了Moonbeam的与众不同之处。 Bear Necessities Hackathon也于本月圆满结束&#xff0c;选出了每个赛道最杰出的项目&#…

记一次公众号-cs客户端捡漏

声明&#xff1a;文中涉及到的技术和工具&#xff0c;仅供学习使用&#xff0c;禁止从事任何非法活动&#xff0c;如因此造成的直接或间接损失&#xff0c;均由使用者自行承担责任。 点点关注不迷路&#xff0c;每周不定时持续分享各种干货。 原文链接&#xff1a;众亦信安&a…

load、unload和pagehide、pageshow

一、load、unload和pagehide、pageshow的主要应用 1&#xff09;load 和 unload 事件监听web页面的进入和离开&#xff0c;一般用于页面的首次加载、刷新和关闭等操作的监听&#xff1b; 2&#xff09;pageshow 和 pagehide 事件多用于监听浏览器的前进和后退等。 二、pagesh…

第3集丨Vue 江湖 —— Vue中的事件

目录 一、Vue中事件使用二、事件修饰符2.1 prevent2.2 stop2.3 once2.4 capture2.5 self2.6 passive2.7 修饰符连续写2.8 整合案例 三、键盘事件3.1 Vue 中常用的按键别名3.2 key值绑定3.3 系统修饰符键3.4 keyCode绑定3.5 自定义别名3.6 组合键3.7 案例整合 一、Vue中事件使用…

k8s概念-pv和pvc

回到目录 kubernetes存储卷的分类太丰富了,每种类型都要写相应的接口与参数才行&#xff0c;这就让维护与管理难度加大。 persistenvolume(PV) 是配置好的一段存储(可以是任意类型的存储卷) 也就是说将网络存储共享出来,配置定义成PV。 PersistentVolumeClaim(PVC)是用户pod使…

实例030 窗口颜色的渐变

实例说明 在程序设计时&#xff0c;可以通过设置窗体的BackColor属性来改变窗口的背景颜色。但是这个属性改变后整个窗体的客户区都会变成这种颜色&#xff0c;并且非常单调。如果窗体的客户区可以向标题栏一样能够体现颜色的渐变效果&#xff0c;那么窗体风格将会另有一番风味…

【前端实习生备战秋招】—HTML 和 CSS面试题总结(二)

【前端实习生备战秋招】—HTML 和 CSS面试题总结&#xff08;二&#xff09; 1.有哪些方式可以对一个 DOM 设置它的 CSS 样式&#xff1f; 外部样式表&#xff0c;引入一个外部 css 文件内部样式表&#xff0c;将 css 代码放在 <head> 标签内部内联样式&#xff0c;将 c…

2023年电赛E题报告模板(K210版)--可直接使用

任务 图1 任务内容 要求 图2 基本要求内容 图3 发挥部分内容 说明 图4 说明内容 评分标准 图5 评分内容 正文 &#xff08;部分&#xff09; 摘要 本文使用K210芯片设计了一个运动目标控制与自动追踪系统。系统包括使用深度学习进行识别激光位置&#xff0c;其中红色激…

Vue2:基础入门

Vue2&#xff1a;基础入门1 Date: April 10, 2023 Sum: vue简介、vue的基本使用、vue的指令、修饰符、过滤器&#xff08;废&#xff09;、小黑的书架、记事本 Tags: * 目标&#xff1a; 能够知道 vue 的基本使用步骤 掌握插值表达式和 v-bind 指令的用法 能够掌握如何使用…