两个时间点计算相隔几年,几个月,几天-java

本文采用Calendar 实现 ,当然也可以用java8提供的愉快且方便的时间处理- LocalDate

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class DateDaySub {

    private static Calendar calS = Calendar.getInstance();
    private static Pattern p = Pattern.compile("\\d{4}-\\d{2}-\\d{2}");//定义整则表达式


    /**
     * 计算剩余时间
     *
     * @param startDateStr yyyy-MM-dd
     * @param endDateStr yyyy-MM-dd
     * @return  	?年?个月?天
     */
    public static String remainDateToString(String startDateStr, String endDateStr) {
        java.util.Date startDate = null;
        java.util.Date endDate = null;
        try {
            startDate = new SimpleDateFormat("yyyy-MM-dd").parse(startDateStr);
        } catch (ParseException e) {
            e.printStackTrace();
            return "";
        }
        try {
            endDate = new SimpleDateFormat("yyyy-MM-dd").parse(endDateStr);
        } catch (ParseException e) {
            e.printStackTrace();
            return "";
        }
        calS.setTime(startDate);
        int startY = calS.get(Calendar.YEAR);
        int startM = calS.get(Calendar.MONTH);
        int startD = calS.get(Calendar.DATE);
        int startDayOfMonth = calS.getActualMaximum(Calendar.DAY_OF_MONTH);

        calS.setTime(endDate);
        int endY = calS.get(Calendar.YEAR);
        int endM = calS.get(Calendar.MONTH);
        //处理2011-01-10到2011-01-10,认为服务为一天
        int endD = calS.get(Calendar.DATE) + 1;
        int endDayOfMonth = calS.getActualMaximum(Calendar.DAY_OF_MONTH);

        StringBuilder sBuilder = new StringBuilder();
        if (endDate.compareTo(startDate) < 0) {
            return sBuilder.append("过期").toString();
        }
        int lday = endD - startD;
        if (lday < 0) {
            endM = endM - 1;
            lday = startDayOfMonth + lday;
        }
        //处理天数问题,如:2011-01-01 到	2013-12-31 	2年11个月31天     实际上就是3年
        if (lday == endDayOfMonth) {
            endM = endM + 1;
            lday = 0;
        }
        int mos = (endY - startY) * 12 + (endM - startM);
        int lyear = mos / 12;
        int lmonth = mos % 12;
        if (lyear > 0) {
            sBuilder.append(lyear + "年");
        }
        if (lmonth > 0) {
            sBuilder.append(lmonth + "个月");
        }
       // if(lyear==0)//满足项目需求 满一年不显示天数
        if (lday > 0) {
            sBuilder.append(lday + "天");
        }
        return sBuilder.toString();
    }

    /*
     * 转换 dataAndTime 2013-12-31 23:59:59 到
     * date 2013-12-31
     */
    public static String getDate(String dateAndTime) {
        if (dateAndTime != null && !"".equals(dateAndTime.trim())) {
            Matcher m = p.matcher(dateAndTime);
            if (m.find()) {
                return dateAndTime.subSequence(m.start(), m.end()).toString();
            }
        }
        return "data error";
    }
}

  

相关推荐:

Python 3中如何对两个DataFrame求差集_使用isin配合~取反

isin配合~是求DataFrame差集最直接的方式,因其支持基于列或索引的成员判断并取反筛选,不依赖索引对齐且比merge更轻量,但需注意空值处理、类型一致及大表性能优化。 为什么isin配合~是求DataFrame差集最直接的方式 因为DataFrame本身没有内置的difference方法,而...

Python如何比对两个文件的内容差异_使用difflib库生成对比报告

difflib是Python标准库中轻量可控的文件差异比对工具,支持unified_diff生成类git文本差异、HtmlDiff生成HTML报告,但需手动处理编码、换行符、空白等细节,大文件需谨慎使用。 直接比对两个文件内容差异,difflib是Python标准库里最轻量、最可控的选择;但别指望它...

如何在 Django 模型中正确比较两个整数字段

本文详解Django模型中整数字段比较失败的常见原因(尤其是误将模型字段传入MaxValueValidator导致的TypeError),并提供安全、符合Django最佳实践的解决方案:使用CheckConstraint实现数据库级校验,同时确保模型方法(如available_slots_left)...

Python如何计算两个日期之间的精确差值_利用timedelta类实现

结论:timedelta的days和seconds不等于总小时数,因其将时间差拆分为整数天、剩余秒数和微秒数,且不提供hours属性;正确方式是用total_seconds()计算总秒数再换算。 直接说结论:用datetime配合timedelta可以算出两个日期之间的天数、秒数、微秒数,但“精确到...