Java 计算两个日期相差多少年月日

JDK7及以前的版本,计算两个日期相差的年月日比较麻烦。

JDK8新出的日期类,提供了比较简单的实现方法。

   /**
     * 计算2个日期之间相差的  相差多少年月日
     * 比如:2011-02-02 到  2017-03-02 相差 6年,1个月,0天
     * @param fromDate YYYY-MM-DD
     * @param toDate YYYY-MM-DD
     * @return 年,月,日 例如 1,1,1
     */
    public static String dayComparePrecise(String fromDate, String toDate){
        
        Period period = Period.between(LocalDate.parse(fromDate), LocalDate.parse(toDate));
        
        StringBuffer sb = new StringBuffer();
        sb.append(period.getYears()).append(",")
                .append(period.getMonths()).append(",")
                .append(period.getDays());
        return sb.toString();
    }

一个简单的工具方法,供参考。

简要说2点:

1. LocalDate.parse(dateString) 这个是将字符串类型的日期转化为LocalDate类型的日期,默认是DateTimeFormatter.ISO_LOCAL_DATEYYYY-MM-DD。

LocalDate还有个方法是parse(CharSequence text, DateTimeFormatter formatter),带日期格式参数,下面是JDK中的源码,比较简单,不多说了,感兴趣的可以自己去看一下源码

    /**
     * Obtains an instance of {@code LocalDate} from a text string using a specific formatter.
     * <p>
     * The text is parsed using the formatter, returning a date.
     *
     * @param text  the text to parse, not null
     * @param formatter  the formatter to use, not null
     * @return the parsed local date, not null
     * @throws DateTimeParseException if the text cannot be parsed
     */
    public static LocalDate parse(CharSequence text, DateTimeFormatter formatter) {
        Objects.requireNonNull(formatter, "formatter");
        return formatter.parse(text, LocalDate::from);
    }

2. 利用Period计算时间差,Period类内置了很多日期计算方法,感兴趣的可以去看源码。Period.between(LocalDate.parse(fromDate), LocalDate.parse(toDate));主要也是用LocalDate去做计算。Period可以快速取出年月日等数据。

 

老旧的SimpleDateFormat不是线程安全的,多线程下容易出问题。估计大部分公司都在用JDK8了吧,很多工具类是时候更新换代了,保持与时俱进。

以上。OVER!

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,计算两个日期相差多少可以使用Java 8的新日期和时间API。首先需要使用LocalDate类将日期转换为本地日期对象,然后使用Period计算两个日期之间的差距。由于Period类返回的是整数值,因此需要在计算份时使用BigDecimal类以精确小数的方式进行计算。 以下是一个示例代码,它计算了201911和202171之间的份差距: ``` import java.time.LocalDate; import java.time.Period; import java.math.BigDecimal; public class MonthDiff { public static void main(String[] args) { LocalDate date1 = LocalDate.of(2019, 1, 1); LocalDate date2 = LocalDate.of(2021, 7, 1); Period diff = Period.between(date1, date2); BigDecimal months = BigDecimal.valueOf(diff.toTotalMonths()).add( BigDecimal.valueOf(diff.getDays()).divide(BigDecimal.valueOf(date2.lengthOfMonth()))); System.out.println("The difference in months is " + months); } } ``` 以上代码计算结果为31.6个。具体计算方法是:先使用Period类将两个日期之间的差距计算出来,然后使用toTotalMonths()方法获取两个日期之间的总份数,接着使用BigDecimal类将余下来的天数除以第二个日期所在份的天数,得出份数的小数部分,并将其加到整数份数中。最终得出的结果以BigDecimal类型输出,保留小数点后一位。 需要注意的一点是,这种计算方法可能不够准确,因为它假设每个都是精确的30天。如果需要更精确的计算,需要考虑每个的实际天数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值