转:Java 计算2个时间相差多少年,多少个月,多少天的几种方式

日期比较对象 DayCompare 代码用到了  lombok ,如果不用,其实就是把getter / setter方法自己写一遍,还有构造方法。

    @Data
    @Builder
    public static class DayCompare{
        private int year;
        private int month;
        private int day;
    }
复制代码
/**
 * 计算2个日期之间相差的  相差多少年月日
 * 比如:2011-02-02 到  2017-03-02 相差 6年,1个月,0天
 * @param fromDate
 * @param toDate
 * @return
 */
public static DayCompare dayComparePrecise(Date fromDate,Date toDate){
    Calendar  from  =  Calendar.getInstance();
    from.setTime(fromDate);
    Calendar  to  =  Calendar.getInstance();
    to.setTime(toDate);

    int fromYear = from.get(Calendar.YEAR);
    int fromMonth = from.get(Calendar.MONTH);
    int fromDay = from.get(Calendar.DAY_OF_MONTH);

    int toYear = to.get(Calendar.YEAR);
    int toMonth = to.get(Calendar.MONTH);
    int toDay = to.get(Calendar.DAY_OF_MONTH);
    int year = toYear  -  fromYear;
    int month = toMonth  - fromMonth;
    int day = toDay  - fromDay;
    return DayCompare.builder().day(day).month(month).year(year).build();
}
复制代码
复制代码
/**
 * 计算2个日期之间相差的  以年、月、日为单位,各自计算结果是多少
 * 比如:2011-02-02 到  2017-03-02
 *                                以年为单位相差为:6年
 *                                以月为单位相差为:73个月
 *                                以日为单位相差为:2220天
 * @param fromDate
 * @param toDate
 * @return
 */
public static DayCompare dayCompare(Date fromDate,Date toDate){
    Calendar  from  =  Calendar.getInstance();
    from.setTime(fromDate);
    Calendar  to  =  Calendar.getInstance();
    to.setTime(toDate);
    //只要年月
    int fromYear = from.get(Calendar.YEAR);
    int fromMonth = from.get(Calendar.MONTH);

    int toYear = to.get(Calendar.YEAR);
    int toMonth = to.get(Calendar.MONTH);

    int year = toYear  -  fromYear;
    int month = toYear *  12  + toMonth  -  (fromYear  *  12  +  fromMonth);
    int day = (int) ((to.getTimeInMillis()  -  from.getTimeInMillis())  /  (24  *  3600  *  1000));
    return DayCompare.builder().day(day).month(month).year(year).build();
}
复制代码
复制代码
/**
 * 计算2个日期相差多少年
 * 列:2011-02-02  ~  2017-03-02 大约相差 6.1 年
 * @param fromDate
 * @param toDate
 * @return
 */
public static String yearCompare(Date fromDate,Date toDate){
    DayCompare result = dayComparePrecise(fromDate, toDate);
    double month = result.getMonth();
    double year = result.getYear();
    //返回2位小数,并且四舍五入
    DecimalFormat df = new DecimalFormat("######0.0");
    return df.format(year + month / 12);
}
复制代码

 转自:https://www.sojson.com/blog/260.html

posted @   Bob.Xie  阅读(31874)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示