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

Android提取子字符串、UTC转本地日期时方法抛出异常求助

针对您遇到的两个Android技术问题的解决方案

问题1:Android中提取子字符串时抛出异常

这种情况最常触发的是IndexOutOfBoundsException,大概率是你调用substring(int start, int end)时参数不符合规则:比如start小于0、end超过字符串实际长度,或者start的数值大于end。

给你几个实用的解决思路:

  • 先做边界合法性校验:调用子串方法前,先把索引修正到合理范围内,比如:
    String original = "your target string";
    int start = 3;
    int end = 12;
    
    // 修正索引到有效范围
    start = Math.max(0, start);
    end = Math.min(original.length(), end);
    if (start <= end) {
        String subStr = original.substring(start, end);
    } else {
        // 处理索引不合法的情况,比如返回空字符串或提示错误
    }
    
  • 用Android自带的安全工具类:TextUtils.substring()会自动处理边界问题,哪怕索引越界也不会抛异常,而是返回合理结果(比如空字符串或截断到有效范围):
    String subStr = TextUtils.substring(original, start, end);
    

问题2:UTC日期转本地日期时抛出IndexOutOfBoundsException

这个异常一般出现在手动截取日期字符串或者日期格式与输入字符串不匹配的场景里。比如你可能写了str.substring(0, 10)这类代码,但输入的UTC字符串长度不足10,直接就会触发越界错误。

推荐用标准的日期格式化API处理,避免手动操作字符串:

方案1:使用SimpleDateFormat(兼容低版本Android)

public String convertUtcToLocal(String utcDateStr) {
    // 定义UTC日期格式,要和输入字符串格式完全匹配
    SimpleDateFormat utcFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.getDefault());
    utcFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
    
    // 定义本地日期输出格式
    SimpleDateFormat localFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
    localFormat.setTimeZone(TimeZone.getDefault());
    
    try {
        Date date = utcFormat.parse(utcDateStr);
        return localFormat.format(date);
    } catch (ParseException e) {
        e.printStackTrace();
        return "";
    }
}

注意:一定要确保utcDateStr的格式和utcFormat定义的格式完全一致,比如如果你的UTC字符串是2024-05-20 14:30:00 UTC,那格式就要改成"yyyy-MM-dd HH:mm:ss z"。

方案2:使用Java 8+ DateTime API(Android API 26+,或用ThreeTenABP适配低版本)

如果项目支持API 26以上,或者引入了ThreeTenABP库,用更安全的DateTimeFormatter:

public String convertUtcToLocal(String utcDateStr) {
    DateTimeFormatter utcFormatter = DateTimeFormatter.ISO_INSTANT;
    Instant instant = Instant.from(utcFormatter.parse(utcDateStr));
    ZonedDateTime localZoned = instant.atZone(ZoneId.systemDefault());
    return localZoned.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
}

如果你的原有方法确实是手动截取字符串导致的越界,那一定要先判断字符串长度再操作:

// 错误示例:直接截取可能触发越界
// String datePart = utcDateStr.substring(0, 10);

// 正确做法:先校验长度
String datePart = "";
if (utcDateStr.length() >= 10) {
    datePart = utcDateStr.substring(0, 10);
}

内容的提问来源于stack exchange,提问作者Muhammed Haris

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:32:32