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

Flutter 计算两个12小时制时间字符串的时间差 现有代码结果异常求助

问题原因

  • 时间格式化串配置错误:解析带AM/PM标记的12小时制时间,必须在格式串中添加a标记匹配上下午标识,原代码使用hh:mm格式无法识别后缀的AM/PM,导致10:00AM和10:00PM都会被错误解析为同一天的10:00,是差值计算错误的核心原因。
  • 计算逻辑冗余且易出错:原代码将解析后的时间转为HH:mm字符串再拆分计算差值,额外增加了分钟借位等边界问题的处理成本,不需要多步转换即可直接计算时间差。

修正后的代码

import 'package:intl/intl.dart';

void main() {
  // 配置支持12小时制+AM/PM解析的格式化器
  DateFormat df = DateFormat("hh:mm a");

  // 示例1:10:00AM 和 01:00PM
  DateTime startTime = df.parse("10:00AM");
  DateTime endTime = df.parse("01:00PM");
  Duration diff = endTime.difference(startTime);
  // 取绝对值适配跨天差值计算场景
  int hourDiff = diff.inHours.abs();
  print(hourDiff); // 输出3,符合预期

  // 示例2:10:00AM 和 10:00PM
  startTime = df.parse("10:00AM");
  endTime = df.parse("10:00PM");
  diff = endTime.difference(startTime);
  hourDiff = diff.inHours.abs();
  print(hourDiff); // 输出12,符合预期
}

补充说明

如果需要保留时间先后的正负标识(比如结束时间早于开始时间返回负差值),去掉.abs()即可;如果需要计算带分钟的精确差值,可以直接使用Duration对象的相关属性获取对应精度的结果,无需手动处理时分的借位逻辑。

内容的提问来源于stack exchange,提问作者rameez khan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 17:27:04