有时我们需要根据数据库中的日期,比如创建年月create_date,计算这条数据已经创建多久(多少年),
目前我们是在jdk1.7环境下开发的,就先以此举例

获取Date类型日期值

我们存在数据表中的数据类型是varchar,这里先做个转化,获取Date(java.util.Date)类的值

// 假设TimeUtils工具类提供的parseDate方法签名类似于:public static Date parseDate(String dateStr, String pattern)
    public static Date convertStringToDate(String dateString) throws ParseException {
        // 定义所有可能的日期格式
        String[] patterns = {"yyyy/MM", "yyyy.MM", "yyyy-MM"};

        // 遍历所有格式尝试解析
        for (String pattern : patterns) {
            try {
                // 使用TimeUtils工具类的parseDate方法尝试解析
                Date date = TimeUtils.parseDate(dateString, pattern);
                if (date != null) {
                    return date;
                }
            } catch (ParseException ignored) {
                // 如果当前格式不匹配,继续尝试下一个格式
            }
        }

        // 如果所有格式都无法解析,抛出异常
        throw new ParseException("无法解析日期字符串为Date对象", 0);
    }

然后根据获取的Date值,计算跟当前日期相差多少年

public static int calculateYearsSince(Date inputDate) {
        // 获取当前日期
        Calendar currentDate = Calendar.getInstance();
        int currentYear = currentDate.get(Calendar.YEAR);
        int currentMonth = currentDate.get(Calendar.MONTH)+1; // 注意Java Calendar的月份是从0开始的

        // 将输入的Date转换为Calendar以便获取年月信息
        Calendar inputCalendar = Calendar.getInstance();
        inputCalendar.setTime(inputDate);
        int inputYear = inputCalendar.get(Calendar.YEAR);
        int inputMonth = inputCalendar.get(Calendar.MONTH);

        // 计算相差的完整月份数
        int monthsDiff = (currentYear - inputYear) * 12 + (currentMonth - inputMonth);
    
        // 根据相差月份判断年份
        return monthsDiff <6 ?0:(monthsDiff + 6) / 12; // 向上取整,保证超过半年算一年       

测试

public static void main(String[] args) throws Exception {
        // 假设输入的日期字符串格式为"yyyy-MM"
        Date inputDate = convertStringToDate("2010-01");

        int yearsSince = calculateYearsSince(inputDate);
        System.out.println("距离 " + sdf.format(inputDate) + " 已经过了大约 " + yearsSince + " 年");
    }
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐