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

如何解决Flutter中使用intl包时出现的Hms格式解析错误?

解决Flutter中时间解析的FormatException错误

错误原因分析

报错FormatException: Trying to read HH from at 0的核心原因:

  • 传入DateFormat.parse()的字符串为空,大概率是widget.cPrayerTime的值为空字符串。
  • 代码存在冗余的时间转换:把当前时间now转成字符串再解析回DateTime,既浪费性能还可能引入额外问题。
  • DateFormat.parse()是同步方法,不需要用await修饰。

修正方案

1. 校验输入合法性

确保widget.cPrayerTime是符合HH:mm:ss格式的非空字符串,提前拦截非法输入避免解析失败。

2. 简化时间处理逻辑

直接使用DateTime对象计算差值,去掉多余的字符串转换步骤,同时将祈祷时间绑定到当前日期,避免日期不匹配导致的差值错误。

修正后的代码

void reminingTimeDiff() {
  DateTime now = DateTime.now();
  
  // 校验祈祷时间的格式和非空性
  if (widget.cPrayerTime.isEmpty || !RegExp(r'^\d{2}:\d{2}:\d{2}$').hasMatch(widget.cPrayerTime)) {
    print("祈祷时间格式错误或为空,请检查widget.cPrayerTime的值");
    return;
  }
  
  // 解析祈祷时间,并绑定到当前日期
  DateTime prayerTime = DateFormat("HH:mm:ss").parse(widget.cPrayerTime);
  prayerTime = DateTime(now.year, now.month, now.day, prayerTime.hour, prayerTime.minute, prayerTime.second);
  
  Duration diff = prayerTime.difference(now);
  
  // 若差值为负,说明祈祷时间是次日的,补24小时
  if (diff.inSeconds < 0) {
    diff = diff + Duration(hours: 24);
  }
  
  setState(() {
    reminingTime = diff;
  });
}

关键修正点说明

  • 新增格式校验:用正则表达式判断widget.cPrayerTime是否符合HH:mm:ss格式,提前拦截非法输入。
  • 移除多余异步:DateFormat.parse()是同步方法,无需await,也不需要把方法标记为async。
  • 绑定当前日期:解析后的祈祷时间默认是1970年1月1日,绑定到当前日期后,差值计算更准确。
  • 去掉冗余转换:直接使用now对象计算差值,避免字符串转DateTime的额外开销。

内容的提问来源于stack exchange,提问作者Afthal Ad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 11:20:33