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

Flutter中如何将24小时制TimeOfDay转换为12小时制

问题分析与解决方案

你的代码问题出在用12小时制格式解析24小时制的小时值:DateFormat("hh:mm")是12小时制的解析规则,当传入超过12的小时数(比如13、14)时,会被错误转换为12小时制的数值,导致后续格式化出的AM/PM标识异常甚至缺失。

修正方案一:通过DateTime正确转换

直接基于当前日期创建包含选择时间的DateTime实例,再用12小时制格式格式化:

if (time != null) {
  setState(() {
    // 用当前年月日+选择的时分,构建正确的24小时制DateTime
    DateTime selectedTime = DateTime(
      DateTime.now().year,
      DateTime.now().month,
      DateTime.now().day,
      time.hour,
      time.minute,
    );
    // 用12小时制带AM/PM的格式格式化
    var dateFormat = DateFormat("h:mm a");
    controller.text = dateFormat.format(selectedTime);
  });
}

修正方案二:直接通过TimeOfDay计算AM/PM

无需依赖DateTime,直接通过hour值判断时段:

if (time != null) {
  setState(() {
    String period = time.hour >= 12 ? 'PM' : 'AM';
    int hour12 = time.hour % 12;
    // 特殊处理0点(转为12AM)和12点(保持12PM)
    hour12 = hour12 == 0 ? 12 : hour12;
    // 分钟补零,保证格式统一(比如5分显示为05)
    String minuteStr = time.minute.toString().padLeft(2, '0');
    controller.text = '$hour12:$minuteStr $period';
  });
}

原代码问题详解

当你用time.hour.toString() + ":" + time.minute.toString()拼接成字符串,再用DateFormat("hh:mm")解析时:

  • 若选择13点,hh会把13解析为1(12小时制的1点),生成的DateTime是凌晨1点,格式化后显示AM,和实际选择的下午1点不符;
  • 若选择0点(午夜),解析后是12点AM,部分场景下可能因解析逻辑的隐性错误导致AM标识缺失;
  • 这种解析方式完全违背了showTimePicker返回的24小时制TimeOfDay的设计逻辑,必然出现格式转换异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 13:13:16