You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

计算ISO格式指定时间与当前时间的天数差

问题分析与解决方案

原代码的核心错误

你的代码计算错误的根源是日期格式字符串完全错误,导致SimpleDateFormat解析出了错误的日期:

  • YYYY 代表「基于周的年份」,不是日常用的公历年份,应该用 yyyy
  • DD 代表「年中的第几天」,不是月份里的日期,应该用 dd
  • hh 是12小时制格式,你的时间是16点(24小时制),应该用 HH
  • 毫秒部分应该用 SSS 匹配三位毫秒值,而不是 ss.s
  • 时区偏移格式 -06:00 应该用 XXX 来匹配,而不是 -hh:mm

另外,直接用毫秒差值除以一天的毫秒数的方式不可靠,会忽略夏令时切换、时区差异等问题,导致天数计算不准确。


推荐解决方案:使用Java 8+的java.time API

Java 8引入的java.time包是专门处理日期时间的标准库,比旧的Date/SimpleDateFormat更可靠、易用,完全适配ISO格式的日期字符串。

代码实现

import java.time.OffsetDateTime;
import java.time.temporal.ChronoUnit;

public class Utility {
    public static long getTimeDifferenceInDays(String timestamp) {
        // 直接解析ISO格式的偏移日期时间,无需指定格式
        OffsetDateTime targetDateTime = OffsetDateTime.parse(timestamp);
        // 获取当前的偏移日期时间(和系统时区一致)
        OffsetDateTime currentDateTime = OffsetDateTime.now();
        // 计算两个日期之间的天数差
        return ChronoUnit.DAYS.between(targetDateTime, currentDateTime);
    }

    public static void main(String[] args) {
        long days = Utility.getTimeDifferenceInDays("2021-01-14 16:23:46.217-06:00");
        System.out.println(days);
    }
}

说明

  1. OffsetDateTime.parse() 可以直接解析你的ISO格式字符串(包含时区偏移),不需要手动指定格式,避免格式符错误
  2. ChronoUnit.DAYS.between() 会准确计算两个日期时间之间的完整天数,自动处理时区、夏令时等特殊情况
  3. 返回值用long类型更安全,避免天数过大导致int溢出

如果你必须使用旧的SimpleDateFormat(不推荐)

如果因为项目限制必须用旧API,先修正格式字符串,再用Calendar来计算天数:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

public class Utility {
    // 修正后的格式字符串
    private static final String CORRECT_TIMESTAMP_FORMAT = "yyyy-MM-dd HH:mm:ss.SSSXXX";

    public static int getTimeDifferenceInDays(String timestamp) {
        SimpleDateFormat df = new SimpleDateFormat(CORRECT_TIMESTAMP_FORMAT);
        // 设置时区(可选,但建议明确设置,避免系统时区影响)
        df.setTimeZone(TimeZone.getTimeZone("UTC"));
        try {
            Date targetDate = df.parse(timestamp);
            Date currentDate = new Date();

            Calendar targetCal = Calendar.getInstance();
            targetCal.setTime(targetDate);
            Calendar currentCal = Calendar.getInstance();
            currentCal.setTime(currentDate);

            // 计算天数差
            long diffMillis = currentCal.getTimeInMillis() - targetCal.getTimeInMillis();
            return (int) (diffMillis / (1000 * 60 * 60 * 24));
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return 0;
    }
}

注意:这种方式依然存在时区、夏令时的潜在问题,还是优先推荐java.time API。

内容的提问来源于stack exchange,提问作者saket kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 02:25:38